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

    Résolu Problème à l'enregistrement des NBT TileEntity

    1.12.x
    1.12.x
    3
    9
    1008
    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.
    • C
      Chokearth dernière édition par

      Bonjour,

      j’ai un problème, quand de l’écriture des NBT de mon block, les variables qui doivent être sauvegardé passe à 0. 
      L’inventaire lui est par contre bien sauvegardé.

      Bloc :

      [font=Courier Newpackage ]fr.chokearth.rpm.object.block.stand%(#cc7832)[;
      ]
      import fr.chokearth.rpm.Main%(#cc7832)[;
      ]import fr.chokearth.rpm.object.block.base.BlockBaseAdjustableHorizontal%(#cc7832)[;
      ]import fr.chokearth.rpm.object.block.stand.tileEntity.TileEntityStandSell%(#cc7832)[;
      ]import fr.chokearth.rpm.util.Reference%(#cc7832)[;
      ]import net.minecraft.block.ITileEntityProvider%(#cc7832)[;
      ]import net.minecraft.block.material.Material%(#cc7832)[;
      ]import net.minecraft.block.state.IBlockState%(#cc7832)[;
      ]import net.minecraft.entity.player.EntityPlayer%(#cc7832)[;
      ]import net.minecraft.tileentity.TileEntity%(#cc7832)[;
      ]import net.minecraft.util.EnumFacing%(#cc7832)[;
      ]import net.minecraft.util.EnumHand%(#cc7832)[;
      ]import net.minecraft.util.math.AxisAlignedBB%(#cc7832)[;
      ]import net.minecraft.util.math.BlockPos%(#cc7832)[;
      ]import net.minecraft.world.IBlockAccess%(#cc7832)[;
      ]import net.minecraft.world.World%(#cc7832)[;
      ]
      import javax.annotation.Nullable%(#cc7832)[;
      ]
      public class StandSell extends BlockBaseAdjustableHorizontal implements ITileEntityProvider{
      
         public static final AxisAlignedBB *STANDSELL_AABB *= new AxisAlignedBB(0, -0.5, 0, 1, 0.5, 1)%(#cc7832)[;
      ]
         public StandSell(String name) {
             super(name, Material.*WOOD*, Main.*RPMTAB*, false)%(#cc7832)[;
      ]   }
      
         %(#bbb529)[@Override
      ]   public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
             return *STANDSELL_AABB*%(#cc7832)[;
      ]   }
      
         %(#bbb529)[@Override
      ]   public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
             if (!worldIn.isRemote)
                 playerIn.openGui(Main.*instance*, Reference.*GUI_STAND_SELL_OWNER*, worldIn, pos.getX(), pos.getY(), pos.getZ())%(#cc7832)[;
      ]%(#cc7832)[       return true;
      ]   }
      
         %(#bbb529)[@Nullable
      ]%(#bbb529)[   @Override
      ]   public TileEntity createNewTileEntity(World worldIn, int meta) {
             return new TileEntityStandSell()%(#cc7832)[;
      ]   }
      }
      

      TileEntity :

      [font=Courier Newpackage ]fr.chokearth.rpm.object.block.stand.tileEntity%(#cc7832)[;
      ]
      import net.minecraft.entity.EntityLivingBase%(#cc7832)[;
      ]import net.minecraft.entity.player.EntityPlayer%(#cc7832)[;
      ]import net.minecraft.inventory.IInventory%(#cc7832)[;
      ]import net.minecraft.inventory.ItemStackHelper%(#cc7832)[;
      ]import net.minecraft.item.ItemStack%(#cc7832)[;
      ]import net.minecraft.nbt.NBTTagCompound%(#cc7832)[;
      ]import net.minecraft.tileentity.TileEntity%(#cc7832)[;
      ]import net.minecraft.util.NonNullList%(#cc7832)[;
      ]
      public class TileEntityStandSell extends TileEntity implements IInventory{
      
         private NonNullList<itemstack> inventory = NonNullList.<itemstack>*withSize*(6, ItemStack.*EMPTY*)%(#cc7832)[;
      ]   private String customName%(#cc7832)[;
      ]   private EntityLivingBase owner%(#cc7832)[;
      ]
         private int prixItemBronze0%(#cc7832)[;
      ]   private int prixItemBronze1%(#cc7832)[;
      ]   private int prixItemBronze2%(#cc7832)[;
      ]   private int prixItemBronze3%(#cc7832)[;
      ]   private int prixItemBronze4%(#cc7832)[;
      ]   private int prixItemBronze5%(#cc7832)[;
      ]
         %(#808080)[//METHODES
      ]   public void itemIsClickOnSlotSell(ItemStack stack, int index){
             ItemStack stack1 = stack.copy()%(#cc7832)[;
      ]       inventory.set(index, stack1)%(#cc7832)[;
      ]   }
      
         public void buttonPush(int id){
             int v = 0%(#cc7832)[;
      ]
             for (int x1 = 0; x1 < 6; x1++){
                 if(id-(x1*3) == 0)this.setField(v, this.getField(v)+1)%(#cc7832)[;
      ]           if(id-(x1*3) == 1)this.setField(v+6, this.getField(v+6)+1)%(#cc7832)[;
      ]           if(id-(x1*3) == 2)this.setField(v+12, this.getField(v+12)+1)%(#cc7832)[;
      ]
                 if(id-(x1*3) == 0+18)this.setField(v, this.getField(v)-1)%(#cc7832)[;
      ]           if(id-(x1*3) == 1+18)this.setField(v+6, this.getField(v+6)-1)%(#cc7832)[;
      ]           if(id-(x1*3) == 2+18)this.setField(v+12, this.getField(v+12)-1)%(#cc7832)[;
      ]
                 if (this.getField(v) > 99) this.setField(v, 0)%(#cc7832)[;
      ]           if (this.getField(v) < 0) this.setField(v, 99)%(#cc7832)[;
      ]
                 if (this.getField(v+6) > 99) this.setField(v+6, 0)%(#cc7832)[;
      ]           if (this.getField(v+6) < 0) this.setField(v+6, 99)%(#cc7832)[;
      ]
                 if (this.getField(v+12) > 99) this.setField(v+12, 0)%(#cc7832)[;
      ]           if (this.getField(v+12) < 0) this.setField(v+12, 99)%(#cc7832)[;
      ]
                 v++%(#cc7832)[;
      ]       }
             this.markDirty()%(#cc7832)[;
      ]   }
      
         %(#808080)[//DATA
      ]   %(#bbb529)[@Override
      ]   public void readFromNBT(NBTTagCompound compound) {
             super.readFromNBT(compound)%(#cc7832)[;
      ]
             this.inventory = NonNullList.<itemstack>*withSize*(this.getSizeInventory(), ItemStack.*EMPTY*)%(#cc7832)[;
      ]       ItemStackHelper.*loadAllItems*(compound, this.inventory)%(#cc7832)[;
      ]
             for (int v = 0; v < 6; v++)
                 this.setField(v, compound.getInteger("prixItemBronze"+v))%(#cc7832)[;
      ]
             if(compound.hasKey("CustomName", 8)) this.setCustomName(compound.getString("CustomName"))%(#cc7832)[;
      ]   }
      
         %(#bbb529)[@Override
      ]   public NBTTagCompound writeToNBT(NBTTagCompound compound) {
             super.writeToNBT(compound)%(#cc7832)[;
      ]
             System.*out*.println("prixItemBronze0 avant l'écriture :" + this.prixItemBronze0)%(#cc7832)[;
      ]       for (int v = 0; v < 6; v++)
                 compound.setInteger("prixItemBronze"+v, this.getField(v))%(#cc7832)[;
      ]
             ItemStackHelper.*saveAllItems*(compound, this.inventory)%(#cc7832)[;
      ]
             if(this.hasCustomName()) compound.setString("CustomName", this.customName)%(#cc7832)[;
      ]       return compound%(#cc7832)[;
      ]   }
      
         %(#808080)[//FIELD
      ]   %(#bbb529)[@Override
      ]   public int getField(int id) {
             switch (id){
                 case 0:
                     return this.prixItemBronze0%(#cc7832)[;
      ]           case 1:
                     return this.prixItemBronze1%(#cc7832)[;
      ]           case 2:
                     return this.prixItemBronze2%(#cc7832)[;
      ]           case 3:
                     return this.prixItemBronze3%(#cc7832)[;
      ]           case 4:
                     return this.prixItemBronze4%(#cc7832)[;
      ]           case 5:
                     return this.prixItemBronze5%(#cc7832)[;
      ]           default:
                     return 0%(#cc7832)[;
      ]
             }
         }
      
         %(#bbb529)[@Override
      ]   public void setField(int id, int value) {
             switch (id){
                 case 0:
                     this.prixItemBronze0 = value%(#cc7832)[;
      ]               System.*out*.println("changement de valeur de prixItemBronze0 :" + this.prixItemBronze0)%(#cc7832)[;
      ]%(#cc7832)[               break;
      ]           case 1:
                     this.prixItemBronze1 = value%(#cc7832)[;
      ]%(#cc7832)[               break;
      ]           case 2:
                     this.prixItemBronze2 = value%(#cc7832)[;
      ]%(#cc7832)[               break;
      ]           case 3:
                     this.prixItemBronze3 = value%(#cc7832)[;
      ]%(#cc7832)[               break;
      ]           case 4:
                     this.prixItemBronze4 = value%(#cc7832)[;
      ]%(#cc7832)[               break;
      ]           case 5:
                     this.prixItemBronze5 = value%(#cc7832)[;
      ]%(#cc7832)[               break;
      ]       }
         }
      
         %(#bbb529)[@Override
      ]   public int getFieldCount() {
             return 6%(#cc7832)[;
      ]   }
      
         %(#808080)[//OVERRIDE
      ]
         %(#bbb529)[@Override
      ]   public int getSizeInventory() {
             return this.inventory.size()%(#cc7832)[;
      ]   }
      
         %(#bbb529)[@Override
      ]   public boolean isEmpty() {
             for(ItemStack stack : this.inventory){
                 if(!stack.isEmpty()) %(#cc7832)[return false;
      ]       }
             %(#cc7832)[return true;
      ]   }
      
         %(#bbb529)[@Override
      ]   public ItemStack getStackInSlot(int index) {
             return (ItemStack)this.inventory.get(index)%(#cc7832)[;
      ]   }
      
         %(#bbb529)[@Override
      ]   public ItemStack decrStackSize(int index, int count) {
             return ItemStackHelper.*getAndSplit*(this.inventory, index, count)%(#cc7832)[;
      ]   }
      
         %(#bbb529)[@Override
      ]   public ItemStack removeStackFromSlot(int index) {
             return ItemStackHelper.*getAndRemove*(this.inventory, index)%(#cc7832)[;
      ]   }
      
         %(#bbb529)[@Override
      ]   public void setInventorySlotContents(int index, ItemStack stack) {
             this.inventory.set(index, stack)%(#cc7832)[;
      ]       if(stack != null && stack.getCount() > this.getInventoryStackLimit())
                 stack.setCount(this.getInventoryStackLimit())%(#cc7832)[;
      ]       this.markDirty()%(#cc7832)[;
      ]   }
      
         %(#bbb529)[@Override
      ]   public int getInventoryStackLimit() {
             return 64%(#cc7832)[;
      ]   }
      
         %(#bbb529)[@Override
      ]   public boolean isUsableByPlayer(EntityPlayer player) {
             return this.world.getTileEntity(this.pos) != this ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64%(#cc7832)[;
      ]   }
      
         %(#bbb529)[@Override
      ]   public void openInventory(EntityPlayer player) {
      
         }
      
         %(#bbb529)[@Override
      ]   public void closeInventory(EntityPlayer player) {
      
         }
      
         %(#bbb529)[@Override
      ]   public boolean isItemValidForSlot(int index, ItemStack stack) {
             %(#cc7832)[return true;
      ]   }
      
         %(#bbb529)[@Override
      ]   public void %(#ffc66d)</itemstack></itemstack></itemstack>
      1 réponse Dernière réponse Répondre Citer 0
      • robin4002
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

        Salut,
        C’est un problème client / serveur, dans ton gui tu changes la valeur de prixItemBronze0 du tile entite client. Le tile entity serveur (qui exécute la fonction writeToNBT) a toujours 0 comme valeur pour cette variable.

        On peut d’ailleurs le voir dans les logs “changement de valeur de prixItemBronze0” vient de [main/INFO] et prixItemBronze0 avant l’Ãcriture vient de [Server thread/INFO].

        Au lieu d’appeler la fonction this.tileEntity.buttonPush(button.id); dans ton gui, il faut que tu utilises un paquet (qui lui exécutera la fonction buttonPush(button.id); côté serveur).

        1 réponse Dernière réponse Répondre Citer 1
        • Superloup10
          Superloup10 Modérateurs dernière édition par

          Au passage, pense à mettre ta workspace en UTF-8.

          Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

          Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

          1 réponse Dernière réponse Répondre Citer 0
          • C
            Chokearth dernière édition par

            @‘robin4002’:

            Salut,
            C’est un problème client / serveur, dans ton gui tu changes la valeur de prixItemBronze0 du tile entite client. Le tile entity serveur (qui exécute la fonction writeToNBT) a toujours 0 comme valeur pour cette variable.

            On peut d’ailleurs le voir dans les logs “changement de valeur de prixItemBronze0” vient de [main/INFO] et prixItemBronze0 avant l’Ãcriture vient de [Server thread/INFO].

            Au lieu d’appeler la fonction this.tileEntity.buttonPush(button.id); dans ton gui, il faut que tu utilises un paquet (qui lui exécutera la fonction buttonPush(button.id); côté serveur).

            Je ne sais pas comment utiliser les paquets, comme faire pour envoyé le message à mon bloc ?

            [font=Courier Newpublic class ]PacketStandSell extends IMessage {
            
               private int id%(#cc7832)[;
            ]
                public PacketStandSell() {
               }
            
               public PacketStandSell(int id) {
                   this.id = id%(#cc7832)[;
            ]    }
            
               %(#bbb529)[@Override
            ]    public void fromBytes(ByteBuf buf) {
                   this.id = buf.readInt()%(#cc7832)[;
            ]    }
            
               %(#bbb529)[@Override
            ]    public void toBytes(ByteBuf buf) {
                   buf.writeInt(id)%(#cc7832)[;
            ]    }
            
               public static class Handler implements IMessageHandler<packetstandsell, imessage="">{
            
                   %(#bbb529)[@Override
            ]        public IMessage onMessage(PacketStandSell message, MessageContext ctx) {
            
                       %(#cc7832)[return null;
            ]        }
               }
            }
            

            @‘Superloup10’:

            Au passage, pense à mettre ta workspace en UTF-8.

            Mon workSpace et déjà en UTF-8.</packetstandsell%(#cc7832)[,>

            1 réponse Dernière réponse Répondre Citer 0
            • Superloup10
              Superloup10 Modérateurs dernière édition par

              Si c’était le cas, il n’y aurait pas ceci dans les logs ```
              prixItemBronze0 avant l’Ãcriture

              Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

              Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

              1 réponse Dernière réponse Répondre Citer 0
              • C
                Chokearth dernière édition par

                @‘Superloup10’:

                Si c’était le cas, il n’y aurait pas ceci dans les logs

                prixItemBronze0 avant l'Ãcriture
                

                Exacte, c’est étonnant. Et sinon tu ne peux pas m’aidée pour mon problème ?

                1 réponse Dernière réponse Répondre Citer 0
                • Superloup10
                  Superloup10 Modérateurs dernière édition par

                  Non, désolé. Je ne suis pas un spécialiste des paquets.

                  Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                  Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

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

                    à l’aide de ctx tu peux obtenir le joueur comme ceci :
                    ctx.getServerHandler().playerEntity.
                    Avec ça tu peux avoir son container (EntityPlayer#openContainer) depuis lequel tu peux avoir le tile entity.
                    Autre solution, depuis le joueur tu as le world et donc tu peux envoyer dans le paquet les coordonnées x, y, z pour ensuite obtenir get le tile entity depuis player.world.

                    1 réponse Dernière réponse Répondre Citer 0
                    • C
                      Chokearth dernière édition par

                      @‘robin4002’:

                      à l’aide de ctx tu peux obtenir le joueur comme ceci :
                      ctx.getServerHandler().playerEntity.
                      Avec ça tu peux avoir son container (EntityPlayer#openContainer) depuis lequel tu peux avoir le tile entity.
                      Autre solution, depuis le joueur tu as le world et donc tu peux envoyer dans le paquet les coordonnées x, y, z pour ensuite obtenir get le tile entity depuis player.world.

                      Merci, ça marche nickel !  😄

                      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