2017-10-15 8 views
2

J'ai un bloc qui doit stocker la position d'un autre bloc pour interagir avec ce bloc. Tout fonctionne bien, tant que vous n'êtes pas en train de vous déconnecter du monde. Je veux enregistrer les coordonnées de l'autre bloc dans les données nbt des entités de tuiles. La sauvegarde des données fonctionne correctement, mais lors de la reconnexion au monde et donc du chargement des données nbt, il y a un problème. J'ai maintenant compris que le problème n'existe que du côté client. Lors du chargement du monde, les coordonnées correctes sont chargées à partir de nbt par le serveur, mais le client ne charge que 0 pour chaque coordonnée et cela cause des problèmes lors de l'interaction avec le bloc à ces coordonnées. Je ne sais pas comment résoudre ce problème et je suis confus quant à savoir pourquoi les données sont chargées correctement sur le serveur - mais pas correctement sur le côté client.Chargement NBT côté client ou côté serveur

Voici les méthodes pour l'écriture et la lecture du NBT dans le TileEntity:

@Override 
public NBTTagCompound writeToNBT(NBTTagCompound compound) { 

    int[] cont = {0, 0, 0}; 

    if(this.controller != null) { 

     LogHelper.info("Writing " + this.controller); 
     cont[0] = this.controller.getX(); 
     cont[1] = this.controller.getY(); 
     cont[2] = this.controller.getZ(); 

    } 

    compound.setInteger("controllerX", cont[0]); 
    compound.setInteger("controllerY", cont[1]); 
    compound.setInteger("controllerZ", cont[2]); 

    super.writeToNBT(compound); 

    return compound; 

} 

@Override 
public void readFromNBT(NBTTagCompound compound){ 

    super.readFromNBT(compound); 

    int[] coords = {0, 0, 0}; 
    coords[0] = compound.getInteger("controllerX"); 
    coords[1] = compound.getInteger("controllerY"); 
    coords[2] = compound.getInteger("controllerZ"); 
    LogHelper.info("Loading " + Arrays.toString(coords)); 
    this.controller = new BlockPos(coords[0], coords[1], coords[2]); 
    LogHelper.info("Loading " + this.controller); 

} 

J'ai aussi essayé d'utiliser un tableau int pour le NBT, mais cela ne fonctionne pas du tout. Cela retournerait simplement un tableau vide même si les données correctes étaient stockées dans la balise nbt. J'espère que vous pouvez m'aider! :-)

Répondre

2

Par défaut, Minecraft ne synchronise pas les données NBT entre le client et le serveur. Pour que les données NBT soient synchronisées, vous devez remplacer les fonctions onDataPacket et getUpdatePacket.

mine recherchent généralement comme ceci:

@Nullable 
@Override 
public SPacketUpdateTileEntity getUpdatePacket() { 
    return new SPacketUpdateTileEntity(getPos(), getBlockMetadata(), writeToNBT(new NBTTagCompound())); 
} 

@Override 
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { 
    readFromNBT(pkt.getNbtCompound()); 
} 

Aussi avez-vous assurez-vous d'enregistrer correctement votre TileEntity il peut être créé sur la charge mondiale?

Pour ce votre bloc doit Remplacer hasTileEntity-return true si elle a un TileEntity dans la donnée IBlockState et createTileEntity retourner un TileEntity frais.

Last but not least, vous devez enregistrer votre TileEntity avec le GameRegistry

GameRegistry.registerTileEntity(YourTileEntity.class, "YourModid:ResourceString"); 
+0

Il y a aussi 'publique NBTTagCompound getUpdateTag()' qui est appelé à un autre moment que 'getUpdatePacket()'. – Draco18s

+0

Merci beaucoup! Cela a résolu mon problème, mais j'avais besoin d'utiliser getUpdateTag() au lieu de getUpdatePacket()! – XPModder