• Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Solved Fonction addItemStackToInventory() ne fonctionne pas dans mon TileEntity

    1.7.x
    1.7.10
    3
    10
    1951
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Squix
      Squix last edited by

      Bonjour,

      J’ai un item “cookieSpoon”, lorsqu’on effectue un clic droit avec, il fait appel au TileEntity du bloc “cookieBloc”.

      Ce TileEntity doit ensuite donner un “cookie” au joueur puis lorsque son compteur arrive à 0, le bloc se détruit.

      Code du TileEntity :

      :::

      ​package com.squixdev.cookieparty.block;
      
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.init.Items;
      import net.minecraft.item.ItemStack;
      import net.minecraft.nbt.NBTTagCompound;
      import net.minecraft.tileentity.TileEntity;
      import net.minecraft.util.ChatComponentText;
      import net.minecraft.util.ChatComponentTranslation;
      import net.minecraft.world.World;
      
      public class TileEntityBlockContainer extends TileEntity {
      
      public Integer basicQuantity = 9;
      
      public Integer quantityStored = 9;
      
      @Override
      public void readFromNBT(NBTTagCompound nbt)
      {
         super.readFromNBT(nbt);
         this.quantityStored = nbt.getInteger("quantityStored");
      
      }
      
      @Override
      public void writeToNBT(NBTTagCompound nbt)
      {
         super.writeToNBT(nbt);
         nbt.setInteger("quantityStored", quantityStored);
      }
      
      public void activate(EntityPlayer player, World world) {
      
      if (this.quantityStored != 1) {
      
      this.quantityStored –;
      
      player.inventory.addItemStackToInventory(new ItemStack(Items.cookie));
      
      player.addChatMessage(new ChatComponentText(" " + this.quantityStored + " cookies restants."));
      
      world.notifyBlockChange(xCoord, yCoord, zCoord, this.blockType);
      
      }
      
      else {
      boolean good = world.func_147480_a(xCoord, yCoord, zCoord, false);
      }
      
      }
      
      public Integer getQuantity() {
      // TODO Auto-generated method stub
      return quantityStored;
      }
      
      }
      

      :::

      Mon problème se situe dans la classe de la “cookieSpoon” :

      ​package com.squixdev.cookieparty.item;
      
      import com.squixdev.cookieparty.block.TileEntityBlockContainer;
      
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.item.Item;
      import net.minecraft.item.ItemStack;
      import net.minecraft.world.World;
      
      public class cookieSpoon extends Item {
      
      @Override
      public boolean onItemUse(ItemStack is, EntityPlayer player,
      World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {
      
      TileEntityBlockContainer te = (TileEntityBlockContainer)world.getTileEntity(x, y, z);
      te.activate(player, world);
      
      return super
      .onItemUse(is, player, world, x, y,
      z, side, hitX, hitY, hitZ);
      }
      
      }
      

      Dans cette configuration, sans la condition if(!world.isRemote), le TileEntity fonctionne mais le message dans le Chat est doublé.

      C’est pourquoi j’ai donc ajouté cette fameuse condition et là le message n’est plus doublé mais la fonction *player.inventory.addItemStackToInventory(new ItemStack(Items.cookie)); *ne fonctionne plus !

      Code de la “cookieSpoon” avec la condition :
      :::

      ​package com.squixdev.cookieparty.item;
      
      import com.squixdev.cookieparty.block.TileEntityBlockContainer;
      
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.item.Item;
      import net.minecraft.item.ItemStack;
      import net.minecraft.world.World;
      
      public class cookieSpoon extends Item {
      
      @Override
      public boolean onItemUse(ItemStack is, EntityPlayer player,
      World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {
      
      if(!world.isRemote) {
      
      TileEntityBlockContainer te = (TileEntityBlockContainer)world.getTileEntity(x, y, z);
      te.activate(player, world);
      
      }
      
      return super
      .onItemUse(is, player, world, x, y,
      z, side, hitX, hitY, hitZ);
      }
      
      }
      

      :::

      Voilà j’espère vraiment trouver comment résoudre ce problème, surtout que je n’ai pas la moindre d’idée d’où ça peut venir  😞

      J’utilise Forge 1.7.10-10.13.2.1230.

      Merci d’avance,

      Squix

      System.crash(); //Petite instruction marrante  :D

      Développeur de : RemoveHUDbut…

      1 Reply Last reply Reply Quote 0
      • RedRelay
        RedRelay Moddeurs confirmés last edited by

        Surement une désynchronisation entre le client et le serveur.
        Le client ne reçoit pas d’information concernant la mise a jour que tu fais sur la TE coté serveur.

        –------------------------------------------------------------------------------------
        Si tu trouves mon intervention pertinente, n'hésite pas a m…

        1 Reply Last reply Reply Quote 0
        • Squix
          Squix last edited by

          Merci, oui j’ai pensé à ça aussi au début mais vu que je n’ai jamais eu ce genre de problème, concrètement, que dois-je faire pour que le client reçoive la mise à jour de la TileEntity ??

          System.crash(); //Petite instruction marrante  :D

          Développeur de : RemoveHUDbut…

          1 Reply Last reply Reply Quote 0
          • robin4002
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

            Si tu mets un System.out.println(quantityStored) au début de la fonction activate du tile entity il t’affiche quoi ?
            Autre chose, ton code va causer un ClassCastException si tu fais un clic droit sur un autre bloc comme par exemple un coffre, il faut juste ajouter un if(te instanceof TileEntityBlockContainer) pour corriger ça.

            1 Reply Last reply Reply Quote 0
            • Squix
              Squix last edited by

              Salut, désolé de ne pas avoir répondu plus tôt, j’ai eu quelques problèmes avec mon fournisseur internet 😕

              Alors voilà ce que j’obtient dans la console en mettant un System.out.print :

              [20:28:18] [Server thread/INFO] [STDOUT]: [com.squixdev.cookieparty.block.TileEntityBlockContainer:activate:35]: 9

              [20:28:18] [Client thread/INFO]: [CHAT]  8 cookies restants.
              [20:28:20] [Client thread/WARN]: Unable to play unknown soundEvent: minecraft:liquid.water
              [20:28:20] [Client thread/WARN]: Unable to play unknown soundEvent: minecraft:music.game.creative
              [20:28:21] [Client thread/WARN]: Unable to play unknown soundEvent: minecraft:liquid.water
              [20:28:22] [Client thread/WARN]: Unable to play unknown soundEvent: minecraft:mob.zombie.step
              [20:28:24] [Server thread/INFO] [STDOUT]: [com.squixdev.cookieparty.block.TileEntityBlockContainer:activate:35]: 8
              [20:28:24] [Client thread/INFO]: [CHAT]  7 cookies restants.

              Je pense donc que tout fonctionne correctement de ce côté là ^^

              System.crash(); //Petite instruction marrante  :D

              Développeur de : RemoveHUDbut…

              1 Reply Last reply Reply Quote 0
              • Squix
                Squix last edited by

                Personne ne peut m’aider ?? 😞

                System.crash(); //Petite instruction marrante  :D

                Développeur de : RemoveHUDbut…

                1 Reply Last reply Reply Quote 0
                • robin4002
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                  Envoie un zip de ton dossier src, je vais faire des tests de mon côté quand j’aurai le temps car je trouve ça étrange.

                  1 Reply Last reply Reply Quote 0
                  • Squix
                    Squix last edited by

                    D’accord voici le lien :

                    https://mega.co.nz/#!TwVQSJTB!itgOOSi9m5yPJyrywdG__Tq3-luSFt2AClZtFK9DJQ4

                    System.crash(); //Petite instruction marrante  :D

                    Développeur de : RemoveHUDbut…

                    1 Reply Last reply Reply Quote 0
                    • robin4002
                      robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                      C’est normal que ton code soit erroné ? Eclipse m’indique 6 erreurs … (principalement sur la classe CookieTreeGenerator)

                      EDIT : Faudra aussi que tu m’explique comment tu t’en sort dans ton code sans respecter la convention Java et sans formater x) Car pour moi c’est complètement illisible.

                      Bref, en fait ton code fonctionne, le problème c’est que l’inventaire ne se met pas à jour côté client. Si tu clic partout dans l’inventaire tu finira pas trouver tes cookies.

                      Il suffit d’ajouter cette ligne après avoir ajouter l’item dans l’inventaire du joueur :

                      ​            player.inventoryContainer.detectAndSendChanges();
                      
                      1 Reply Last reply Reply Quote 0
                      • Squix
                        Squix last edited by

                        Salut oui c’est normal c’est ça de pas finir un élément et se concentrer sur un autre x)

                        Je ne respecte aucune convention en effet c’est carrément l’anarchie ^^

                        Sinon pour le code ça marche parfaitement merci j’aurais jamais trouvé sinon ! ^^

                        System.crash(); //Petite instruction marrante  :D

                        Développeur de : RemoveHUDbut…

                        1 Reply Last reply Reply Quote 0
                        • 1 / 1
                        • First post
                          Last post
                        Design by Woryk
                        Contact / Mentions Légales

                        MINECRAFT FORGE FRANCE © 2018

                        Powered by NodeBB