Всем всего!
Сделал рюкзак со встроенным верстаком, работает почти все, проблемы только с верстаком. При попытке взять предмет из слота при помощи мыши, он дропается, если кол-во в стаке больше единицы, то дропается один, словно вместо ПКМ тыкаю по "Q".
Буду благодарен за помощь!
Контейнер с инвентарем:
Сделал рюкзак со встроенным верстаком, работает почти все, проблемы только с верстаком. При попытке взять предмет из слота при помощи мыши, он дропается, если кол-во в стаке больше единицы, то дропается один, словно вместо ПКМ тыкаю по "Q".
Буду благодарен за помощь!
Контейнер с инвентарем:
Код:
public class ContainerBag extends Container{
public World world;
public InventoryBag inventory;
public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3);
public IInventory craftResult = new InventoryCraftResult();
public int blockSlot;
public ContainerBag(EntityPlayer player)
{
int yOffset = - 90; // Смещение слотов сумки по вертикали
int craftingXOffset = 162; // Смещение сетки крафта по горизонтали
int craftingYOffset = 30; // Смещение сетки крафта по вертикали
int slotId = 0; // Используется для нумерации слотов сумки
int maxAddedSlotId = 0;
this.world = player.worldObj;
this.inventory = new InventoryBag(player, player.getHeldItem());
// Добавляем 4 ряда слотов по 9 шт в каждом из нашей сумки
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 9; ++j)
{
this.addSlotToContainer(new SlotBag(inventory, slotId, 8 + j * 18, 84 + i * 18 + yOffset));
slotId ++;
maxAddedSlotId ++;
}
}
this.blockSlot = player.inventory.currentItem + slotId + 27;
// Инвентарь вестака: Результат и 9 слотов
for (int l = 0; l < 3; ++l)
{
for (int i1 = 0; i1 < 3; ++i1)
{
this.addSlotToContainer(new Slot(this.craftMatrix, i1 + l * 3, 30 + i1 * 18 + craftingXOffset, 17 + l * 18 + craftingYOffset));
}
}
this.addSlotToContainer(new SlotCrafting(player, this.craftMatrix, this.craftResult, 0, 104 + craftingXOffset, 35 + craftingYOffset));
// Стандартный инвентарь игрока
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 9; ++j)
{
this.addSlotToContainer(new Slot(player.inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
maxAddedSlotId ++;
}
}
for (int i = 0; i < 9; ++i)
{
this.addSlotToContainer(new Slot(player.inventory, i, 8 + i * 18, 142));
maxAddedSlotId ++;
}
if (!player.worldObj.isRemote) EldrichMagic.logger.dev_Message(false, "ListSize = "+this.inventorySlots.size()+"/"+this.inventoryItemStacks.size()+". and max id is "+maxAddedSlotId);
this.inventory.openChest();
}
public void onCraftMatrixChanged(IInventory par1IInventory)
{
this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(this.craftMatrix, this.world));
}
/**
* Callback for when the crafting gui is closed.
*/
@Override
public void onCraftGuiClosed(EntityPlayer player)
{
super.onCraftGuiClosed(player);
this.inventory.saveInventory(this.blockSlot);
if (!world.isRemote)
{
for (int i = 0; i < 9; ++i)
{
ItemStack itemstack = this.craftMatrix.getStackInSlotOnClosing(i);
if (itemstack != null)
{
player.dropPlayerItem(itemstack);
}
}
}
}
@Override
public ItemStack slotClick(int par1, int par2, int par3, EntityPlayer par4EntityPlayer) {
return par1 == this.blockSlot?null:super.slotClick(par1, par2, par3, par4EntityPlayer);
}
@Override
public boolean canInteractWith(EntityPlayer entityplayer) {
// TODO Auto-generated method stub
return true;
}
public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int slotId)
{
return null;
}
public boolean func_94530_a(ItemStack par1ItemStack, Slot par2Slot)
{
return par2Slot.inventory != this.craftResult && super.func_94530_a(par1ItemStack, par2Slot);
}
}
Код:
public class InventoryBag implements IInventory{
public int invSize = 72;
public ItemStack currentBag = null;
public ItemStack[] inventory = new ItemStack[invSize];
public EntityPlayer player;
public InventoryBag(EntityPlayer player, ItemStack currentBag)
{
this.currentBag = currentBag;
this.player = player;
}
@Override
public int getSizeInventory()
{
return this.invSize;
}
@Override
public ItemStack getStackInSlot(int slot)
{
return this.inventory[slot];
}
@Override
public ItemStack decrStackSize(int i, int j)
{
return EmUtils.inventory.decrStackSize(i, j, this.inventory);
}
@Override
public ItemStack getStackInSlotOnClosing(int i)
{
return this.inventory[i];
}
@Override
public void setInventorySlotContents(int i, ItemStack itemstack)
{
this.inventory[i] = itemstack;
}
@Override
public String getInvName()
{
return EmUtils.chat.translateToLocal("inventory.bag.name");
}
@Override
public boolean isInvNameLocalized()
{
return true;
}
@Override
public int getInventoryStackLimit()
{
return 64;
}
@Override
public void onInventoryChanged()
{
}
@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer)
{
return true;
}
@Override
public void openChest() {loadInventory();}
@Override
public void closeChest() {}
public void loadInventory()
{
if (this.currentBag.hasTagCompound())
{
if (this.currentBag.getTagCompound().hasKey("Inventory"))
{
if (this.currentBag.getTagCompound().hasKey("Inventory"))
{
NBTTagList list = this.currentBag.getTagCompound().getTagList("Inventory");
for (int i1 = 0; i1 <= list.tagCount() - 1 && list.tagCount() != 0; i1 ++)
{
NBTTagCompound item = (NBTTagCompound)list.tagAt(i1);
int slot = item.getByte("Slot");
this.inventory[slot] = ItemStack.loadItemStackFromNBT(item);
}
}
}
}
}
public void saveInventory(int slot)
{
if (this.currentBag.hasTagCompound())
{
if (this.currentBag.getTagCompound().hasKey("Inventory"))
this.currentBag.getTagCompound().removeTag("Inventory");
NBTTagList list = new NBTTagList();
for (int i1 = 0; i1 <= this.invSize - 1 && this.inventory.length != 0; i1 ++)
{
if (this.inventory[i1] != null)
{
NBTTagCompound item = new NBTTagCompound();
item.setByte("Slot", (byte)i1);
this.inventory[i1].writeToNBT(item);
list.appendTag(item);
}
}
NBTTagCompound tag = this.currentBag.getTagCompound();
tag.setTag("Inventory", list);
this.currentBag.getTagCompound().setTag("Inventory", list);
this.currentBag.getTagCompound().setBoolean("Opened", false);
ItemStack[] arr$ = this.player.inventory.mainInventory;
int len$ = arr$.length;
for(int i$ = 0; i$ < len$; ++i$) {
ItemStack itemStack = arr$[i$];
if(itemStack != null && itemStack.getItem() instanceof ItemBag && itemStack.getTagCompound().getBoolean("Opened"))
{
EldrichMagic.logger.dev_Message(true, "fgjlgfjvmlrjfcvmlfj");
itemStack.setTagCompound(this.currentBag.getTagCompound());
break;
}
}
EldrichMagic.logger.dev_Message(true, "Helllooo");
}
}
@Override
public boolean isStackValidForSlot(int i, ItemStack itemstack)
{
return true;
}
}