EntityMetadata数据包问题

时间:2017-05-15 06:28:42

标签: java bukkit

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

1 个答案:

答案 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的引用以获得更好的数据包控制。