客户端和服务器端上的NBT加载

3
我有一个方块需要存储另一个方块的位置,以便与该方块进行交互。只要不退出世界,一切都正常运行。我想将其他方块的坐标保存在瓷砖实体的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);

}

我还尝试使用int数组来存储NBT数据,但这根本不起作用。即使正确的数据存储在NBT标签中,它也会返回空数组。

希望你可以帮助我!:-)

1个回答

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,以便可以在世界加载时创建它吗?

为此,你的Block应该覆盖hasTileEntity,如果在给定的IBlockState中有TileEntity,则返回true,并覆盖createTileEntity以返回一个新的TileEntity。

最后,你还需要在GameRegistry中注册你的TileEntity。

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

还有一个 public NBTTagCompound getUpdateTag(),它在不同的时间被调用于 getUpdatePacket() - Draco18s no longer trusts SE
非常感谢!这解决了我的问题,但我需要使用getUpdateTag()而不是getUpdatePacket()! - XPModder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接