Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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.

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.

  • 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 :)

I created and tested pig with inventory for you ;D

 

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:

testgui.png

 

screens:

 

1.png

 

21.png

  • 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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.