Инвентарь игрока со своими слотами

Версия Minecraft
1.7.10
317
10
Всем привет.. В общем то есть свой Handler, Gui, Container, InventoryPlayer, Slot

Сам инвентарь открывается, в обычных слотах из player.inventory все нормально. Но когда перекладываешь вещь с слота player.inventory в мой инвентарь - то что ложишь умножается на 2. Если предмет не стакается он остается 1 в слоте. При перезаходе в мир вещи остаются в слотах. Но когда пытаешься их забрать - они исчезают. В Gui'шнике нет ничего особенного (его думаю скидывать не имеет смысла)

Container:
Код:
public class ContainerXPlayer extends Container {
	public InventoryCrafting craftMatrix = new InventoryCrafting(this, 2, 2);
	public IInventory craftResult = new InventoryCraftResult();
	private final EntityPlayer thePlayer;
	XInventoryPlayer xInv;
	public ContainerXPlayer(EntityPlayer player, XInventoryPlayer xInv) {
		this.thePlayer = player;
		this.xInv = xInv;
		
		this.addSlotToContainer(new SlotCrafting(player, this.craftMatrix, this.craftResult, 0, 120, 134));

		int i;
		for(i = 0; i < 2; ++i) {
			for(int j = 0; j < 2; ++j) {
				this.addSlotToContainer(new Slot(this.craftMatrix, j + i * 2, 68 + j * 18, 126 + i * 18));
			}
		}

		for(i = 0; i < 9; ++i) {
			this.addSlotToContainer(new Slot(player.inventory, i, 22 + i * 18, 174));
		}
		
		this.addSlotToContainer(new XSlotArmor(player, player.inventory, 36, 148, 141, 3));
		this.addSlotToContainer(new XSlotArmor(player, player.inventory, 37, 148, 84, 2));
		this.addSlotToContainer(new XSlotArmor(player, player.inventory, 38, 148, 27, 1));
		this.addSlotToContainer(new XSlotArmor(player, player.inventory, 39, 148, 6, 0));
		this.addSlotToContainer(new XSlot(player.inventory, 9, 148+16, 45));
		this.addSlotToContainer(new XSlot(player.inventory, 10, 148+16, 63));
		this.addSlotToContainer(new XSlot(player.inventory, 11, 152, 45));
		this.addSlotToContainer(new XSlot(player.inventory, 12, 152, 63));
		
		this.addSlotToContainer(new Slot(player.inventory, 13, 134, 102));
		this.addSlotToContainer(new Slot(player.inventory, 14, 134, 120));
		this.addSlotToContainer(new Slot(player.inventory, 15, 152, 102));
		this.addSlotToContainer(new Slot(player.inventory, 16, 152, 120));
		
		//vest
		this.addSlotToContainer(new Slot(player.inventory, 17, 26, 24));
		this.addSlotToContainer(new Slot(player.inventory, 18, 26, 42));
		this.addSlotToContainer(new Slot(player.inventory, 19, 8, 24));
		this.addSlotToContainer(new Slot(player.inventory, 20, 8, 42));
		this.addSlotToContainer(new Slot(player.inventory, 21, -10, 24));
		this.addSlotToContainer(new Slot(player.inventory, 22, -10, 42));
		
		//backpack slots
		this.addSlotToContainer(new Slot(player.inventory, 23, 26, 81));
		this.addSlotToContainer(new Slot(player.inventory, 24, 8, 81));
		this.addSlotToContainer(new Slot(player.inventory, 25, -10, 81));
		this.addSlotToContainer(new Slot(player.inventory, 26, 26, 99));
		this.addSlotToContainer(new Slot(player.inventory, 27, 8, 99));
		this.addSlotToContainer(new Slot(player.inventory, 28, -10, 99));
		this.addSlotToContainer(new Slot(player.inventory, 29, 26, 117));
		this.addSlotToContainer(new Slot(player.inventory, 30, 8, 117));
		this.addSlotToContainer(new Slot(player.inventory, 31, -10, 117));
		this.addSlotToContainer(new Slot(player.inventory, 32, 4, 135));
		
		this.addSlotToContainer(new Slot(player.inventory, 33, 166, 6));
		this.addSlotToContainer(new XSlotVest(player.inventory, 34, 40, 6));
		this.addSlotToContainer(new XSlotBackpack(player.inventory, 35, 40, 63));

                //Баганные слоты
		this.addSlotToContainer(new XSlot(xInv, 0, 67, 6));
		this.addSlotToContainer(new XSlot(xInv, 1, 67+18, 6));
		this.addSlotToContainer(new XSlot(xInv, 2, 67+18*2, 6));
		this.addSlotToContainer(new XSlot(xInv, 3, 67+18*3, 6));
		
		this.onCraftMatrixChanged(this.craftMatrix);
	}

	public void onCraftMatrixChanged(IInventory par1IInventory) {
		this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(this.craftMatrix, this.thePlayer.worldObj));
	}

	public void onContainerClosed(EntityPlayer par1EntityPlayer) {
		for(int i = 0; i < 4; ++i) {
			ItemStack itemstack = this.craftMatrix.getStackInSlotOnClosing(i);
			if(itemstack != null) {
				par1EntityPlayer.dropPlayerItemWithRandomChoice(itemstack, false);
			}
		}
		//this.thePlayer.inventory.closeInventory();
	}

	public boolean canInteractWith(EntityPlayer player) {
		return true;
	}

	public ItemStack transferStackInSlot(EntityPlayer player, int par2) {
		return null;
	}

	public boolean func_94530_a(ItemStack par1ItemStack, Slot par2Slot) {
		return par2Slot.inventory != this.craftResult && super.func_94530_a(par1ItemStack, par2Slot);
	}
}

InventoryPlayer
Код:
public class XInventoryPlayer implements IInventory {
	public static ItemStack[] is = new ItemStack[4];
	EntityPlayer thePlayer;
	public XInventoryPlayer(EntityPlayer thePlayer) {
		super();
		this.thePlayer = thePlayer;
	}
	
	public void writeEntityToNBT(NBTTagCompound nbt) {
		NBTTagList list = new NBTTagList();
		for(int i = 0; i < this.is.length; i++) {
			if(this.is[i] != null) {
				NBTTagCompound item = new NBTTagCompound();
				item.setByte("Item", (byte) i);
				this.is[i].writeToNBT(item);
				list.appendTag(item);
			}
		}
		nbt.setTag("Slots", list); 
	}

    public void readEntityFromNBT(NBTTagCompound nbt) {
    	NBTTagList list = nbt.getTagList("Slots", 10);
    	this.is = new ItemStack[getSizeInventory()];
    	for(int i = 0; i < list.tagCount(); i++) {
    		NBTTagCompound item = list.getCompoundTagAt(i);
    		byte b = item.getByte("Item");
    		if(b >= 0 && b < this.is.length) {
    			this.is[b] = ItemStack.loadItemStackFromNBT(item);
    		}
    	}
    }
	
	@Override
	public int getSizeInventory() {
		return is.length;
	}
	@Override
	public ItemStack getStackInSlot(int i) {
		return this.is[i];
	}
	@Override
	public ItemStack decrStackSize(int i, int j) {
		if(this.is[i] != null) {
			ItemStack itemstack;
			if(this.is[i].stackSize <= j) {
				itemstack = this.is[i];
				this.is[i] = null;
			} else {
				itemstack = this.is[i].splitStack(j);
				if(this.is[i].stackSize == 0) {
					this.is[i] = null;
				}
			}
			return itemstack;
		}
		return null;
	}
	@Override
	public ItemStack getStackInSlotOnClosing(int i) {
		if(this.is[i] != null) {
			ItemStack itemstack = this.is[i];
			this.is[i] = null;
			return itemstack;
		}
		return null;
	}
	@Override
	public void setInventorySlotContents(int i, ItemStack itemstack) {
		this.is[i] = itemstack;
		if(itemstack != null && itemstack.stackSize > this.getInventoryStackLimit()) {
			itemstack.stackSize = this.getInventoryStackLimit();
		}
	}
	@Override
	public String getInventoryName() {
		return "dayz.player";
	}
	@Override
	public boolean hasCustomInventoryName() {
		return false;
	}
	@Override
	public int getInventoryStackLimit() {
		return 64;
	}
	@Override
	public void markDirty() {}
	@Override
	public boolean isUseableByPlayer(EntityPlayer player) {
		return false;
	}
	@Override
	public void openInventory() {
		NBTTagCompound nbt = NBTUtils.getPlayerData(thePlayer);
		this.readEntityFromNBT(nbt);
	}
	@Override
	public void closeInventory() { 
		NBTTagCompound nbt = NBTUtils.getPlayerData(thePlayer);
		this.writeEntityToNBT(nbt);
	}
	@Override
	public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) {
		return false;
	}
   
}




Slot:

Код:
public class XSlot extends Slot{
	public XSlot(IInventory p_i1824_1_, int p_i1824_2_, int p_i1824_3_, int p_i1824_4_) {
		super(p_i1824_1_, p_i1824_2_, p_i1824_3_, p_i1824_4_);
	}
	
	
	public int getSlotStackLimit() {
		return 64;
	}
	
	public boolean isItemValid(ItemStack par1ItemStack) {
		return true;
	}

}





Handler:

Код:
public class Handler implements IGuiHandler {
	public XInventoryPlayer xInv;
	
	@Override
	public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
		switch(ID) {
		case 0:	
			
		case 1:	
			xInv = new XInventoryPlayer(player);
			//NBTTagCompound nbt = NBTUtils.getPlayerData(player);
			//xInv.readEntityFromNBT(nbt);
			return new ContainerXPlayer(player, xInv);
		}
		
		return null;
	}

	@Override
	public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
		switch(ID) {
		case 0:	
			
		case 1:	
			xInv = new XInventoryPlayer(player);
			//NBTTagCompound nbt = NBTUtils.getPlayerData(player);
			//xInv.readEntityFromNBT(nbt);
			return new GuiXPlayer(player, xInv);
		}
		return null;
	}
}




NBTUtils (откуда я получаю нбт в которое записываю слоты и получаю их в XInventoryPlayer, этот способ рабочий, т.к я с помощью его записываю все что мне надо в игрока):

Код:
public class NBTUtils {
	public static NBTTagCompound getPlayerData(EntityPlayer player){ 
    	NBTTagCompound playerData = player.getEntityData(); 
    	if(!playerData.hasKey(EntityPlayer.PERSISTED_NBT_TAG)){ 
			playerData.setTag(EntityPlayer.PERSISTED_NBT_TAG, new NBTTagCompound()); 
    	} 
		return playerData.getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG); 
	}
}





Всем большое спасибо заранее :)
 
317
10
Я всю ночь копался. Везде ставил дебаг.
Нечего не помогало. На утро. Я просто был ОХРЕНЕННО идиотом.
Все крч сейчас берем и смотрим на переменную is в XInventoryPlayer. И что Вы видете? Там "static" переменная.
А Я ТО ДУМАЮ ЧТО ЗА ХЕРНЯ?
Убрал статик. И КАК ВЫ ДУМАЕТЕ? ВСЕ ЗАРАБОТАЛО.
Извините за то что я запилил вопрос не досмотрев.... Но у меня сейчас правда нервы кипят :C
Всем спасибо
 
Сверху