Помогите Получить игроков рядом , расстояние и направление до них

  • Автор темы Автор темы swat1x
  • Дата начала Дата начала

swat1x

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
swat1x
Как можно получить игроков рядом я вроде понимаю, и расстояние до них вроде тоже, но не точно, но вот как получить их расположение относительно игрока. К примеру если спереди, то "Север", если между Левом и передом, то "Северо-Запад", и т.п. (Север и Северо-Запад не мира, а относительно самого игрока.) Это возможно реализовать, т.к. я уже видел это на сервере.
 
Как можно получить игроков рядом я вроде понимаю, и расстояние до них вроде тоже, но не точно, но вот как получить их расположение относительно игрока. К примеру если спереди, то "Север", если между Левом и передом, то "Северо-Запад", и т.п. (Север и Северо-Запад не мира, а относительно самого игрока.) Это возможно реализовать, т.к. я уже видел это на сервере.
Почить игроков например так:
Код:
      public String GetNearPlayer(Player player1) // получение списка игроков которые находяться рядом
      {
          final long radius = 100;
            final Location loc = player1.getLocation();
            final World world = loc.getWorld();
            final StringBuilder output = new StringBuilder();
            final long radiusSquared = radius * radius;

            for (Player player2: getServer().getOnlinePlayers())
            {
                    final Location playerLoc = player2.getLocation();
                    if (playerLoc.getWorld() != world || player2.getDisplayName() == player1.getDisplayName())
                    {
                        continue;
                    }

                    final long delta = (long)playerLoc.distanceSquared(loc);
                    if (delta < radiusSquared)
                    {
                        if (output.length() > 0)
                        {
                            output.append(", ");
                        }
                        output.append(player2.getDisplayName()).append("(").append((long)Math.sqrt(delta)).append("m)");
                    }
                }
            return output.length() > 1 ? output.toString() : "none";
      }
Определить градус до игрока можно так, код не проверял:
Код:
                      double xDiff = loc.getX() - playerLoc.getX();
                      double zDiff = loc.getZ() - playerLoc.getZ();
                     
                      double yawAngleToPlayer = Math.toDegrees(Math.atan2(zDiff, xDiff));
 
Последнее редактирование:
Направление:
Код:
public Vector findPath(Location from, Location to) {
        double dX = from.getX() - to.getX();
        double dY = from.getY() - to.getY();
        double dZ = from.getZ() - to.getZ();
        double yaw = Math.atan2(dZ, dX);
        double pitch = Math.atan2(Math.sqrt(dZ * dZ + dX * dX), dY) + Math.PI;
        double X = Math.sin(pitch) * Math.cos(yaw);
        double Y = Math.sin(pitch) * Math.sin(yaw);
        double Z = Math.cos(pitch);
        Vector vector = new Vector(X, Z, Y);
        return vector;
    }
Был еще один метод, который делает тоже самое. Посмотри в доках класса Vector.
 
Направление:
Код:
public Vector findPath(Location from, Location to) {
        double dX = from.getX() - to.getX();
        double dY = from.getY() - to.getY();
        double dZ = from.getZ() - to.getZ();
        double yaw = Math.atan2(dZ, dX);
        double pitch = Math.atan2(Math.sqrt(dZ * dZ + dX * dX), dY) + Math.PI;
        double X = Math.sin(pitch) * Math.cos(yaw);
        double Y = Math.sin(pitch) * Math.sin(yaw);
        double Z = Math.cos(pitch);
        Vector vector = new Vector(X, Z, Y);
        return vector;
    }
Был еще один метод, который делает тоже самое. Посмотри в доках класса Vector.
targetLocation.setDirection(targetLocation.toVector().subtract(location.toVector()));
targetLocation.distance(location);
 
Не нужно искать сервер относительно игрока. Чтобы игрокам было легче ореинтироваться, сервер = перед
 
Не нужно искать сервер относительно игрока. Чтобы игрокам было легче ореинтироваться, сервер = перед
Север это север, он в одной стороне, не проще уж тогда написать в какую сторону? Для удобства можно символы стрелочек юзать, а не непонятное направление севера, который не север.
Алексанлраге не понял, что я шучу(
 
Север это север, он в одной стороне, не проще уж тогда написать в какую сторону? Для удобства можно символы стрелочек юзать, а не непонятное направление севера, который не север.
Алексанлраге не понял, что я шучу(
Если тебе говорят идти на север, то логично что ты подумаешь, что надо идти вперёд
 
Направление:
Код:
public Vector findPath(Location from, Location to) {
        double dX = from.getX() - to.getX();
        double dY = from.getY() - to.getY();
        double dZ = from.getZ() - to.getZ();
        double yaw = Math.atan2(dZ, dX);
        double pitch = Math.atan2(Math.sqrt(dZ * dZ + dX * dX), dY) + Math.PI;
        double X = Math.sin(pitch) * Math.cos(yaw);
        double Y = Math.sin(pitch) * Math.sin(yaw);
        double Z = Math.cos(pitch);
        Vector vector = new Vector(X, Z, Y);
        return vector;
    }
Был еще один метод, который делает тоже самое. Посмотри в доках класса Vector.
Это считается вектор относительно положения, а мне нужно относительно направления взгляда, т.е. направление относительно взгляда игрока
 
Тебе нужно направить игрока на другого игрока?
 
Я зачем-то написал про север и северо-запад. Просто направление
 
Так этот метод и вернет направление до игрока по локации.
 
1 направление
upload_2021-3-26_23-42-47.png
2 направление
upload_2021-3-26_23-43-21.png
числа одинаковые, хотя разные направления
код:
Код:
static public Vector findPath(Location from, Location to) {
        double dX = from.getX() - to.getX();
        double dY = from.getY() - to.getY();
        double dZ = from.getZ() - to.getZ();
        double yaw = Math.atan2(dZ, dX);
        double pitch = Math.atan2(Math.sqrt(dZ * dZ + dX * dX), dY) + Math.PI;
        double X = Math.sin(pitch) * Math.cos(yaw);
        double Y = Math.sin(pitch) * Math.sin(yaw);
        double Z = Math.cos(pitch);
        Vector vector = new Vector(X, Z, Y);
        return vector;
    }
    
    static public String GetNearPlayer(Player player1) // получение списка игроков которые находяться рядом
    {
        final long radius = 100;
          final Location loc = player1.getLocation();
          final World world = loc.getWorld();
          final StringBuilder output = new StringBuilder();
          final long radiusSquared = radius * radius;

          for (Player player2: Bukkit.getServer().getOnlinePlayers())
          {
                  final Location playerLoc = player2.getLocation();
                  if (playerLoc.getWorld() != world || player2.getDisplayName() == player1.getDisplayName())
                  {
                      continue;
                  }

                  final long delta = (long)playerLoc.distanceSquared(loc);
                  if (delta < radiusSquared)
                  {
                      if (output.length() > 0)
                      {
                          output.append("§f,§e ");
                      }
                      output.append("§e"+player2.getDisplayName()).append(" §7(").append((long)Math.sqrt(delta)).append("м) §fто что выдаёт findPath §a"+findPath(loc, playerLoc));
                  }
              }
          return output.length() > 1 ? output.toString() : "none";
    }
 
Ты должен поставить игроку direction вектора из метода find path
 
Назад
Верх