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 的引用以更好地控制数据包。
我试图让玩家看起来像是在 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 的引用以更好地控制数据包。