我有一个需要存储另一个块的位置以便与该块进行交互的块。只要您不退出世界,一切都会正常进行。我想在图块实体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以便可以在世界负载下创建它?
为此,如果在给定的
hasTileEntity
和return true
中包含TileEntity以返回新的TileEntity,则您的Block应该将IBlockState
覆盖为createTileEntity
。最后但并非最不重要的一点是,您必须在GameRegistry中注册TileEntity
GameRegistry.registerTileEntity(YourTileEntity.class, "YourModid:ResourceString");
关于java - 客户端与服务器端的NBT加载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46757423/