Java 在客户端与服务器端加载NBT

Java 在客户端与服务器端加载NBT,java,minecraft,minecraft-forge,Java,Minecraft,Minecraft Forge,我有一个块需要存储另一个块的位置,以便与该块交互。只要你不退出这个世界,一切正常。我想在平铺实体nbt数据中保存另一个块的坐标。数据的保存工作正常,但当重新登录到世界并因此加载nbt数据时,会出现某种问题。我现在已经发现问题只存在于客户端。加载世界时,服务器将从nbt加载正确的坐标,但客户端仅为每个坐标加载0,这在尝试在这些坐标处与块交互时会导致一些问题。 我不知道如何解决这个问题,我不明白为什么数据在服务器端正确加载,但在客户端却没有正确加载 以下是在TileEntity中书写和阅读nbt的方

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

以下是在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标记中,它也只会返回一个空数组。 我希望你能帮助我!
:-)

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

要同步NBT数据,需要覆盖
onDataPacket
getUpdatePacket
函数

我的通常是这样的:

@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,以便在world load上创建它

为此,如果块在给定的
IBlockState
中有一个TileEntity,则块应覆盖
hastleEntity
return true
,并
createTileEntity以返回一个新的TileEntity

最后但并非最不重要的一点是,您必须向GameRegistry注册您的TileEntity

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

还有
public NBTTagCompound getUpdateTag()
,它的调用时间与
getUpdatePacket()
不同。非常感谢!这解决了我的问题,但我需要使用getUpdateTag()而不是getUpdatePacket()!