清华儒墨
我知道由于Client与Server的关系,所以TileEntity的数值需要更新至Client
可是就算我在每次tick的时候更新一次,还是没有效果。
示例:

(那条进度条不用理 未实作)
从上图可见,Stored: 是直接从TileEntity取出的数值,
红色进度条上显示的则是gui取得的数值
当我把TileEntity中的能量抽走,gui不会更新。


甚么都不做就会出现上图的结果
那么,我尝试在TileEntity(implements ITickable)中的update()加上这行:
  1. if(world.isRemote) world.notifyBlockUpdate(pos, getState(), getState(), 3);
复制代码
还是同样的结果

还是我省略了一些重要的步骤?
我参考这个Furnace源代码的时候发现他也是用这行用作更新。




bxz2311196368
注意 这一段,这才是与客户端同步TE数据调用的方法。
如果不重写这些方法,那么  world.notifyBlockUpdate 只会更新 BlockState,不会同步TE数据。

清华儒墨
本帖最后由 s091424 于 2019-5-4 22:18 编辑
bxz2311196368 发表于 2019-5-4 20:50
注意 这一段,这才是与客户端同步TE数据调用的方法。
如果不重写这些方法,那么  world.notifyBlockUpdate  ...

已经重写了这些方法,但是问题还在
附上write与readNBT的method
  1. @Override
  2.     public NBTTagCompound writeToNBT(NBTTagCompound compound) {

  3.         super.writeToNBT(compound);

  4.         compound.setTag("inventory", inventory.serializeNBT());
  5.         compound.setInteger("generateTick", generateTick);
  6.         storage.writeToNBT(compound);
  7.         return compound;
  8.     }

  9.     @Override
  10.     public void readFromNBT(NBTTagCompound compound) {
  11.         super.readFromNBT(compound);

  12.         inventory.deserializeNBT(compound.getCompoundTag("inventory"));
  13.         generateTick = compound.getInteger("generateTick");
  14.         storage.readFromNBT(compound);

  15.     }
复制代码
  1.     @Override
  2.     @Nullable
  3.     public SPacketUpdateTileEntity getUpdatePacket() {
  4.         NBTTagCompound updateTagDescribingTileEntityState = getUpdateTag();
  5.         final int METADATA = 0;
  6.         return new SPacketUpdateTileEntity(this.pos, METADATA, updateTagDescribingTileEntityState);
  7.     }

  8.     @Override
  9.     public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
  10.         NBTTagCompound updateTagDescribingTileEntityState = pkt.getNbtCompound();
  11.         handleUpdateTag(updateTagDescribingTileEntityState);
  12.     }

  13.     @Override
  14.     public NBTTagCompound getUpdateTag() {
  15.         NBTTagCompound nbtTagCompound = new NBTTagCompound();
  16.         return writeToNBT(nbtTagCompound);
  17.     }

  18.     @Override
  19.     public void handleUpdateTag(NBTTagCompound tag) {
  20.         this.readFromNBT(tag);
  21.     }
复制代码

bxz2311196368
在GUI中进行同步需要重写 这一部分 (注意看注释)。

bxz2311196368
以上,TE中的4个方法在区块加载阶段触发。GUI的方法只在GUI打开阶段循环触发。
如果需要全程进行同步,那么需要手动发送数据包参照 4z教程


3TUSK
bxz2311196368 发表于 2019-5-4 22:35
以上,TE中的4个方法在区块加载阶段触发。GUI的方法只在GUI打开阶段循环触发。
如果需要全程进行同步,那么 ...

补一句,getUpdatePacket()onDataPacket() 只会在 setBlockState()/notifyBlockUpdate 的时候触发,getUpdateTag()/handleUpdateTag() 只在区块加载时触发。

第一页 上一页 下一页 最后一页