EntityMetadata 数据包问题

EntityMetadata packet issue

我试图让玩家看起来像是在 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,但理想情况下我正在寻找一种使用数据包的解决方案。

问题是您使用了错误的更新方法。 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 的引用以更好地控制数据包。