数据system
  1.                    
  2.                     entity.setname("magicbullet.png");
  3.                     MessagePositionHistory message = new MessagePositionHistory();
  4.                     message.entity=entity;
  5.                     message.nbt = new NBTTagCompound();

  6.                     message.nbt.setString("name","magicbullet.png");
  7.                     NetworkLoader.instance.sendToAll(message);
复制代码
  1. public class MessagePositionHistory implements IMessage
  2. {
  3.     public NBTTagCompound nbt;
  4.         public EntityMagicBullet entity;

  5.     @Override
  6.     public void fromBytes(ByteBuf buf)
  7.     {
  8.         nbt = ByteBufUtils.readTag(buf);
  9.     }

  10.     @Override
  11.     public void toBytes(ByteBuf buf)
  12.     {
  13.         ByteBufUtils.writeTag(buf, nbt);
  14.     }
  15.    
  16.     public static class Handler implements IMessageHandler<MessagePositionHistory, IMessage>
  17.     {
  18.         @Override
  19.         public IMessage onMessage(MessagePositionHistory message, MessageContext ctx)
  20.         {
  21.             if (ctx.side == Side.CLIENT)
  22.             {
  23.                 final String name = message.nbt.getString("name");
  24.                 Minecraft.getMinecraft().addScheduledTask(new Runnable()
  25.                 {
  26.                     @Override
  27.                     public void run()
  28.                     {
  29.                             //EntityPlayer player = Minecraft.getMinecraft().player;
  30.                             EntityMagicBullet e= message.entity;
  31.                             e.setname(name);
  32.                     }
  33.                 });
  34.             }
  35.             return null;
  36.         }
  37.     }
  38. }
复制代码


如题,应该如何将服务端对自定义的数据同步到客户端,这样写似乎没有作用,是实体的数据没传输过去吗?应该如何去客户端同步某一实体的数据。

数据system
没有大佬能来解答一下吗?

3TUSK
  1. Minecraft.getMinecraft().addScheduledTask(new Runnable()
  2.                 {
  3.                     @Override
  4.                     public void run()
  5.                     {
  6.                             //EntityPlayer player = Minecraft.getMinecraft().player;
  7.                             EntityMagicBullet e= message.entity;
  8.                             e.setname(name);
  9.                     }
  10.                 });
复制代码

显然你没有在这个数据包里写明“我要同步的是哪一个实体”。所以没有效果。

sendToAll 方法是“面向玩家”的,也就是说你发送数据包,收数据包的人是你的玩家。玩家的客户端负责处理数据。你不写清楚是哪一个实体的数据需要同步,那玩家的客户端也就不知道哪一个实体的数据需要同步。
具体来说,fromBytes() 方法里你不仅要从 ByteBuf 里读实体信息,还要读“是哪一个实体”。




题外话,这个需求看上去用 DataParameter<?> 更好一点。一次同步一整个 NBT?你在浪费流量。

数据system
本帖最后由 数据system 于 2020-4-2 10:29 编辑
3TUSK 发表于 2020-4-2 03:01
显然你没有在这个数据包里写明“我要同步的是哪一个实体”。所以没有效果。

sendToAll 方法是“面向玩家 ...

大佬这个该怎么去读取实体,ByteBufUtils好像没有读取实体的方法,这方面我实在不会,请问有教程之类的资料吗?

洞穴夜莺
数据system 发表于 2020-4-2 10:28
大佬这个该怎么去读取实体,ByteBufUtils好像没有读取实体的方法,这方面我实在不会,请问有教程之类的资料 ...

读取实体的UUID,在客户端根据UUID找到这个实体

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