gpt4 book ai didi

java - EntityMetadata 数据包问题

转载 作者:行者123 更新时间:2023-12-05 04:10:47 24 4
gpt4 key购买 nike

基于 http://wiki.vg/Entities#Entity_Metadata_Format,我试图让玩家看起来像是在运行 Spigot 的 Minecraft 1.8.8 上偷偷摸摸(蹲伏)。我做了以下事情:

创建了一个数据观察器并为 wiki 中的 crouched 映射了适当的值:

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 中有一个内部 boolean 值用于检查更新。有两种方法可以解决这个问题。

使用 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...

跳过内部 boolean 值(不推荐):

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...

附言如果那是一个假实体,我建议实例化 EntityPlayer 的引用以更好地控制数据包。

关于java - EntityMetadata 数据包问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43972766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com