Problème à l'enregistrement des NBT TileEntity



  • 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.5010.51)%(#cc7832)[;
    ]
       public StandSell(String name) {
           super(nameMaterial.*WOOD*Main.*RPMTAB*, false)%(#cc7832)[;
    ]   }
    
       %(#bbb529)[@Override
    ]   public AxisAlignedBB getBoundingBox(IBlockState stateIBlockAccess sourceBlockPos pos) {
           return *STANDSELL_AABB*%(#cc7832)[;
    ]   }
    
       %(#bbb529)[@Override
    ]   public boolean onBlockActivated(World worldInBlockPos posIBlockState stateEntityPlayer playerInEnumHand handEnumFacing facing, float hitX, float hitY, float hitZ) {
           if (!worldIn.isRemote)
               playerIn.openGui(Main.*instance*Reference.*GUI_STAND_SELL_OWNER*worldInpos.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*(6ItemStack.*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(indexstack1)%(#cc7832)[;
    ]   }
    
       public void buttonPush(int id){
           int v = 0%(#cc7832)[;
    ]
           for (int x1 = 0x1 < 6x1++){
               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) > 99this.setField(v0)%(#cc7832)[;
    ]           if (this.getField(v) < 0this.setField(v99)%(#cc7832)[;
    ]
               if (this.getField(v+6) > 99this.setField(v+60)%(#cc7832)[;
    ]           if (this.getField(v+6) < 0this.setField(v+699)%(#cc7832)[;
    ]
               if (this.getField(v+12) > 99this.setField(v+120)%(#cc7832)[;
    ]           if (this.getField(v+12) < 0this.setField(v+1299)%(#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 = 0v < 6v++)
               this.setField(vcompound.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 = 0v < 6v++)
               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.inventoryindexcount)%(#cc7832)[;
    ]   }
    
       %(#bbb529)[@Override
    ]   public ItemStack removeStackFromSlot(int index) {
           return ItemStackHelper.*getAndRemove*(this.inventoryindex)%(#cc7832)[;
    ]   }
    
       %(#bbb529)[@Override
    ]   public void setInventorySlotContents(int indexItemStack stack) {
           this.inventory.set(indexstack)%(#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 indexItemStack stack) {
           %(#cc7832)[return true;
    ]   }
    
       %(#bbb529)[@Override
    ]   public void %(#ffc66d)</itemstack></itemstack></itemstack>

  • Moddeurs confirmés Rédacteurs Administrateurs

    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).


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

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



  • @'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)[,>


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

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



  • @'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 ?


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

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


  • Moddeurs confirmés Rédacteurs Administrateurs

    à 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.



  • @'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 !  😄


Log in to reply