美年达呀
非常感谢你在百忙之中看我的帖子!!

问题:刚学NMS,虽然可以直接通过通过Player直接获取到位置,但是想尝试练习发包获取玩家飞行的数据,经过查阅找到(PacketPlayInFlying类),里面中
PacketPlayInPosition类中有一个 a(PacketDataSerializer var1)方法

已尝试思路:1.将PacketDataSerializer参数传进去,再通过反射获取相关字段,即可获取相关x,y,z等字段数据
测试代码:
  1. PacketPlayInFlying.PacketPlayInPosition packetPlayInFlyingObject = new PacketPlayInFlying.PacketPlayInPosition();
  2.                         ByteBuf byteBuf = Unpooled.buffer();
  3.                         byteBuf.writeDouble(10);
  4.                         PacketDataSerializer packetDataSerializer = new PacketDataSerializer(byteBuf);
  5. //                        packetDataSerializer.writeDouble(5);
  6.                         packetPlayInFlyingObject.a(packetDataSerializer);
  7.                         double x = packetPlayInFlyingObject.a(5);
  8.                         double y = packetPlayInFlyingObject.a(5);
  9.                         double z = packetPlayInFlyingObject.a(5);

  10.                         Class nms = MarindaPluginTest.getNMSClass("PacketPlayInFlying");
  11.                         Object obj = nms.newInstance();
  12.                         for(Field field: nms.getDeclaredFields()){
  13.                             field.setAccessible(true);
  14.                             System.out.println("attr: " + field.get(obj));
  15.                         }

  16.                         System.out.println(String.format("x:%d y:%d,z: %d",x,y,z));
  17.                         playerConnection.sendPacket(packetPlayInFlyingObject);
复制代码
控制台结果:




以下是类的介绍




如果我的思路有问题的话,希望大佬们可以指正一下,非常感谢!

catcatMiao
那是不是代表着,如果玩家通过作弊进行飞行,也可以及时检测到?

洞穴夜莺
不太清楚你为什么觉得这个方案可行,人家要3个double,你只写一个进去
而且你这包是自行伪造的,又不是玩家发的,怎么能获取到玩家位置?

美年达呀
本帖最后由 美年达呀 于 2022-9-8 09:48 编辑
洞穴夜莺 发表于 2022-9-8 09:27
不太清楚你为什么觉得这个方案可行,人家要3个double,你只写一个进去
而且你这包是自行伪造的,又不是玩家 ...

当时见名思意,猜测那么使用,关于double那一块,a方法 readDouble了三次,所以我以为单独writeDouble一次就可以了!你能否提供一个可行度较高的思路或者示例代码吗?权当学习交流,不胜感激!

洞穴夜莺
美年达呀 发表于 2022-9-8 09:43
当时见名思意,猜测那么使用,关于double那一块,a方法 readDouble了三次,所以我以为单独writeDouble一次 ...

他read了三次,你也得write三次
如果你想用网络手段获取玩家位置,建议用ProtocolLib或ProtocolSupport之流拦截玩家发送的网络包

美年达呀
洞穴夜莺 发表于 2022-9-8 10:31
他read了三次,你也得write三次
如果你想用网络手段获取玩家位置,建议用ProtocolLib或ProtocolSupport之 ...

感谢你的回答!三次Write结果一致
刚学nms暂未考虑使用ProtocolLib,除开这两种方式是否还有其他方式能够获取到玩家飞行的相关数据信息吗?
如果没有的话,那是否只能考虑通过Player.getLocation来拿相关位置了!

耗子
本帖最后由 耗子 于 2022-9-8 13:55 编辑

这个类是PacketPlayIn开头的,In是输入,这个包是客户端发给服务端的,不是服务端发给客户端的。此外,这个类的名字并不准确,根据内容判断,这个类就是玩家移动包类,如果要获取玩家移动,请使用PlayerMoveEvent。总的来说完全不是什么能够获取玩家飞行相关信息的包。

美年达呀
耗子 发表于 2022-9-8 13:52
这个类是PacketPlayIn开头的,In是输入,这个包是客户端发给服务端的,不是服务端发给客户端的。此外,这个 ...

谢谢大佬长文回复和解析,大致知晓了,非常感谢回复!