1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем detamusi18429, 27 мар 2018.

  1. Автор темы
    detamusi18429

    detamusi18429 Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    detamusi18429
    Нужно при вводе команды получить в массив всех игроков в округе
     
  2. Slavkaa

    Slavkaa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Slavok2001
    PHP:
    List<Playerplayers player.getNearbyEntities(xyz).stream().filter(ent -> ent.getType() == EntityType.PLAYER).map(ent -> (Playerent).collect(Collectors.toList());
    Где x, y, z - что-то типа радиуса.
     
  3. Автор темы
    detamusi18429

    detamusi18429 Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    detamusi18429
    На переменную ent ругается
    PHP:
    if (args[0].equalsIgnoreCase("near")) {
                   
                    
    Player p = (Player)sender;
                   
                    
    Player ent;
                   
                    List<
    Playerplayers p.getNearbyEntities(p.getLocation().getBlockX(), p.getLocation().getBlockY(), p.getLocation().getBlockZ()).stream().filter(ent -> ent.getType() == EntityType.PLAYER).map(ent -> (Playerent).collect(Collectors.toList());
                   
                    
    sender.sendMessage("§fNear: " players);
                   
                    return 
    true;
                }
     
  4. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    1. Ошибку скрином кинь.
    2. У тебя кашу в чат отправит вместо списка ников.
     
  5. Автор темы
    detamusi18429

    detamusi18429 Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    detamusi18429
    Изменение типа переменной на EntityType или просто Player толку не даёт
    upload_2018-3-27_22-36-35.png
     
  6. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Не знаю чё у тебя там, но код рабочий.
    На попробуй по проще:
    PHP:
    List<Playerplayers = new ArrayList<>();
    for (
    Entity entity player.getNearbyEntities(xyz)) {
        if (
    entity.getType() == EntityType.PLAYER) {
            
    players.add(((Playerentity));
        }
    }
     
  7. Slavkaa

    Slavkaa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Slavok2001
    Убери Player ent; свой
     
  8. Enotik050505

    Enotik050505 Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    enotik050505
    вроде как команда /near это уже делает, игроки в 200 метрах от тебя.
     
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    :good:
     
  10. Автор темы
    detamusi18429

    detamusi18429 Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    detamusi18429
    Мне нужно взаимодействовать в этими игроками
     
  11. Автор темы
    detamusi18429

    detamusi18429 Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    detamusi18429
    Помогло
     
  12. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Нужно отрефакторить, правильное решение такое:
    Код:
    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 пусть просто посмотрит для себя
     
    Последнее редактирование: 29 мар 2018
  13. Slavkaa

    Slavkaa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Slavok2001
    Ну ок:
    PHP:
    List<Playerplayers Bukkit.getOnlinePlayers().stream().filter(player -> player.getLocation().distance(p.getLocation()) <= radius).collect(Collectors.toList());
     
  14. Автор темы
    detamusi18429

    detamusi18429 Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    detamusi18429
    Можешь, пожалуйста, объяснить что именно делает этот "if", а то слегка не очень понятно.
    Берётся локация каждого игрока и distance возвращает true, если полученная локация "ent" попадает в радиус?
    А от куда ent брать? У меня это всё происходит при выполнении команды.
     
  15. MrMagaChannel

    MrMagaChannel Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    mrmagachannel
    Это тот, кто ввел команду, а p итерация из всех онлайн игроков.
     
    Последнее редактирование: 2 апр 2018
  16. MrMagaChannel

    MrMagaChannel Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    mrmagachannel
    Если тебе не нужна высота при расчете дистанции, то юзай теорему пифогора с x и z
     
  17. Slavkaa

    Slavkaa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Slavok2001
    Я одним сообщением выше дал готовый лист. Тебе нужно только заменить radius на нужную тебе дистанцию
     
  18. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    distance возвращает дистанцию в блоках

     
  19. Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Боже, не мучайте парня:

    Код:
    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); // Проверяем, что существо является игроком и добавляем его в лист.
    }
    Вариант не лучший, но рабочий.
     
  20. Gizar_TV

    Gizar_TV Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Gizar_TV
    У меня не робит
     

Поделиться этой страницей