轻光233
如题,代码如下

PlayerInteractManager的构造方法我传的参数是world
参照(照抄)spigotmc论坛上的一位dalao的生成假人的方法(链接),把用原生nms发包换成了ProtocolLib发(nms发包之前试过,客户端会断线)
可我万万没想到,还是断线了

求dalao看看这是咋回事qwq

Dante_7
本帖最后由 凋灵兔子 于 2019-8-18 15:58 编辑

经过一波操作, 没能解决, 版主扣分吧

lgou2w
看了一下代码,可以确定你的数据包实例没有修改正确的字段值。原帖是通过直接调用 NMS 实现的,而是你通过 ProtocolLib 方式,这种方式是创建无参构造实例然后反射修改字段值实现的。而 PacketPlayOutPlayerInfo 有 2 个字段,PacketPlayOutNamedEntitySpawn 有 9 个字段。详情可以通过反编译服务端查看。
  1. Player player = ...;
  2.   Location location = player.getLocation().clone();
  3.   MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
  4.   WorldServer worldServer = ((CraftWorld) player.getWorld()).getHandle();
  5.   GameProfile gameProfile = new GameProfile(UUID.randomUUID(), "FakePlayer");
  6.   PlayerInteractManager interactManager = new PlayerInteractManager(worldServer);
  7.   EntityPlayer dummy = new EntityPlayer(server, worldServer, gameProfile, interactManager);
  8.   dummy.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());

  9.   List<PlayerInfoData> infoDataList = new ArrayList<>();
  10.   infoDataList.add(new PlayerInfoData(
  11.       new WrappedGameProfile(gameProfile.getId(), gameProfile.getName()),
  12.       0,
  13.       EnumWrappers.NativeGameMode.SURVIVAL,
  14.       WrappedChatComponent.fromText(gameProfile.getName())
  15.   ));

  16.   PacketContainer ppopi = new PacketContainer(PacketType.Play.Server.PLAYER_INFO);
  17.   PacketContainer ppones = new PacketContainer(PacketType.Play.Server.NAMED_ENTITY_SPAWN);

  18.   ppopi.getPlayerInfoAction().write(0, EnumWrappers.PlayerInfoAction.ADD_PLAYER);
  19.   ppopi.getPlayerInfoDataLists().write(0, infoDataList);

  20.   ppones.getIntegers().write(0, dummy.getId());
  21.   ppones.getUUIDs().write(0, gameProfile.getId());
  22.   ppones.getDoubles().write(0, dummy.locX);
  23.   ppones.getDoubles().write(1, dummy.locY);
  24.   ppones.getDoubles().write(2, dummy.locZ);
  25.   ppones.getBytes().write(0, (byte) (int) (dummy.yaw * 256f / 360f));
  26.   ppones.getBytes().write(1, (byte) (int) (dummy.pitch * 256f / 360f));
  27.   ppones.getDataWatcherModifier().write(0, new WrappedDataWatcher(dummy));

  28.   try {
  29.     ProtocolLibrary.getProtocolManager().sendServerPacket(player, ppopi);
  30.     ProtocolLibrary.getProtocolManager().sendServerPacket(player, ppones);
  31.   } catch (InvocationTargetException e) {
  32.     e.printStackTrace();
  33.   }
复制代码

轻光233
本帖最后由 轻光233 于 2019-8-18 19:41 编辑
lgou2w 发表于 2019-8-18 18:43
看了一下代码,可以确定你的数据包实例没有修改正确的字段值。原帖是通过直接调用 NMS 实现的,而是你通过  ...

请问那个PlayerInfoData是nms包里的吗?

a8105
轻光233 发表于 2019-8-18 19:07
那啥dalao
这个PlayerInfoData是nms包里的吗?
我导入之后参数类型和你的完全不一样... ...

PlayerInfoData是ProtocolLib的,不是nms的

轻光233
本帖最后由 轻光233 于 2019-8-18 20:08 编辑
lgou2w 发表于 2019-8-18 18:43
看了一下代码,可以确定你的数据包实例没有修改正确的字段值。原帖是通过直接调用 NMS 实现的,而是你通过  ...
冒昧问下dalao的qq是啥