• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Fonction addItemStackToInventory() ne fonctionne pas dans mon TileEntity

    1.7.x
    1.7.10
    3
    10
    2120
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Squix
      Squix dernière édition par

      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 réponse Dernière réponse Répondre Citer 0
      • RedRelay
        RedRelay Moddeurs confirmés dernière édition par

        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 réponse Dernière réponse Répondre Citer 0
        • Squix
          Squix dernière édition par

          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 réponse Dernière réponse Répondre Citer 0
          • robin4002
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

            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 réponse Dernière réponse Répondre Citer 0
            • Squix
              Squix dernière édition par

              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 réponse Dernière réponse Répondre Citer 0
              • Squix
                Squix dernière édition par

                Personne ne peut m’aider ?? 😞

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

                Développeur de : RemoveHUDbut…

                1 réponse Dernière réponse Répondre Citer 0
                • robin4002
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                  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 réponse Dernière réponse Répondre Citer 0
                  • Squix
                    Squix dernière édition par

                    D’accord voici le lien :

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

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

                    Développeur de : RemoveHUDbut…

                    1 réponse Dernière réponse Répondre Citer 0
                    • robin4002
                      robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                      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 réponse Dernière réponse Répondre Citer 0
                      • Squix
                        Squix dernière édition par

                        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 réponse Dernière réponse Répondre Citer 0
                        • 1 / 1
                        • Premier message
                          Dernier message
                        Design by Woryk
                        Contact / Mentions Légales

                        MINECRAFT FORGE FRANCE © 2018

                        Powered by NodeBB