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

Помогите Мини-игра должна запускаться когда в опр. координатах будут игроки

Тема в разделе "Разработка плагинов для новичков", создана пользователем Genius_Lyrics, 9 май 2021.

  1. Evolum

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

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    кастыэль.
     
  2. Evolum

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

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    кастыэль.
     
  3. MurlikMurlik

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

    Баллы:
    96
    Location center = new Location(world, x, y, z);

    for (Player pl : Bukkit.getOnlinePlayers()) { //или список игроков в мини игре
    if (pl.getLocation().distance(center) <= radius) {
    //запускаешь мини игру
    }
    }

    И не нужны никакие костыли вроде getNearbyEntities.
    А что касается производительности, достаточно раз в секунду через шедулер чекать, при условии что игроков будет не более сотни если в основном потоке.
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Можно неплохо выиграть, если использовать distanceSquired вместо distance
     
  5. MurlikMurlik

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

    Баллы:
    96
  6. Evolum

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

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    Чел. Это костыль. И ему нужно кол-во игроков узнать в той локации. В определённом радиусе. А ты зачем берёшь перебираешь всех игроков и сравниваешь локации узнавая дистанцию.
     
  7. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Попытка сверить дистанции игроков с разных миров вызовет IllegalArgumentException - если мир не один, использовать World#getPlayers() скорей требование, а не опциональный вариант.
    Зависит от условий. Если это какой-нибудь мир выживания, то возле локации может быть десяток-другой иных сущностей - мобы, предметы, рамки - в таком случае лучше пользоваться перебором игроков. Если в локации кроме игроков кроме игроков, или количество сущностей меньше количества игроков в мире, то, конечно, способ с getNearbyEntities/getNearbyPlayers.
     
  8. Evolum

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

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    Используешь Плеерс. И не паришься. Со своими кол-вами ентити в этом радиусе. И то пишешь просто .size(), получив коллекцию игроков.
     
  9. MurlikMurlik

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

    Баллы:
    96
    Это разве не то что нужно сделать для тс?
    Остальное, вроде подсчета игроков, можно добавить простым инкрементом. Да и вариант будет намного лучше, во время итерации, можно прервать цикл если наберется достаточное количество игроков, что не скажешь про getNearbyPlayers или аналоги.
     
  10. Evolum

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

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    size() чувак. У колекции сразу можно получить размер её. И не пользоваться тем костылём.
     
  11. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    По-моему ты кое-чего не понимаешь. Я это упоминал ранее, упомяну и сейчас - getNearbyPlayers работает практически точно также, как показал @Reality_SC - под капотом вызывается getNearbyEntities с проверкой на игрока. К тому же метода getNearbyPlayers нет в spigot-api, что значит ты не сможешь закинуть этот плагин на spigotmc.
    Из-за упомянутого ранее принципа работы getNearbyPlayers, количество сущностей в локации будет напрямую влиять на производительность. Если у тебя на сервере 20 игроков, а в радиусе локации, например, 40 сущностей, то куда выгоднее использовать перебор игроков. Плюс, как подметил @MurlikMurlik, процесс подсчета можно будет остановить при получении нужного количества.
     
  12. Evolum

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

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    Если у человека есть мозги. То он не будет юзать стандарт ядро. А возьмёт пейпер.
     
  13. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Причем здесь это, если речь про возможность выкладывания плагина в паблик репозиторий?
     
  14. Evolum

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

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    Где ты увидел в теме этой про выложить свой плуг на спигот?
     
  15. MurlikMurlik

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

    Баллы:
    96
    Тут уже дело принципа. Если тебе не нужна гибкость, используй getNearbyEntites. Только учти, что под капотом создается коллекция (которой ты пользуешься), что так же увеличивает потребление памяти. Кроме этого, судя по исходникам, создается еще один экземпляр AxisAlignedBB (на 1.12.2 точно) для поиска сущностей через nms метод, что так же может нагружать память при огромных количествах вызовах.

    Да и сам принцип поиска игроков через всех сущностей в мире очень странный, на фоне коллекций world#getPlayers или Bukkit.getOnlinePlayers.
     
  16. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Я упомянул это просто как аргумент - я и не знаю, собирается ли ТС это делать, но если собирается - использовать метод не вариант. Но зачем ты написал своё сообщение про пэпер - для меня остается загадкой, ибо оно только касательно связано с, собстна, аргументом.
     
  17. alexandrage

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

    Баллы:
    173
    Да вот жуйте, харош спорить.
    Код:
        public int calc(Location location, int radius) {
            int v = 0;
            for (Player player : location.getWorld().getPlayers()) {
                if (location.distance(player.getLocation()) <= radius) {
                    v++;
                }
            }
            return v;
        }
    
     
    Последнее редактирование: 16 май 2021
  18. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Миры можно через == сравнить, да вместо || должно быть &&.
    Присоединяйся к жеванию ~з~
    Код:
    public int playersInRadius(Location location, double radius) {
        double radiusSquared = radius*radius;
        int count = 0;
        for (Player player : location.getWorld().getPlayers()) {
            if (location.distanceSquared(player.getLocation()) <= radiusSquared) {
                count++;
            }
        }
        return count;
    }
    Или под изначальный вопрос
    Код:
    public boolean playersInRadius(Location location, double radius, int requirement) {
        double radiusSquared = radius*radius;
        int count = 0;
        for (Player player : location.getWorld().getPlayers()) {
            if (location.distanceSquared(player.getLocation()) <= radiusSquared && ++count == requirement) {
                return true;
            }
        }
        return false;
    }
     
    Последнее редактирование: 16 май 2021
  19. alexandrage

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

    Баллы:
    173
    Точняк)
     
  20. alexandrage

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

    Баллы:
    173
    Излишние оптимизации. Игроков слишком мало, да и юзается до начала игры.
     

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