无谓狗蛋
如题所示,不管是spawn时的包还是后面entityV的包都试过了,都没有办法给实体速度
是我哪里写错了吗?
(补:
啊,忘记说了
paper_1.12.2_1618
ProtocolLib :4.4.0-b421




这里是生成带有速度实体的包:
  1.                     Player p = (Player) commandSender;
  2.                     Location loc = ((Player) commandSender).getLocation();
  3.                     PacketContainer packet = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING);
  4.                     packet.getIntegers().write(0,1);
  5.                     packet.getUUIDs().write(0, UUID.randomUUID());
  6.                     packet.getIntegers().write(1,(int) EntityType.ZOMBIE.getTypeId());
  7.                     packet.getDoubles().write(0, loc.getX()+1);
  8.                     packet.getDoubles().write(1, loc.getY());
  9.                     packet.getDoubles().write(2, loc.getZ());

  10.                     //这里应该是速度,如PacketPlayOutSpawnEntityLiving包中对应的第2、3、4个int
  11.                     packet.getIntegers().write(2,10);
  12.                     packet.getIntegers().write(3,10);
  13.                     packet.getIntegers().write(4,10);
  14.                     
  15.                     Zb zb = new Zb(loc);
  16.                     CraftWorld craftWorld = (CraftWorld) loc.getWorld();
  17.                     Entity entity = craftWorld.addEntity(zb, CreatureSpawnEvent.SpawnReason.CUSTOM);
  18.                     WrappedDataWatcher watcher = WrappedDataWatcher.getEntityWatcher(entity).deepClone();
  19.                     entity.remove();
  20.                     packet.getDataWatcherModifier().write(0,watcher);
  21.                     try{
  22.                         p.sendMessage("debug");
  23.                         ProtocolLibrary.getProtocolManager().sendServerPacket(p,packet);
  24.                     } catch (InvocationTargetException ex){
  25.                         ex.printStackTrace();
  26.                     }
复制代码


这里是尝试后面发送EntityVelocity改变实体速度:

  1.             Player p = e.getPlayer();
  2.             Location loc = p.getLocation();
  3.             PacketContainer packet2 = new PacketContainer(PacketType.Play.Server.ENTITY_VELOCITY);
  4.             packet2.getModifier().writeDefaults();
  5.             packet2.getIntegers().write(0,1);
  6.             
  7.             //这里应该是int的速度值
  8.             packet2.getIntegers().write(1, (int) (p.getVelocity().getX()+1));
  9.             packet2.getIntegers().write(2, (int) (p.getVelocity().getY()+1));
  10.             packet2.getIntegers().write(3, (int) (p.getVelocity().getZ()+1));
  11.             
  12.             try{
  13.                 p.sendMessage("debug3");
  14.                 ProtocolLibrary.getProtocolManager().sendServerPacket(p,packet2);
  15.             } catch (InvocationTargetException ex){
  16.                 ex.printStackTrace();
  17.             }
复制代码



结果是两种方法都不能给这个发包生成的实体速度(为什么不动!)
搞不懂,救命




cnYeqi
本帖最后由 cnYeqi 于 2022-9-20 20:10 编辑

对发包没什么研究,我没找到SPAWN_ENTITY_LIVING 只找到了SPAWN_ENTITY
https://wiki.vg/Protocol#Spawn_Entity

我这里看速度是short类型


用.getShorts().write() 写入试试

无谓狗蛋
本帖最后由 无谓狗蛋 于 2022-9-20 20:36 编辑
cnYeqi 发表于 2022-9-20 20:05
对发包没什么研究,我没找到SPAWN_ENTITY_LIVING 只找到了SPAWN_ENTITY
https://wiki.vg/Protocol#Spawn_En ...

当我尝试写入short值时会报错提示该包无法写入short值
1.12.2SPAWN_ENTITY发包无法生成实体。。。只有SPAWN_ENTITY_LIVING可以(还是说是我写法有问题?应该不会。。。)
我提供的两个图片就是所用版本核心nms里对应类。。。里面用红色圈出来的就是速度值,他是用int值写入的...

HYFan_Meng
参数根据nms顺序填写,然后写寻路AI让虚拟实体跟随玩家