我试图让玩家看起来像是在Minecraft 1.8.8上运行Spigot偷偷摸摸(蹲伏),基于http://wiki.vg/Entities#Entity_Metadata_Format我做了以下事情:
创建了一个数据观察器,并为wiki中的蹲伏映射了适当的值:
DataWatcher dw = new DataWatcher(null);
dw.a(0, (byte) 0x02);
创建了数据包,其中target是需要潜行的玩家的Player对象:
PacketPlayOutEntityMetadata metadataPacket = new PacketPlayOutEntityMetadata(target.getEntityId(), dw, false);
将数据包发送给所有人:
for (Player p : Bukkit.getOnlinePlayers()) {
((CraftPlayer) p).getHandle().playerConnection.sendPacket(metadataPacket);
}
这看起来似乎没有用,怎么会这样做呢?
我也试图使用ProtocolLib,但理想情况下我正在寻找一种使用数据包的解决方案。
答案 0 :(得分:2)
问题是您使用了错误的方法进行更新。 datawatcher中有一个内部布尔值,用于检查更新。有两种方法可以解决这个问题。
使用DataWatcher #watch:
Player target = Bukkit.getPlayer("RandomGuy");
DataWatcher dw = ((CraftPlayer) target).getHandle().getDataWatcher();
dw.watch(0, (byte) 2);
PacketPlayOutEntityMetadata metadataPacket = new PacketPlayOutEntityMetadata(target.getEntityId(), dw, false);
//sending packet...
跳过内部布尔值(不推荐):
Player target = Bukkit.getPlayer("RandomGuy");
DataWatcher dw = ((CraftPlayer) target).getHandle().getDataWatcher();
dw.a(0, (byte) 2);
PacketPlayOutEntityMetadata metadataPacket = new PacketPlayOutEntityMetadata(target.getEntityId(), dw, true);
//sending packet...
P.S。如果这是假实体,我建议实例化EntityPlayer的引用以获得更好的数据包控制。