我有一个项目,当用鼠标右键单击特定块时,应添加该块的坐标。坐标存储在NBTTagList中。
问题在于,不会保存对ItemStack的更改。它不会保存在level.dat中,后者将玩家的物品保存在单个玩家中。同样,使用数据的addInformation方法也不会得到任何结果。
资料来源:
目标块类的onBlockActivate方法:
if (player.getCurrentEquippedItem() != null &&
player.getCurrentEquippedItem().getItem() == ModItems.teleportationTablet) {
if (world.isRemote) {
ItemStack teletab = player.getCurrentEquippedItem().copy();
if (teletab.stackTagCompound == null)
teletab.stackTagCompound = new NBTTagCompound();
NBTTagList targets = teletab.stackTagCompound.getTagList("targets", 10);
NBTTagCompound location = new NBTTagCompound();
location.setInteger("x", x);
location.setInteger("y", y);
location.setInteger("z", z);
location.setInteger("dim", world.provider.dimensionId);
targets.appendTag(location);
teletab.stackTagCompound.setTag("targets", targets);
player.addChatMessage(new ChatComponentText("Your teleportation tablet is now linked!"));
}
return true;
}
return false;
}
item类中的方法:
@Override
public void addInformation(ItemStack teletab, EntityPlayer player, List list, boolean par4) {
NBTTagCompound tag = teletab.getTagCompound();
if (tag != null) {
NBTTagList targets = tag.getTagList("targets", 10);
if (targets.tagCount() != 0)
for (int i = 0; i < targets.tagCount(); i++) {
NBTTagCompound target = targets.getCompoundTagAt(i);
list.add(String.format("Linked with target at X=%d, Y=%d, Z=%d, Dim=%d", target.getInteger("x"), target.getInteger("y"), target.getInteger("z"), target.getInteger("dim")));
}
}
}
@Override
public void onCreated(ItemStack stack, World world, EntityPlayer player) {
stack.setTagCompound(new NBTTagCompound());
stack.stackTagCompound.setTag("targets", new NBTTagList());
}
最佳答案
尝试改变
if (world.isRemote) {
至
if (!world.isRemote) {
编辑#1:
isRemote
标志可能会造成混淆。它用于显示对世界的参考是否遥远。对于客户端,一个远程世界(其中isRemote == true
)表明该世界实际上位于服务器上,因此不应进行任何更改。可以使用它(通常是这样)来显示当前正在运行的代码是服务器端还是客户端。这意味着仅在
isRemote == false
时才应更改世界,这意味着当前正在运行的代码有权直接更改事物。由于您运行的代码会更改
isRemote == true
所在位置的内容(确切地说是ItemStack的NBT标记),因此会发生问题,因为当前运行的代码无法应用这些更改,因为实际的世界对象在服务器上。