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

Не так вопрос прочитал. Вот нужный
Код:
public Boolean getPlayerAmountNearLocation(int amount, Location location){
        List<Player> list = new ArrayList<Player>();
        location.getNearbyEntities(100, 100, 100).forEach(entity -> {
            if (entity instanceof Player) {
                list.add(((Player) entity).getPlayer());
            }
        });
        if(list.size() >= amount){
            return true;
        }
        else{
            return false;
        }
    }
Потом создаёшь повторяющийся поток и проверяешь, сколько там игроков
кастыэль.
 
Спасибо. Посмотрел исходники, у меня не Paper, а простой Spigot, поэтому вышло так:
Код:
BoundingBox bb = BoundingBox.of(minLocation, maxLocation);
List<Entity> = minLocation.getWorld()
   .getNearbyEntities(bb, e -> e instanceof Player);
кастыэль.
 
Location center = new Location(world, x, y, z);

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

И не нужны никакие костыли вроде getNearbyEntities.
А что касается производительности, достаточно раз в секунду через шедулер чекать, при условии что игроков будет не более сотни если в основном потоке.
 
Location center = new Location(world, x, y, z);

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

И не нужны никакие костыли вроде getNearbyEntities.
А что касается производительности, достаточно раз в секунду через шедулер чекать, при условии что игроков будет не более сотни если в основном потоке.
Можно неплохо выиграть, если использовать distanceSquired вместо distance
 
Location center = new Location(world, x, y, z);

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

И не нужны никакие костыли вроде getNearbyEntities.
А что касается производительности, достаточно раз в секунду через шедулер чекать, при условии что игроков будет не более сотни если в основном потоке.
Чел. Это костыль. И ему нужно кол-во игроков узнать в той локации. В определённом радиусе. А ты зачем берёшь перебираешь всех игроков и сравниваешь локации узнавая дистанцию.
 
Location center = new Location(world, x, y, z);

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

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

https://stackoverflow.com/questions...are-within-a-certain-distance-from-the-center
Попытка сверить дистанции игроков с разных миров вызовет IllegalArgumentException - если мир не один, использовать World#getPlayers() скорей требование, а не опциональный вариант.
Чел. Это костыль. И ему нужно кол-во игроков узнать в той локации. В определённом радиусе. А ты зачем берёшь перебираешь всех игроков и сравниваешь локации узнавая дистанцию.
Зависит от условий. Если это какой-нибудь мир выживания, то возле локации может быть десяток-другой иных сущностей - мобы, предметы, рамки - в таком случае лучше пользоваться перебором игроков. Если в локации кроме игроков кроме игроков, или количество сущностей меньше количества игроков в мире, то, конечно, способ с getNearbyEntities/getNearbyPlayers.
 
Попытка сверить дистанции игроков с разных миров вызовет IllegalArgumentException - если мир не один, использовать World#getPlayers() скорей требование, а не опциональный вариант.

Зависит от условий. Если это какой-нибудь мир выживания, то возле локации может быть десяток-другой иных сущностей - мобы, предметы, рамки - в таком случае лучше пользоваться перебором игроков. Если в локации кроме игроков кроме игроков, или количество сущностей меньше количества игроков в мире, то, конечно, способ с getNearbyEntities/getNearbyPlayers.
Используешь Плеерс. И не паришься. Со своими кол-вами ентити в этом радиусе. И то пишешь просто .size(), получив коллекцию игроков.
 
Чел. Это костыль. И ему нужно кол-во игроков узнать в той локации. В определённом радиусе. А ты зачем берёшь перебираешь всех игроков и сравниваешь локации узнавая дистанцию.
Как сделать чтобы мини-игра запускалась только тогда, когда в радиусе определенных координат было n игроков?

Это разве не то что нужно сделать для тс?
Остальное, вроде подсчета игроков, можно добавить простым инкрементом. Да и вариант будет намного лучше, во время итерации, можно прервать цикл если наберется достаточное количество игроков, что не скажешь про getNearbyPlayers или аналоги.
 
Это разве не то что нужно сделать для тс?
Остальное, вроде подсчета игроков, можно добавить простым инкрементом. Да и вариант будет намного лучше, во время итерации, можно прервать цикл если наберется достаточное количество игроков, что не скажешь про getNearbyPlayers или аналоги.
size() чувак. У колекции сразу можно получить размер её. И не пользоваться тем костылём.
 
Используешь Плеерс. И не паришься.
По-моему ты кое-чего не понимаешь. Я это упоминал ранее, упомяну и сейчас - getNearbyPlayers работает практически точно также, как показал @Reality_SC - под капотом вызывается getNearbyEntities с проверкой на игрока. К тому же метода getNearbyPlayers нет в spigot-api, что значит ты не сможешь закинуть этот плагин на spigotmc.
Со своими кол-вами ентити в этом радиусе.
Из-за упомянутого ранее принципа работы getNearbyPlayers, количество сущностей в локации будет напрямую влиять на производительность. Если у тебя на сервере 20 игроков, а в радиусе локации, например, 40 сущностей, то куда выгоднее использовать перебор игроков. Плюс, как подметил @MurlikMurlik, процесс подсчета можно будет остановить при получении нужного количества.
 
По-моему ты кое-чего не понимаешь. Я это упоминал ранее, упомяну и сейчас - getNearbyPlayers работает практически точно также, как показал @Reality_SC - под капотом вызывается getNearbyEntities с проверкой на игрока. К тому же метода getNearbyPlayers нет в spigot-api, что значит ты не сможешь закинуть этот плагин на spigotmc.

Из-за упомянутого ранее принципа работы getNearbyPlayers, количество сущностей в локации будет напрямую влиять на производительность. Если у тебя на сервере 20 игроков, а в радиусе локации, например, 40 сущностей, то куда выгоднее использовать перебор игроков. Плюс, как подметил @MurlikMurlik, процесс подсчета можно будет остановить при получении нужного количества.
Если у человека есть мозги. То он не будет юзать стандарт ядро. А возьмёт пейпер.
 
Если у человека есть мозги. То он не будет юзать стандарт ядро. А возьмёт пейпер.
Причем здесь это, если речь про возможность выкладывания плагина в паблик репозиторий?
 
size() чувак. У колекции сразу можно получить размер её. И не пользоваться тем костылём.
Тут уже дело принципа. Если тебе не нужна гибкость, используй getNearbyEntites. Только учти, что под капотом создается коллекция (которой ты пользуешься), что так же увеличивает потребление памяти. Кроме этого, судя по исходникам, создается еще один экземпляр AxisAlignedBB (на 1.12.2 точно) для поиска сущностей через nms метод, что так же может нагружать память при огромных количествах вызовах.

Да и сам принцип поиска игроков через всех сущностей в мире очень странный, на фоне коллекций world#getPlayers или Bukkit.getOnlinePlayers.
 
Где ты увидел в теме этой про выложить свой плуг на спигот?
Я упомянул это просто как аргумент - я и не знаю, собирается ли ТС это делать, но если собирается - использовать метод не вариант. Но зачем ты написал своё сообщение про пэпер - для меня остается загадкой, ибо оно только касательно связано с, собстна, аргументом.
 
Да вот жуйте, харош спорить.
Код:
    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;
    }
 
Последнее редактирование:
Да вот жуйте, харош спорить.
Код:
    public int calc(Location location, int radius) {
        int v = 0;
        for (Player player : Bukkit.getOnlinePlayers()) {
            if (player.getWorld().equals(location.getWorld()) || location.distance(player.getLocation()) <= radius) {
                v++;
            }
        }
        return v;
    }
Миры можно через == сравнить, да вместо || должно быть &&.
Присоединяйся к жеванию ~з~
Код:
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;
}
 
Последнее редактирование:
Назад
Верх