如题,代码如下
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包里的吗?