2017-10-15 93 views
2

我有一个块需要存储另一个块的位置,与该块进行交互。一切工作正常,只要你没有退出世界。我想保存瓦片实体nbt数据中其他块的坐标。数据的保存工作正常,但是当重新登录到世界并因此加载nbt数据时,存在某种问题。我现在已经发现问题只存在于客户端。加载世界时,服务器从nbt加载正确的坐标,但客户端仅为每个坐标加载0,并且在尝试与这些坐标处的块交互时导致一些问题。 我不知道如何解决这个问题,我很困惑,为什么数据在服务器上正确加载 - 但在客户端不正确。客户端与服务器端NBT加载

以下是写作,并在TileEntity读取NBT方法:

@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); 

} 

我还使用了NBT一个int数组试过了,但是,这并不在所有的工作。即使正确的数据存储在nbt标签中,它也会返回一个空数组。 我希望你能帮助我! :-)

回答

2

默认情况下,Minecraft不会在客户端和服务器之间同步NBT数据。

对于要同步的NBT数据,您需要覆盖onDataPacketgetUpdatePacket函数。

矿井通常是这样的:

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

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

而且你一定要正确地注册您的TileEntity所以它可以在世界上的负载产生的呢?

为此,您的区块应覆盖hasTileEntityreturn true,前提是它在给定的IBlockStatecreateTileEntity中具有TileEntity以返回新的TileEntity。

最后但并非最不重要你与GameRegistry

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

注册您的TileEntity还有'公共NBTTagCompound getUpdateTag()'这被称为在不同的时间比'getUpdatePacket()'。 – Draco18s

+0

非常感谢!这解决了我的问题,但我需要使用getUpdateTag()而不是getUpdatePacket()! – XPModder