如题,代码如下
 
 
PlayerInteractManager的构造方法我传的参数是world
参照(照抄)spigotmc论坛上的一位dalao的生成假人的方法(链接),把用原生nms发包换成了ProtocolLib发(nms发包之前试过,客户端会断线)
可我万万没想到,还是断线了
 
 
求dalao看看这是咋回事qwq
 
PlayerInteractManager的构造方法我传的参数是world
参照(照抄)spigotmc论坛上的一位dalao的生成假人的方法(链接),把用原生nms发包换成了ProtocolLib发(nms发包之前试过,客户端会断线)
可我万万没想到,还是断线了
 
求dalao看看这是咋回事qwq
 本帖最后由 凋灵兔子 于 2019-8-18 15:58 编辑 
经过一波操作, 没能解决, 版主扣分吧
经过一波操作, 没能解决, 版主扣分吧
看了一下代码,可以确定你的数据包实例没有修改正确的字段值。原帖是通过直接调用 NMS 实现的,而是你通过 ProtocolLib 方式,这种方式是创建无参构造实例然后反射修改字段值实现的。而 PacketPlayOutPlayerInfo 有 2 个字段,PacketPlayOutNamedEntitySpawn 有 9 个字段。详情可以通过反编译服务端查看。
复制代码
- Player player = ...;
 
-   Location location = player.getLocation().clone();
 
-   MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
 
-   WorldServer worldServer = ((CraftWorld) player.getWorld()).getHandle();
 
-   GameProfile gameProfile = new GameProfile(UUID.randomUUID(), "FakePlayer");
 
-   PlayerInteractManager interactManager = new PlayerInteractManager(worldServer);
 
-   EntityPlayer dummy = new EntityPlayer(server, worldServer, gameProfile, interactManager);
 
-   dummy.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
 
 
-   List<PlayerInfoData> infoDataList = new ArrayList<>();
 
-   infoDataList.add(new PlayerInfoData(
 
-       new WrappedGameProfile(gameProfile.getId(), gameProfile.getName()),
 
-       0,
 
-       EnumWrappers.NativeGameMode.SURVIVAL,
 
-       WrappedChatComponent.fromText(gameProfile.getName())
 
-   ));
 
 
-   PacketContainer ppopi = new PacketContainer(PacketType.Play.Server.PLAYER_INFO);
 
-   PacketContainer ppones = new PacketContainer(PacketType.Play.Server.NAMED_ENTITY_SPAWN);
 
 
-   ppopi.getPlayerInfoAction().write(0, EnumWrappers.PlayerInfoAction.ADD_PLAYER);
 
-   ppopi.getPlayerInfoDataLists().write(0, infoDataList);
 
 
-   ppones.getIntegers().write(0, dummy.getId());
 
-   ppones.getUUIDs().write(0, gameProfile.getId());
 
-   ppones.getDoubles().write(0, dummy.locX);
 
-   ppones.getDoubles().write(1, dummy.locY);
 
-   ppones.getDoubles().write(2, dummy.locZ);
 
-   ppones.getBytes().write(0, (byte) (int) (dummy.yaw * 256f / 360f));
 
-   ppones.getBytes().write(1, (byte) (int) (dummy.pitch * 256f / 360f));
 
-   ppones.getDataWatcherModifier().write(0, new WrappedDataWatcher(dummy));
 
 
-   try {
 
-     ProtocolLibrary.getProtocolManager().sendServerPacket(player, ppopi);
 
-     ProtocolLibrary.getProtocolManager().sendServerPacket(player, ppones);
 
-   } catch (InvocationTargetException e) {
 
-     e.printStackTrace();
 
- }
 本帖最后由 轻光233 于 2019-8-18 19:41 编辑 
请问那个PlayerInfoData是nms包里的吗?
lgou2w 发表于 2019-8-18 18:43
看了一下代码,可以确定你的数据包实例没有修改正确的字段值。原帖是通过直接调用 NMS 实现的,而是你通过 ...
请问那个PlayerInfoData是nms包里的吗?
轻光233 发表于 2019-8-18 19:07
那啥dalao
这个PlayerInfoData是nms包里的吗?
我导入之后参数类型和你的完全不一样... ...
PlayerInfoData是ProtocolLib的,不是nms的
 本帖最后由 轻光233 于 2019-8-18 20:08 编辑 
冒昧问下dalao的qq是啥
lgou2w 发表于 2019-8-18 18:43
看了一下代码,可以确定你的数据包实例没有修改正确的字段值。原帖是通过直接调用 NMS 实现的,而是你通过 ...