GUI/GuiHandler/Container/Inventory pour une Entity



  • Salut salut,

    J’essaie de faire un GUI pour mon entity, le soucis c'est que j'en ai jamais fait, j'ai coder quelques trucs en suivant divers tuto sur block et item (rien trouver pour une entité).

    Le soucis c'est que, d'une part, aucune idée si mes code sont correcte et d'autre part, j'ai un soucis sur mon GuiHandler avec des constructeur indefinie, j'ai beau essayer de changer, j'ai toujours des problemes…

    GuiHandler

    public class GuiHandlerClapTrap implements IGuiHandler {
    
        @Override
           public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
        {
    
               if(ID == 0)
               {
    
                   EntityClapTrap entity = (EntityClapTrap)world.getEntityByID(x); // on recup l'entité
    // erreur ci dessous
                   return new ContainerClapTrap(player.inventory, world, entity);     //< ici
    //
                           }
               return null;
           }
    
           @Override
           public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
           {
               if(ID == 0)
               {
                   EntityClapTrap entity = (EntityClapTrap)world.getEntityByID(x); // on recup l'entité
    // erreur ci dessous
                   return new GuiClapTrap(player.inventory, world, entity);  // < ici
    //
    
               }
               return null;
           }
        }
    
    

    Voici mes autres classe, il n'y a aucune erreur via eclipse, mais y'en a surement coté codage...

    Container

     private final InventoryClapTrap tileTuto;
    
        public ContainerClapTrap(InventoryClapTrap tile, InventoryPlayer inventory)
        {
            this.tileTuto = tile;
            inventory.openInventory();
            for(int i = 0; i < 3; ++i)
            {
                for(int j = 0; j < 9; ++j)
                {
                    this.addSlotToContainer(new Slot(inventory, j + i * 9, 8 + j * 18, 18 + i * 18));
                }
            }
           // this.bindPlayerInventory(entity);
        }
    
        private void bindPlayerInventory(InventoryClapTrap entity)
        {
            int i;
            for(i = 0; i < 3; ++i)
            {
                for(int j = 0; j < 9; ++j)
                {
                    this.addSlotToContainer(new Slot(entity, j + i * 9 + 9, 8 + j * 18, 86 + i * 18));
                }
            }
    
            for(i = 0; i < 9; ++i)
            {
                this.addSlotToContainer(new Slot(entity, i, 8 + i * 18, 144));
            }
        }
    
        public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex)
        {
            ItemStack itemstack = null;
            Slot slot = (Slot)this.inventorySlots.get(slotIndex);
    
            if(slot != null && slot.getHasStack())
            {
                ItemStack itemstack1 = slot.getStack();
                itemstack = itemstack1.copy();
    
                if(slotIndex < this.tileTuto.getSizeInventory())
                {
                    if(!this.mergeItemStack(itemstack1, this.tileTuto.getSizeInventory(), this.inventorySlots.size(), true))
                    {
                        return null;
                    }
                }
                else if(!this.mergeItemStack(itemstack1, 0, this.tileTuto.getSizeInventory(), false))
                {
                    return null;
                }
    
                if(itemstack1.stackSize == 0)
                {
                    slot.putStack((ItemStack)null);
                }
                else
                {
                    slot.onSlotChanged();
                }
            }
            return itemstack;
        }
    
        @Override
        public boolean canInteractWith(EntityPlayer player)
        {
            return this.tileTuto.isUseableByPlayer(player);
        }
    
        public void onContainerClosed(EntityPlayer player)
        {
            super.onContainerClosed(player);
            this.tileTuto.closeInventory();
        }
    }
    

    Gui

    public class GuiClapTrap extends GuiContainer
    {
        private static final ResourceLocation textures = new ResourceLocation(ModClapTrap.MODID, "textures/gui/container/inventory_clap.png");
        private InventoryClapTrap tileTuto;
        private IInventory playerInv;
    
        public GuiClapTrap(InventoryClapTrap tile, InventoryPlayer inventory)
        {
            super(new ContainerClapTrap(tile, inventory));
            this.tileTuto = tile;
            this.playerInv = inventory;
            this.allowUserInput = false;
            this.ySize = 170;
        }
    
        protected void drawGuiContainerForegroundLayer(int x, int y)
        {
            String tileName = this.tileTuto.hasCustomInventoryName() ? this.tileTuto.getInventoryName() : I18n.format(this.tileTuto.getInventoryName());
            this.fontRendererObj.drawString(tileName, this.xSize / 2 - this.fontRendererObj.getStringWidth(tileName) / 2, 6, 0);
            String invName = this.playerInv.hasCustomInventoryName() ? this.playerInv.getInventoryName() : I18n.format(this.playerInv.getInventoryName());
            this.fontRendererObj.drawString(invName, (this.xSize - this.fontRendererObj.getStringWidth(invName)) / 2, this.ySize - 96, 0);
        }
    
        @Override
        protected void drawGuiContainerBackgroundLayer(float partialRenderTick, int x, int y)
        {
            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
            this.mc.getTextureManager().bindTexture(textures);
            int k = (this.width - this.xSize) / 2;
            int l = (this.height - this.ySize) / 2;
            this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize);
    
            /*
            this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.inventoryRows * 18 + 17);
            this.drawTexturedModalRect(k, l + this.inventoryRows * 18 + 17, 0, 126, this.xSize, 96);
            */
        }
    }
    
    

    Inventory(tile entity ?)

    public class InventoryClapTrap implements IInventory
    {
        public ItemStack[] content;
        public int size;
    
        public InventoryClapTrap(ItemStack container, int size) {
            this.size = size;
            this.content = new ItemStack;
            if (!container.hasTagCompound()) container.setTagCompound(new NBTTagCompound());
            this.readFromNBT(container.getTagCompound());
        }
    
        /**
         * This methods reads the content of the NBTTagCompound inside the container
         *
         * @param comp
         *            the container NBTTagCompound
         */
        public void readFromNBT(NBTTagCompound comp) {
            NBTTagList nbtlist = comp.getTagList("Inventory", Constants.NBT.TAG_COMPOUND);
            for (int i = 0; i < nbtlist.tagCount(); i++) {
                NBTTagCompound comp1 = nbtlist.getCompoundTagAt(i);
                int slot = comp1.getInteger("Slot");
                this.content[slot] = ItemStack.loadItemStackFromNBT(comp1);
            }
        }
    
        /**
         * This methods saves the content inside the container
         *
         * @param comp
         *            the NBTTagCompound to write in
         */
        public void writeToNBT(NBTTagCompound comp) {
            NBTTagList nbtlist = new NBTTagList();
    
            for (int i = 0; i < this.size; i++) {
                if (this.content* != null) {
                    NBTTagCompound comp1 = new NBTTagCompound();
                    comp1.setInteger("Slot", i);
                    this.content*.writeToNBT(comp1);
                    nbtlist.appendTag(comp1);
                }
            }
            comp.setTag("Inventory", nbtlist);
        }
    
        @Override
        public int getSizeInventory() {
            return this.size;
        }
    
        @Override
        public ItemStack getStackInSlot(int index) {
            return this.content[index];
        }
    
        @Override
        public ItemStack decrStackSize(int index, int amount) {
            ItemStack stack = getStackInSlot(index);
            if (stack != null) {
                if (stack.stackSize > amount) {
                    stack = stack.splitStack(amount);
                    if (stack.stackSize == 0) this.content[index] = null;
                } else {
                    this.content[index] = null;
                }
            }
            return stack;
        }
    
        @Override
        public ItemStack getStackInSlotOnClosing(int index) {
            ItemStack stack = getStackInSlot(index);
            if (stack != null) this.content[index] = null;
            return stack;
        }
    
        @Override
        public void setInventorySlotContents(int index, ItemStack stack) {
            this.content[index] = stack;
        }
    
        @Override
        public String getInventoryName() {
            return ModClapTrap.MODID + ".container.inventory_clap";
        }
    
        @Override
        public boolean hasCustomInventoryName() {
            return false;
        }
    
        @Override
        public int getInventoryStackLimit() {
            return 64;
        }
    
        @Override
        public void markDirty() {}
    
        @Override
        public boolean isUseableByPlayer(EntityPlayer player) {
            return true;
        }
    
        @Override
        public void openInventory() {}
    
        @Override
        public void closeInventory() {}
    
        /**
         * Prevents backpack-ception
         */
        @Override
        public boolean isItemValidForSlot(int index, ItemStack stack) {
            return true;
        }
    
    }
    
    

    Je m'excuse par avance des énorme boulette présente… Un tuto pour mettre un GUI sur une entity serai le bienvenue 😉

    Cordialement.


  • Administrateurs

    Salut,
    C'est pas juste un gui, c'est un container, un inventaire et un gui. Il faut bien faire la différence. Juste un gui ce n'est pas la même chose que les 3.
    Ton entité devrait avoir l'interface IInventory Et tu devrais utiliser les fonctions en rapport avec les nbt de l'entité pour sauvegarder l'inventaire.

    Par contre c'est bien joli de dire il y a une erreur ici, mais si tu ne précise pas quelle est l'erreur ça va être difficile de t'aider.
    Je suis un programmeur, pas un magicien.



  • Constructeur indéfinie, pour la classe Gui et Container.

    The constructor ContainerClapTrap(InventoryPlayer, World, EntityClapTrap) is undefined (ligne 20)
    The constructor GuiClapTrap(InventoryPlayer, World, EntityClapTrap) is undefined (ligne 31)

    Sûr que c'est un truc bidon, mais je tourne en rond ><

    C'est pas juste un gui, c'est un container, un inventaire et un gui. Il faut bien faire la différence. Juste un gui ce n'est pas la même chose que les 3.

    En effet, j'ai été trop évasif, je vais éditer mon titre.

    Voilà, je suis bloquer ici… Pour les NBT je devrais pouvoir me débrouiller (je l'esper) une fois qu'il n'y aura plus d'erreur et que le GUI s'ouvrira.

    Cordialement.

    EDIT : Bon, en faite c’était juste que j'avais bien fait n'importe quoi... Tout marche impec' sauf... Que tout mes Clap on le même inventaire. A m'on avis c'est un soucis d'ID, la je prend les clap en général ><

    Je n'arrive pas a concorder

    EntityClapTrap entity = (EntityClapTrap)world.getEntityByID(x); < ça
    return new ContainerClapTrap(player.inventory, new InventoryClapTrap(player.getHeldItem(), 54)); < avec ça

    je ne peut pas mettre player.inventory, world, entity
    car les constructeur de la classe Container ne correspond plus, et si je change, tout foire... (constructeur : InventoryPlayer playerInv, InventoryClapTrap inv)


  • Administrateurs

    Bha oui car dans la constructeur de ta classe InventoryClapTrap est :
    public InventoryClapTrap(ItemStack container, int size) {
    C'est à toi de changer ça …
    Pareil pour le constructeur de ContainerClapTrap et le constructeur de GuiClapTrap.



  • Désolé si ça a l'air si évidant pour toi…

    Je dois changer le constructeur InventoryClapTrap... Ok... Mais en quoi ? Je ne vois rien a part ItemStack et slot, c'est un inventaire.

    Et comme je l'ai déjà dit, je n'arrive pas a faire correspondre les constructeur, j'ai beau mettre ce qu'il manque comme le World world, j'ai toujours des erreurs...

    De plus, je trouve quedal sur le net ><

    Après, quoi dire… Oui, je suis une quiche, je n'ai jamais coder rien de tel, je ne sais pas où chercher et je ne comprend pas tout... C'est pas que je ne veux pas y donner du mien, comme si je balançais le truc et "allez, donner moi la réponse". Je trifouille pendant des heures a me cassés la tête ><

    En plus, donner le code tout fait sans explications c'est pas très constructif.

    Donc bon... Merci d'usé de ton temps pour moi.

    Cordialement.


  • Administrateurs

    Commence par appliquer ça :
    @'robin4002':

    Ton entité devrait avoir l'interface IInventory Et tu devrais utiliser les fonctions en rapport avec les nbt de l'entité pour sauvegarder l'inventaire.

    Donc la classe InventoryClapTrap tu la supprimes complètement et tu mets à la place tout dans l'entité. Ensuite tu verra surement les choses plus clairement.



  • .
    ..

    Bon... Que dire... Tu veux quel outil ? Un fouet ? Une batte en fer ? Une planche clouté ? Ou autre ?

    Nah, car en faite... Je n'avais pas vue le "Ton entité devrait avoir l'interface IInventory ", juste ce qu'il y avais apres... Effectivement, une fois fait, j'y est vue plus clair, bien plus clair même... Mais c'est que je me suis tellement embrouiller et tout que... Bah voilà...

    Je devine la "rage" ou le "désespoir" quand tu a me lisais. Merci d’être rester jusqu'au boue serieux.

    Cordialement.

    [résolue]