Posted January 20, 201312 yr I have a tile entity/container for a block and I want to be able to restrict what can go in its inventory slot to a specific item in my mod, but for the life of me I cannot figure out how. I also have it so that shift clicking crashes the game (not supposed to happen ) and I can see that I need to have something like public boolean mergeItemStack(itemStack, start, end, backwards) But I don't know exactly where to put it and what it does. Here is my tile entity class package archangel.necromancy.tileentity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import archangel.necromancy.lib.Strings; public class TileAltar extends TileNC implements IInventory { // Then create a ItemStack array (I.E. ItemStack[]) private ItemStack[] inventory; // Then create a super constructor and give the inventory the amount of // ItemStacks you want (Slots), // I.E. (for 1 slot: inventory = new ItemStack[1];, for 5 slots: inventory = // new ItemStack[5] public TileAltar() { inventory = new ItemStack[1]; } // This returns the inventory size @Override public int getSizeInventory() { return inventory.length; } // This returns the stack that is in the slot you picked // This has 1 param // @param int slotIndex is just the index you selected @Override public ItemStack getStackInSlot(int slotIndex) { return inventory[slotIndex]; } // This sets the slots contents, it has 2 params // @param int slot, this is the slots number // @param ItemStack stack, this is the stack you want to add @Override public void setInventorySlotContents(int slot, ItemStack stack) { inventory[slot] = stack; // This checks to make sure the stack is not nothing, and then makes // sure the stack is not going over the limit // Of the stack if (stack != null && stack.stackSize > getInventoryStackLimit()) { stack.stackSize = getInventoryStackLimit(); } } // This decreases the stack size // It has 2 params // @param int slotIndex, this is the slot number // @param int amount, this is the amount you want to decreases by @Override public ItemStack decrStackSize(int slotIndex, int amount) { // This gets the stack with the slot number you want ItemStack stack = getStackInSlot(slotIndex); // Then it checks to make sure it has something in it if (stack != null) { // Then it checks to make sure that it has something that is equal // or lesser than the amount you want to add if (stack.stackSize <= amount) { setInventorySlotContents(slotIndex, null); } else { stack = stack.splitStack(amount); if (stack.stackSize == 0) { setInventorySlotContents(slotIndex, null); } } } // Then it returns the stack return stack; } // This returns the stack in the slot you chose // It has 1 param // @param int slotIndex this is the slot number you choose to get @Override public ItemStack getStackInSlotOnClosing(int slotIndex) { // This gets the stack in the slot you chose ItemStack stack = getStackInSlot(slotIndex); // This checks to make sure it has something in it if (stack != null) { setInventorySlotContents(slotIndex, null); } // Then it returns the stack return stack; } // This gets the inventory's stack limit // This is normally 64 but on some conditions it is something lower @Override public int getInventoryStackLimit() { return 1; } // Basically this makes sure the player is not to far away to activate the // block and, makes sure its the Entity you are // Selecting @Override public boolean isUseableByPlayer(EntityPlayer player) { return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) == this && player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; } // A dummy, mostly un-used method, for a check to do something when you open // the Gui @Override public void openChest() { } // Another dummy, mostly un-used method, for a check to do something when // you close the Gui @Override public void closeChest() { } @Override public void readFromNBT(NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); NBTTagList tagList = tagCompound.getTagList("Inventory"); for (int i = 0; i < tagList.tagCount(); i++) { NBTTagCompound tag = (NBTTagCompound) tagList.tagAt(i); byte slot = tag.getByte("Slot"); if (slot >= 0 && slot < inventory.length) { inventory[slot] = ItemStack.loadItemStackFromNBT(tag); } } } @Override public void writeToNBT(NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); NBTTagList itemList = new NBTTagList(); for (int i = 0; i < inventory.length; i++) { ItemStack stack = inventory; if (stack != null) { NBTTagCompound tag = new NBTTagCompound(); tag.setByte("Slot", (byte) i); stack.writeToNBT(tag); itemList.appendTag(tag); } } tagCompound.setTag("Inventory", itemList); } // This returns the inventory's name @Override public String getInvName() { return "container." + Strings.ALTAR_NAME; } } and the container class package archangel.necromancy.inventory; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import archangel.necromancy.tileentity.TileAltar; public class ContainerAltar extends Container { private TileAltar altar; public ContainerAltar(InventoryPlayer inventoryPlayer, TileAltar altar) { // Set the instance of the TileAltar for the container this.altar = altar; // Add the book slot to the container this.addSlotToContainer(new Slot(altar, 0, 56, 17)); // Add the player's inventory slots to the container for (int inventoryRowIndex = 0; inventoryRowIndex < 3; ++inventoryRowIndex) { for (int inventoryColumnIndex = 0; inventoryColumnIndex < 9; ++inventoryColumnIndex) { this.addSlotToContainer(new Slot(inventoryPlayer, inventoryColumnIndex + inventoryRowIndex * 9 + 9, 8 + inventoryColumnIndex * 18, 94 + inventoryRowIndex * 18)); } } // Add the player's action bar slots to the container for (int actionBarSlotIndex = 0; actionBarSlotIndex < 9; ++actionBarSlotIndex) { this.addSlotToContainer(new Slot(inventoryPlayer, actionBarSlotIndex, 8 + actionBarSlotIndex * 18, 152)); } } public boolean canInteractWith(EntityPlayer player) { return true; } @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot) { ItemStack stack = null; Slot slotObject = (Slot) inventorySlots.get(slot); // null checks and checks if the item can be stacked (maxStackSize > 1) if (slotObject != null && slotObject.getHasStack()) { ItemStack stackInSlot = slotObject.getStack(); stack = stackInSlot.copy(); // merges the item into player inventory since its in the tileEntity if (slot < 9) { if (!this.mergeItemStack(stackInSlot, 9, 45, true)) { return null; } } // places it into the tileEntity is possible since its in the player // inventory else if (!this.mergeItemStack(stackInSlot, 0, 9, false)) { return null; } if (stackInSlot.stackSize == 0) { slotObject.putStack(null); } else { slotObject.onSlotChanged(); } if (stackInSlot.stackSize == stack.stackSize) { return null; } slotObject.onPickupFromSlot(player, stackInSlot); } return stack; } }
January 20, 201312 yr Author I figured it out and fixed the shift right click crash I use @Override public ItemStack transferStackInSlot(EntityPlayer entityPlayer, int slot) { Slot slotObject = (Slot) inventorySlots.get(slot); if(slotObject != null && slotObject.getHasStack()) { ItemStack stackInSlot = slotObject.getStack(); ItemStack stack = stackInSlot.copy(); if(slot <= 1) { if(!mergeItemStack(stackInSlot, 2, inventorySlots.size(), true)) return null; } else if(slot != 1 && stack.itemID == ModItems.necronomicon.itemID && !getSlot(0).getHasStack()) { ItemStack copy = slotObject.decrStackSize(1); getSlot(0).putStack(copy); return null; } else { return null; } if(stackInSlot.stackSize == 0) slotObject.putStack(null); else slotObject.onSlotChanged(); return stack; } return null; } But I don't entirely understand it and I still cannot restrict ONLY allowing a specific item into the slot
January 20, 201312 yr Author NINJA EDIT I figured it all out. The solution is to create a custom slot (non vanilla slot) and specify it in the class to only allow said items example package archangel.necromancy.inventory; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import archangel.necromancy.item.ModItems; public class SlotNecronomicon extends Slot { public SlotNecronomicon(IInventory inventory, int par2, int par3, int par4) { super(inventory, par2, par3, par4); } @Override public boolean isItemValid(ItemStack itemstack) { return itemstack.itemID == ModItems.necronomicon.itemID; } @Override public int getSlotStackLimit() { return 1; } } the slot inside container class // Add the book slot to the container this.addSlotToContainer(new SlotNecronomicon(altar, 0, 56, 17));
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.