Résolu 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.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>
-
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).
-
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)[,>
-
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 ?
-
Non, désolé. Je ne suis pas un spécialiste des paquets.
-
à 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 !