Помогите Вселение в камеру игрока

  • Автор темы Автор темы Phizzle
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Phizzle

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Phizzle
Привет всем, как написать пакет, чтобы вселять игрока в камеру другого игрока, по типу гм3 + пкм по игроку, но не выдавая при этом гм3
 
но не выдавая при этом гм3
никак. сохраняешь старый гм, включаешь гм 3 и player.setSpectatorTarget(target). Не знаю есть ли евент, но через шедулер можно чекать, если player.getSpectatorTarget() == null, то возвращать старый гм.
 
никак. сохраняешь старый гм, включаешь гм 3 и player.setSpectatorTarget(target). Не знаю есть ли евент, но через шедулер можно чекать, если player.getSpectatorTarget() == null, то возвращать старый гм.
а что на счёт PacketPlayOutCamera ?
 
Но ведь для него вроде как нужно выдавать гм3
А в чём проблема выдать гм 3? Проверяй на таргета вот так:
Не знаю есть ли евент, но через шедулер можно чекать, если player.getSpectatorTarget() == null, то возвращать старый гм.
 
Я бы посмотрел, как ты будешь таскать игрока в игроке без гм3.
Не думаю, что есть смысл это делать, просто выдавай гм3. Большинство игроков не смогут ничего сделать.
 
Я бы посмотрел, как ты будешь таскать игрока в игроке без гм3.
Не думаю, что есть смысл это делать, просто выдавай гм3. Большинство игроков не смогут ничего сделать.
Код ласта:
upload_2020-4-19_14-24-58.png

я конечно попробую на секунду выдавать гм3, но не думаю что это верное решение, у них через nms, а я в нём 0
 
на lastcraft & hypixel ведь реализовали без гм3
Код:
    if (command.getName().equalsIgnoreCase("test")) {

      Field b = PacketPlayOutGameStateChange.class.getDeclaredField("b");
      b.setAccessible(true);
      Field c = PacketPlayOutGameStateChange.class.getDeclaredField("c");
      c.setAccessible(true);

      PacketPlayOutGameStateChange gamemodeChange = new PacketPlayOutGameStateChange();
      b.set(gamemodeChange, 3);
      c.set(gamemodeChange, 3f);
      ((CraftPlayer)p).getHandle().playerConnection.sendPacket(gamemodeChange);

      ArmorStand toSpectate = (ArmorStand) p.getWorld()
          .spawnEntity(p.getLocation(), EntityType.ARMOR_STAND); //тут просто игрок будет
      toSpectate.setGravity(false);

      new BukkitRunnable() {
        boolean first = true;
        @SneakyThrows
        @Override
        public void run() {
          if (first) {
            //если вызываем этот метод вместо использования PacketPlayOutCamera, то тогда сервер за нас будет обрабатывать шифт.
            ((CraftPlayer)p).getHandle().setSpectatorTarget(((CraftEntity) toSpectate).getHandle());
            first = false;
          }
          toSpectate.teleport(toSpectate.getLocation().add(0, 0.6, 0));
          if (toSpectate.getLocation().getY() > 255) {
            c.set(gamemodeChange, 0f);
            ((CraftPlayer)p).getHandle().setSpectatorTarget(null);
            ((CraftPlayer)p).getHandle().playerConnection.sendPacket(gamemodeChange);
            cancel();
            toSpectate.remove();
          }
        }
      }.runTaskTimer(this, 2, 1);
    }
Можно так короче сделать, чтобы скрыть панель у игрока.
 
попытался на секунду выдавать гм3, вселять игрока и возвращать гм2, получается так, что следящий просто телепортируется к игроку
upload_2020-4-19_14-44-54.png
 
p.setGameMode вызывает setSpectatorTarget(this), поэтому его просто телепортирует.
 
PHP:
  @SneakyThrows
  @EventHandler
  public void onSneak(PlayerToggleSneakEvent event) {
    //if isSpectating(event.getPlayer()) {
      sendPacket(event.getPlayer(), getCameraPacket(event.getPlayer()));
      sendPacket(event.getPlayer(), getGamemodePacket(GameMode.SURVIVAL));
    //}
  }

  @SneakyThrows
  private PacketPlayOutGameStateChange getGamemodePacket(GameMode gameMode) {
    PacketPlayOutGameStateChange gamemodeChange = new PacketPlayOutGameStateChange();
    Field b = PacketPlayOutGameStateChange.class.getDeclaredField("b");
    b.setAccessible(true);
    Field c = PacketPlayOutGameStateChange.class.getDeclaredField("c");
    c.setAccessible(true);
    b.set(gamemodeChange, 3);
    c.set(gamemodeChange, gameMode.ordinal());
    return gamemodeChange;
  }


  @SneakyThrows
  private PacketPlayOutCamera getCameraPacket(Entity entity) {
    PacketPlayOutCamera camera = new PacketPlayOutCamera(((CraftEntity) entity).getHandle());
    return camera;
  }

  private void sendPacket(Player player, Packet packet) {
    ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
  }

чтобы вселить игрока в когото:

PHP:
sendPacket(player, getGamemodePacket(GameMode.SPECTATOR));
sendPacket(player, getCameraPacket(toSpectate));

чтобы выселить:

PHP:
sendPacket(player, getGamemodePacket(GameMode.SURVIVAL));
sendPacket(player, getCameraPacket(player));
 
PHP:
  @SneakyThrows
  @EventHandler
  public void onSneak(PlayerToggleSneakEvent event) {
    //if isSpectating(event.getPlayer()) {
      sendPacket(event.getPlayer(), getCameraPacket(event.getPlayer()));
      sendPacket(event.getPlayer(), getGamemodePacket(GameMode.SURVIVAL));
    //}
  }

  @SneakyThrows
  private PacketPlayOutGameStateChange getGamemodePacket(GameMode gameMode) {
    PacketPlayOutGameStateChange gamemodeChange = new PacketPlayOutGameStateChange();
    Field b = PacketPlayOutGameStateChange.class.getDeclaredField("b");
    b.setAccessible(true);
    Field c = PacketPlayOutGameStateChange.class.getDeclaredField("c");
    c.setAccessible(true);
    b.set(gamemodeChange, 3);
    c.set(gamemodeChange, gameMode.ordinal());
    return gamemodeChange;
  }


  @SneakyThrows
  private PacketPlayOutCamera getCameraPacket(Entity entity) {
    PacketPlayOutCamera camera = new PacketPlayOutCamera(((CraftEntity) entity).getHandle());
    return camera;
  }

  private void sendPacket(Player player, Packet packet) {
    ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
  }

чтобы вселить игрока в когото:

PHP:
sendPacket(player, getGamemodePacket(GameMode.SPECTATOR));
sendPacket(player, getCameraPacket(toSpectate));

чтобы выселить:

PHP:
sendPacket(player, getGamemodePacket(GameMode.SURVIVAL));
sendPacket(player, getCameraPacket(player));
Спасибо тебе большое, но когда я нажимаю на шифт, меня телепортирует на то место, где я вошел в камеру игрока
UPD: пропадают вещи у наблюдеталя, но они как бы остаются
 
Последнее редактирование:
Спасибо тебе большое, но когда я нажимаю на шифт, меня телепортирует на то место, где я вошел в камеру игрока
ну телепортни сам. сложно чтоли? Когда игрок вселяется в игрока, то по факту он стоит на месте, и просто камера меняется на камеру цели, и если цели например нет в зоне видимости, то тогда и вселятся не будет.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх