Posted July 7, 201411 yr I am wanting to create a custom inventory for my custom entity. I have begun by implementing IInventory and have added the unimplemented methods. I am using the wiki tutorial for help (http://www.minecraftforge.net/wiki/Containers_and_GUIs) but I have some methods that aren't entirely the same, plus the wiki doesn't explain a whole lot so some of my code is giving me errors. It hasn't used these methods, so I don't know what they are used for/how to use them: @Override public boolean hasCustomInventoryName() { return false; } @Override public void markDirty() { } @Override public void openInventory() { //It has got openChest() } @Override public void closeInventory() { //and closeChest() so I am wondering if they are the same } @Override public boolean isItemValidForSlot(int var1, ItemStack var2) { return false; } None of those appear on the wiki tutorial but these ones do, however I don't know how to use them correctly as there is no explanation. @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 < inv.length) { inv[slot] = ItemStack.loadItemStackFromNBT(tag); } } } @Override public void writeToNBT(NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); NBTTagList itemList = new NBTTagList(); for (int i = 0; i < inv.length; i++) { ItemStack stack = inv[i]; if (stack != null) { NBTTagCompound tag = new NBTTagCompound(); tag.setByte("Slot", (byte) i); stack.writeToNBT(tag); itemList.appendTag(tag); } } tagCompound.setTag("Inventory", itemList); } If anyone could explain some of this it would be highly appreciated as it is my first time trying to make a custom inventory.
July 7, 201411 yr Also you can use InventoryBasic. MyInventory.java public class MyInventory extends InventoryBasic { public MyInventory(String name, int slots) { super(name, false, slots); } } MyEntity.java public class MyEntity extends EntityLiving implements IInvBasic { public MyInventory gear; public MyEntity(World world) { super(world); //other inits setupInventory(); this.gear.setInventorySlotContents(0, new ItemStack(Items.apple)); this.gear.setInventorySlotContents(1, new ItemStack(Items.carrot)); } private void setupInventory() { MyInventory gear1 = this.gear; this.gear = new MyInventory("MyInventory", howManySlots()); this.gear.func_110133_a(this.getCommandSenderName()); if (gear1 != null) { gear1.func_110132_b(this); int i = Math.min(gear1.getSizeInventory(), this.gear.getSizeInventory()); for (int j = 0; j < i; ++j) { ItemStack itemstack = gear1.getStackInSlot(j); if (itemstack != null) { this.gear.setInventorySlotContents(j, itemstack.copy()); } } gear1 = null; } this.gear.func_110134_a(this); } public int howManySlots() { return this.getType() == 10; } public void onDeath(DamageSource ds) { super.onDeath(ds); if (gear != null && !this.worldObj.isRemote) { //drop all items for (int i = 0; i < gear.getSizeInventory(); ++i) { ItemStack itemstack = gear.getStackInSlot(i); if (itemstack != null) { this.entityDropItem(itemstack, 0.0F); } } } } public void writeEntityToNBT(NBTTagCompound com) { NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.gear.getSizeInventory(); ++i) { ItemStack itemstack = this.gear.getStackInSlot(i); if (itemstack != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte) i); itemstack.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } com.setTag("Items", nbttaglist); } } public void readEntityFromNBT(NBTTagCompound com) { NBTTagList nbttaglist = com.getTagList("Items", 10); this.setupGear(); for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); int j = nbttagcompound1.getByte("Slot") & 255; if (j >= 0 && j < this.gear.getSizeInventory()) { this.gear.setInventorySlotContents(j, ItemStack.loadItemStackFromNBT(nbttagcompound1)); } } } public void onInventoryChanged(InventoryBasic inv) {} //and other methods } This is entity inventory part.
July 7, 201411 yr Author Oh, I will take a look at this and get back to you. I saw this before but couldn't find much on it. Thanks
July 7, 201411 yr I created and tested pig with inventory for you MyEntity: public class MyEntity extends EntityPig implements IInvBasic { public MyInventory gear; public MyEntity(World world) { super(world); this.setupGear(); this.gear.setInventorySlotContents(0, new ItemStack(Items.apple)); this.gear.setInventorySlotContents(1, new ItemStack(Items.carrot)); } public int howManySlots() { return 8; } private void setupGear() { MyInventory gear1 = this.gear; this.gear = new MyInventory("MyInventory", howManySlots()); this.gear.func_110133_a(this.getCommandSenderName()); if (gear1 != null) { gear1.func_110132_b(this); int i = Math.min(gear1.getSizeInventory(), this.gear.getSizeInventory()); for (int j = 0; j < i; ++j) { ItemStack itemstack = gear1.getStackInSlot(j); if (itemstack != null) { this.gear.setInventorySlotContents(j, itemstack.copy()); } } gear1 = null; } this.gear.func_110134_a(this); } public void onDeath(DamageSource ds) { super.onDeath(ds); if (gear != null && !this.worldObj.isRemote) { for (int i = 0; i < gear.getSizeInventory(); ++i) { ItemStack itemstack = gear.getStackInSlot(i); if (itemstack != null) { this.entityDropItem(itemstack, 0.0F); } } } } public void writeEntityToNBT(NBTTagCompound com) { NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.gear.getSizeInventory(); ++i) { ItemStack itemstack = this.gear.getStackInSlot(i); if (itemstack != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte) i); itemstack.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } com.setTag("Items", nbttaglist); } } public void readEntityFromNBT(NBTTagCompound com) { NBTTagList nbttaglist = com.getTagList("Items", 10); this.setupGear(); for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); int j = nbttagcompound1.getByte("Slot") & 255; if (j >= 0 && j < this.gear.getSizeInventory()) { this.gear.setInventorySlotContents(j, ItemStack.loadItemStackFromNBT(nbttagcompound1)); } } } @Override public boolean interact(EntityPlayer player) { super.interact(player); if(!player.worldObj.isRemote)player.openGui(Core.instance, 5, this.worldObj, this.getEntityId(), 0, 0); //we will use x coord for sending entityId return true; } public void onInventoryChanged(InventoryBasic inv) {} } MyInventory: public class MyInventory extends InventoryBasic { public MyInventory(String name, int slots) { super(name, false, slots); } } MyContainer: public class MyContainer extends Container { protected IInventory gear; private int player_inventory_x = 70; private int player_inventory_y = 8; private int loot_x = 8; private int loot_y = 10; public MyContainer (InventoryPlayer inventoryPlayer, IInventory c){ gear = c; { int isize = c.getSizeInventory(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 2; j++) { addSlotToContainer(new Slot(c, j + i * 2, (loot_x + j * 18), (loot_y + i * 18))); } } } bindPlayerInventory(inventoryPlayer); } public boolean canInteractWith(EntityPlayer player) { return gear.isUseableByPlayer(player); } protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 9; j++) { addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, player_inventory_x + j * 18, player_inventory_y + i * 18)); } } for (int i = 0; i < 9; i++) { addSlotToContainer(new Slot(inventoryPlayer, i, player_inventory_x + i * 18, player_inventory_y + 54 + 4)); } } public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) { ItemStack itemstack = null; Slot slot = (Slot)this.inventorySlots.get(par2); if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); int s = gear.getSizeInventory(); if (par2 < s) { if (!this.mergeItemStack(itemstack1, s, this.inventorySlots.size(), true)) { return null; } } else if (!this.mergeItemStack(itemstack1, 0, s, false)) { return null; } if (itemstack1.stackSize == 0) { slot.putStack(null); } else { slot.onSlotChanged(); } } return itemstack; } public void onContainerClosed(EntityPlayer par1EntityPlayer) { super.onContainerClosed(par1EntityPlayer); this.gear.closeInventory(); } } MyEntityGui: public class MyEntityGui extends GuiContainer { private static final ResourceLocation txtr = new ResourceLocation(your ModID in Assets:path/to/testgui.png); private int invW = 176; private int invH = 90; private int lootH = 90; private int lootW = 50; public MyEntityGui(InventoryPlayer inventoryPlayer, MyInventory inv) { super(new MyContainer(inventoryPlayer, inv)); this.xSize=300; this.ySize=90; } protected void drawGuiContainerForegroundLayer(int param1, int param2) {} protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.renderEngine.bindTexture(txtr); int x = (width - invW) / 2; int y = (height - invH) / 2; this.drawTexturedModalRect(x, y, 0, 0, invW, invH); x = (width/ 2)-150; y = (height - lootH) / 2; this.drawTexturedModalRect(x, y, 176, 0, lootW, lootH); } } GuiHandler: public class GuiHandler implements IGuiHandler { @Override public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { if(id==5){ Entity ent = world.getEntityByID(x); if(ent!=null && ent instanceof MyEntity){ return new MyContainer(player.inventory, ((MyEntity)ent).gear); }} return null; } @Override public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { if(id==5){ Entity ent = world.getEntityByID(x); if(ent!=null && ent instanceof MyEntity){ return new MyEntityGui(player.inventory, new MyInventory("MyInventory", ((MyEntity) ent).howManySlots())); }} return null; } } And add this to your main mod class: @EventHandler public void load(FMLInitializationEvent event) { EntityRegistry.registerGlobalEntityID(MyEntity.class, "MyEntity", 151, 52, 89); //creates dark-blue egg to spawn entity EntityRegistry.registerModEntity(MyEntity.class, "MyEntity", 151, this, 64, 1, true); NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler()); } testgui.png: screens:
July 7, 201411 yr Author I have it all working thank you. I will now get to work studying and learning exactly what is going on so I can adapt and create my own
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.