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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hey today I was trying to play in 1.21 modpack that I made on fabric (my version of fabric is in 0.16.0) with this list of mods : - Entity Model Features (by traben_0) - Entity Texture Features (by traben_0) - Advanced Chat (by Wesley8081) - Ambient Environment (by Jaredlll08) - Ambient Souds 6 (by CreativeMD) - Animatica (by FoundationGames) - Armor Statues (by Fuzs) - Auto HUD (by Crendgrim) - Bad Packets (by badasintended) - Balm (by BlayTheNinth) - Better Beds (by Motschen) - Better Chunk Loading (by someaddon) - Better Compatibility Checker (by Gaz-) - Better FPS [Render Distance] (by someaddon) - Better Ping Display (by Quintinity) - Better Statistics Screen (by TheCSDev) - Better Armor HUD (by efekos) - Better F3 ( by cominixo) - Blur + (by Motschen) - Bobby (by Johni0702) - Cat Jam (by shmove) - Catalogue (by MrCrayfish) - Chat Heads (by dzwdz) - Cherished Worlds (by TheIllusiveC4) - Chunk Sending (by someaddon) - Chunks Fade In (by kerudion) - Chunky (by pop4959) - Cloth Config (by shedaniel) - Clumps (by Jaredlll08) - Cobweb (CrystalSpider) - Collective (by Serilum) - Configured (by MrCrayfish) - Connectivity (by someaddon) - Continuity (by Pepper_Bell) - Creative Core (by CreativeMD) - Cupboard (by someaddon) - Cut Through (by Fuzs) - Dark Loading Screen (by Neecko5b84) - Debugify (by XanderIsDev) - Double Doors (by Serilum) - Dynamic FPS (by juliand665) - Dynamic Lights (by Tschipcraft) - Easy Anvils (by Fuzs) - Easy Magic (by Fuzs) - Easy Shulker Boxes (by Fuzs) - Eating Animation (by theone-ss) - Enhanced Attack Indicator (by Mineash) - Enhanced Block Entities (by FoundationGames) - Enhanced Visuals (by CreativeMD) - Entity Culling (by tr7zw) - Environmental Water (by AgentMindStorm) - Essential (by SparkUniverse_) - Extra Thicc Packets (by JaselUmena) - Fabric (by modmuss50) - Fabric Language Kotlin (by modmuss50) - Falling Leaves (by RandomMcSomethin) - Fancy Block Particles (by Hantonik) - Fancy Health Bar (by efekos) - Farsight (by someaddon) - Fast IP Ping (by Fallen_Breath) - Ferrite Core (by  malte0811) - Fish On The Line (by Serilum) - Fix GPU Memory Leak  (by someaddon) - Forge Config API Port (by Fuzs) - FPS Reducer (by bre2el) - Freecam (by hashalite) - Fzzy Config (by fzzyhmstrs) - Get It Together (by bl4ckscor3) - Global Packs (by JTK222) - Harvest With Ease (by CrystalSpider) - Ichuntil Util (by iChun) - Immediately Fast (by RaphilMC) - Immersive UI (by SSKirillSS) - Indium (by comp500) - Inventory HUD+ (by dmitrylovin) - Iris Shaders (by coderbot) - Item Physic Full (by CreativeMD) - Jade (by Snownee) - Journey Map (by techbrew) - Just Enough Breeding (by Christofmeg) - Just Enough Items (by mezz) - Just Enough Professions (by Mrbysco) - Language Reload (by Jerozgen) - Leaves Be Gone (by Fuzs) - Let Me Despawn (by frikinjay) - Let Sleeping Dogs Lie (by iChun) - Lithium (by JellySquid) - Loading Backgrounds (by Lupin) - Mineblock's Repeated Utilities (by itsmineblock11) - Menulogue (by MrCrayfish) - Mob Plaques (by Fuzs) - Mod Menu (by Prospector) - Model Gap Fix (by MehVahdJukaar) - Mouse Tweaks (by YaLTeR) - Nether Portal Fix (by BlayTheNinth) - Nicer Skies (by ztereohype) - Noisium (by Steveplays28) - Not Enough Animations (by tr7zw) - Opti GUI (by opekope2) - Packet Fixer (by TonimatasDEV) - Particle Core (by fzzyhmstrs) - Passive Shields (by Serilum) - Pick Up Notifier (by Fuzs) - Ping Wheel (by LukenSkyne) - Puzzle (by Motschen) - Puzzles LIB (by Fuzs) - Reese's Sodium Options (by FlashyReese) - Resource Pack Overrides (by Fuzs) - Server Country Flags (by khajiitos) - Server Performance (by someaddon) - Skin Layer 3D (by tr7zw) - Sodium (by JellySquid) - Sodium Extra (by FlashyReese) - Sodium Shadowy Path Blocks (by Rynnavinx) - Sound Physics Remastered (by henkelmax) - Sounds (by itsmineblock11) - Spark (by lucko) - Stack Refill (by Serilum) - Structure Essentials (by someaddon) - TCD Commons API (by TheCSDev) - Text Placeholder API (by Patbox) - Villager Names (by Serilum) - Visual Overhaul (by Motschen) - Visual Workbench (by Fuzs) - Visuality (by PinkGoosik) - Wakes (by Goby56) - Wavey Capes (by tr7zw) - YDM'S Weapon Master  (by YourDailyModderx) - Yet Another Config LIB (by XanderIsDev) - Zoomify (by XanderIsDev) And When I load it it work, I can create a world and even let him open forever at least I didn't move cause if so the game just crash and tell me this message :   Encountered an unexpected exception net.minecraft.class_148: Ticking entity at net.minecraft.server.MinecraftServer.method_3813(MinecraftServer.java:1025) at net.minecraft.server.MinecraftServer.method_3748(MinecraftServer.java:912) at net.minecraft.class_1132.method_3748(class_1132.java:114) at net.minecraft.server.MinecraftServer.method_29741(MinecraftServer.java:697) at net.minecraft.server.MinecraftServer.method_29739(MinecraftServer.java:281) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: java.lang.NullPointerException: Cannot invoke "net.minecraft.class_4706.isEmpty()" because "tickets" is null at net.minecraft.class_3204.canNoneExpire(class_3204.java:1034) at net.minecraft.class_3204.handler$dln000$lithium$unregisterExpiringTicket(class_3204.java:1075) at net.minecraft.class_3204.method_17645(class_3204.java:172) at net.minecraft.class_3204.method_17292(class_3204.java:194) at net.minecraft.class_3215.method_17300(class_3215.java:443) at com.betterchunkloading.chunk.PlayerChunkData.checkPrediction(PlayerChunkData.java:406) at com.betterchunkloading.chunk.PlayerChunkData.checkDirection(PlayerChunkData.java:353) at com.betterchunkloading.chunk.PlayerChunkData.trackPlayerMovement(PlayerChunkData.java:177) at com.betterchunkloading.chunk.PlayerChunkData.onChunkChanged(PlayerChunkData.java:130) at com.betterchunkloading.event.EventHandler.onPlayerTick(EventHandler.java:200) at net.minecraft.class_3222.handler$zed000$betterchunkloading$onPlayerTick(class_3222.java:2618) at net.minecraft.class_3222.method_5773(class_3222.java:564) at net.minecraft.class_3218.mixinextras$bridge$method_5773$202(class_3218.java) at net.minecraft.class_3218.wrapOperation$eei000$puzzleslib$tickNonPassenger(class_3218.java:7797) at net.minecraft.class_3218.method_18762(class_3218.java:770) at net.minecraft.class_1937.method_18472(class_1937.java:498) at net.minecraft.class_3218.method_31420(class_3218.java:408) at net.minecraft.class_5574.method_31791(class_5574.java:54) at net.minecraft.class_3218.method_18765(class_3218.java:372) at net.minecraft.server.MinecraftServer.method_3813(MinecraftServer.java:1021) ... 5 more Sorry guys if it obvious but actually I'm an old player of Minecraft but I'm new in modding so yup. But Thanks everyone by advance to help me with this.
    • These forums are for Minecraft Forge, not Fabric. You would probably be better served posting this question wherever fabric support is given, most likely their discord server.
    • Add the new latest.log (logs-folder) with sites like https://mclo.gs/ and paste the link to it here
    • Update: I tried to reproduce the bug and found out that if I place a flare on a block and then dismantle it with the pickarang (Quark), the flare gets no NBT Tag after getting assigned an empty one through the offhand.
  • Topics

×
×
  • Create New...

Important Information

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