Помогите Получить игроков в радиусе

detamusi18429

Участник
Пользователь
Баллы
36
Имя в Minecraft
detamusi18429
Нужно при вводе команды получить в массив всех игроков в округе
 
PHP:
List<Player> players = player.getNearbyEntities(x, y, z).stream().filter(ent -> ent.getType() == EntityType.PLAYER).map(ent -> (Player) ent).collect(Collectors.toList());
Где x, y, z - что-то типа радиуса.
 
PHP:
List<Player> players = player.getNearbyEntities(x, y, z).stream().filter(ent -> ent.getType() == EntityType.PLAYER).map(ent -> (Player) ent).collect(Collectors.toList());
Где x, y, z - что-то типа радиуса.
На переменную ent ругается
PHP:
if (args[0].equalsIgnoreCase("near")) {
               
                Player p = (Player)sender;
               
                Player ent;
               
                List<Player> players = p.getNearbyEntities(p.getLocation().getBlockX(), p.getLocation().getBlockY(), p.getLocation().getBlockZ()).stream().filter(ent -> ent.getType() == EntityType.PLAYER).map(ent -> (Player) ent).collect(Collectors.toList());
               
                sender.sendMessage("§fNear: " + players);
               
                return true;
            }
 
1. Ошибку скрином кинь.
2. У тебя кашу в чат отправит вместо списка ников.
 
Не знаю чё у тебя там, но код рабочий.
На попробуй по проще:
PHP:
List<Player> players = new ArrayList<>();
for (Entity entity : player.getNearbyEntities(x, y, z)) {
    if (entity.getType() == EntityType.PLAYER) {
        players.add(((Player) entity));
    }
}
 
Убери Player ent; свой
 
вроде как команда /near это уже делает, игроки в 200 метрах от тебя.
 
Нужно отрефакторить, правильное решение такое:
Код:
for (Player p : Bukkit.getOnlinePlayers()) {
    if (p.getLocation().distance(ent.getLocation(radius))) {
        // Ваши действия
    }
}

Потому что предложенный ребятами выше метод перебирает ВСЕХ сущностей (мобов, предметов на земле, стрел и т.д., в том числе и игроков), затем сравнивает расстояние КАЖДОЙ, и вы еще делаете проверку на то, игрок ли это.

Нужно брать сразу игроков. А не все сущности, тратить ресурсы на рассчитывание расстояния каждого и только потом отлавливать нужных среди них.
Получается трата ресурсов ни на что. Высчитать кучу дистанций для сотен мобов, дропа, стрел и т.д. Это затратно. Из тысячей сущностей вы итоге возьмете ~10 (именно игроков и именно в радиусе). Какие потери!

Есть решение похуже моего, но уже лучше всех тех, что тут были предложены ранее:
Код:
Iterator<Entity> entity = ent.getWorld().getEntitiesByClasses(new Class[] { Zombie.class /* И другие сущности через запятую, если они нам нужны */ }).iterator();
while (entity.hasNext()) {
    // Проверка на дистанцию, тип сущности (если их в выборке несколько) и сам код. Например у меня только зомби и поэтому я сразу пишу код:
    // Zombie z = (Zombie) entity.next();
    // ...
}
Он хорош для взятия сугубо конкретных сущностей, например только зомби (только забыл в начале сделать проверку на дистанцию, возьмите из первого - оптимального варианта)

@Enotik050505 @Exception_Prototype @Slavkaa, лучше сотрите свои ответы, чтобы не вводить никого в заблуждение. @alexandrage пусть просто посмотрит для себя
 
Последнее редактирование:
Нужно отрефакторить, правильное решение такое:
Код:
for (Player p : Bukkit.getOnlinePlayers()) {
    if (p.getLocation().distance(ent.getLocation(radius))) {
        // Ваши действия
    }
}

Потому что предложенный ребятами выше метод перебирает ВСЕХ сущностей (мобов, предметов на земле, стрел и т.д., в том числе и игроков), затем сравнивает расстояние КАЖДОЙ, и вы еще делаете проверку на то, игрок ли это.

Нужно брать сразу игроков. А не все сущности, тратить ресурсы на рассчитывание расстояния каждого и только потом отлавливать нужных среди них.
Получается трата ресурсов ни на что. Высчитать кучу дистанций для сотен мобов, дропа, стрел и т.д. Это затратно. Из тысячей сущностей вы итоге возьмете ~10 (именно игроков и именно в радиусе). Какие потери!

Есть решение похуже моего, но уже лучше всех тех, что тут были предложены ранее:
Код:
Iterator<Entity> entity = ent.getWorld().getEntitiesByClasses(new Class[] { Zombie.class /* И другие сущности через запятую, если они нам нужны */ }).iterator();
while (entity.hasNext()) {
    // Проверка на дистанцию, тип сущности (если их в выборке несколько) и сам код. Например у меня только зомби и поэтому я сразу пишу код:
    // Zombie z = (Zombie) entity.next();
    // ...
}
Он хорош для взятия сугубо конкретных сущностей, например только зомби (только забыл в начале сделать проверку на дистанцию, возьмите из первого - оптимального варианта)

@Enotik050505 @Exception_Prototype @Slavkaa, лучше сотрите свои ответы, чтобы не вводить никого в заблуждение. @alexandrage пусть просто посмотрит для себя
Ну ок:
PHP:
List<Player> players = Bukkit.getOnlinePlayers().stream().filter(player -> player.getLocation().distance(p.getLocation()) <= radius).collect(Collectors.toList());
 
Нужно отрефакторить, правильное решение такое:
Код:
for (Player p : Bukkit.getOnlinePlayers()) {
    if (p.getLocation().distance(ent.getLocation(radius))) {
        // Ваши действия
    }
}
Можешь, пожалуйста, объяснить что именно делает этот "if", а то слегка не очень понятно.
Берётся локация каждого игрока и distance возвращает true, если полученная локация "ent" попадает в радиус?
А от куда ent брать? У меня это всё происходит при выполнении команды.
 
Можешь, пожалуйста, объяснить что именно делает этот "if", а то слегка не очень понятно.
Берётся локация каждого игрока и distance возвращает true, если полученная локация "ent" попадает в радиус?
А от куда ent брать? У меня это всё происходит при выполнении команды.
Это тот, кто ввел команду, а p итерация из всех онлайн игроков.
 
Последнее редактирование:
Если тебе не нужна высота при расчете дистанции, то юзай теорему пифогора с x и z
 
Я одним сообщением выше дал готовый лист. Тебе нужно только заменить radius на нужную тебе дистанцию
Можешь, пожалуйста, объяснить что именно делает этот "if", а то слегка не очень понятно.
Берётся локация каждого игрока и distance возвращает true, если полученная локация "ent" попадает в радиус?
А от куда ent брать? У меня это всё происходит при выполнении команды.
 
Боже, не мучайте парня:

Код:
List<String> playersList = new ArrayList<>(); // Это лист, в котором будут храниться твои игроки.
Location location = player.getLocation // Локация. Сейчас это допустим локация игрока.
int radius = 200; // Это твой радиус.

for(Entity entity : location.getWorld().getNearbyEntities(location, radius, radius, radius)) { // С помощью цикла мы в определенной локации ищем всех существ на расстоянии 200 блоков.
if(entity == EntityType.PLAYER) playersList.add(entity.getName); // Проверяем, что существо является игроком и добавляем его в лист.
}

Вариант не лучший, но рабочий.
 
Боже, не мучайте парня:

Код:
List<String> playersList = new ArrayList<>(); // Это лист, в котором будут храниться твои игроки.
Location location = player.getLocation // Локация. Сейчас это допустим локация игрока.
int radius = 200; // Это твой радиус.

for(Entity entity : location.getWorld().getNearbyEntities(location, radius, radius, radius)) { // С помощью цикла мы в определенной локации ищем всех существ на расстоянии 200 блоков.
if(entity == EntityType.PLAYER) playersList.add(entity.getName); // Проверяем, что существо является игроком и добавляем его в лист.
}

Вариант не лучший, но рабочий.
У меня не робит
 
Назад
Верх