Résolu Client et serveur pas d'accord
-
Bonjour , j’ai un probleme dont je ne trouve pas la source :
J’ai un tileentity IIventory qui stocke trois ints et du=eux itemstacks.
J’ai une classe Container et guicontainer qui font biens leur boulot (les stacks sont biens places et les ints du tile entity sont afichés (sous forme de jauge).
Sauf que , voila mon probème : lorsque j’entre dans ma session(singleplayer) et que je modifie les ints , les jauges se remplissent : parfait.
Mais lorsque je deco-reco(du singleplayer),les jauges sont remises avec les valeurs par defaut du tileentity ! Pourtant , les tags NBT stockés le sont avec les bonnes valeurs et le traitement des valeurs se font correctement.
J’ai donc cherché sur la source du problème et je suis tombé sur la classe GUIHandler :package com.bernard.torch.gui; import com.bernard.torch.blocks.tileentities.TorchRechargerTileEntity; import cpw.mods.fml.common.network.IGuiHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class TorchGuiHandler implements IGuiHandler { @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if (ID == 0) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof TorchRechargerTileEntity) { System.out.println("S:"+te.toString()); return new TorchRechargerContainer((TorchRechargerTileEntity) te, player.inventory); } } return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if (ID == 0) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof TorchRechargerTileEntity) { System.out.println("C:"+te.toString()); return new TorchRechargerGuiContainer((TorchRechargerTileEntity) te, player.inventory); } } return null; } }
(J’ai redefini la methode toString de mon tileentity pour qu’il affiche les ints)
Et là, minecraft m’affiche S:vraies valeurs et C:valeurs par defaut
Je ne vois pas du tout d’où le problème peut venir , j’ai compris que le monde serveur conservait les donnees NBT après un deco-reco alors que le client ne conservait pas les donnees sur la durée
Si vous pouviez m’aider je n’ai pas trouve de solution , ni sur le forum, ni sur google
-
Salut,
Le tutoriel à la réponse à ton problème :
https://www.minecraftforgefrance.fr/showthread.php?tid=1113Deux autres fonctions qui pourront vous être utile :
public Packet getDescriptionPacket() { NBTTagCompound nbttagcompound = new NBTTagCompound(); this.writeToNBT(nbttagcompound); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbttagcompound); } public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); }
Elles permettent d’envoyer au client toutes les valeurs qui ont été enregistrées dans le tag nbt lorsque l’entité de bloc est chargée.
Attention, elles ne permettent pas d’envoyer les valeurs du client vers le serveur, pour cela il faut utiliser un paquet, ce que nous verrons plus tard dans un autre tutoriel. -
Il faut tu syncro les données avec les méthode addCraftingToCrafters il me semble
-
Merci beaucoup ! pourtant j’avais relu le tuto 3 fois mais je suis passé devant …