Jump to content

[1.7.2] Custom GUI and Implementing IInventory


loawkise

Recommended Posts

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

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