- Баллы
- 76
Как сделать чтобы мини-игра запускалась только тогда, когда в радиусе определенных координат было n игроков?
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Это самый костыль из костылей. Когда можно получить локацию и по ней проверять гетНеарбиPlayers, а не Ентитиес.Возможный выход из ситуации:
1. Спавнишь Entity на нужных координатах
2. Проверяешь с помощью BukkitRunnable каждую 1 секунду (или больше) сколько существ находится рядом с этой Entity (это делается с помощю метода getNearbyEntities). Также должно выполняться условие entity instanceof Player
3. Если количество игроков - столько, сколько тебе нужно - можно запустить мини-игру.
BukkitTask bukkitTask;Как сделать чтобы мини-игра запускалась только тогда, когда в радиусе определенных координат было n игроков?
Paper-онли. Для паблик плагинов не подойдет, пока Paper не запилят свой репозиторий плагинов.Это самый костыль из костылей. Когда можно получить локацию и по ней проверять гетНеарбиPlayers, а не Ентитиес.
Это самый не оптимизированный способ.Второй возможный вариант.
1. Заводишь 2 точки (Location), min и max.
2. Раз в 1 секунду (или больше) чекаешь всех игроков онлайн, кто в этом мире и все три координаты (x,y,z) между min и max. Считаешь их или заполняешь в список.
3. Если достаточно, начинаешь игру.
public Boolean isNearLocation(Player player, 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.contains(player)){
return true;
}
else{
return false;
}
}
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;
}
}
public class GameScheduler extends BukkitRunnable {
private final Test plugin;
private final Location location;
private final int sourceTime;
private int time;
public GameScheduler(Test plugin, Location location, int sourceTime) {
this.plugin = plugin;
this.location = location;
this.sourceTime = sourceTime;
this.time = sourceTime;
}
@Override
public void run() {
boolean start = startGame(location, 10, 10, 10, 1);
if (!start && time < sourceTime) {
time = sourceTime;
return;
}
if (start) {
if (time == 0) {
Bukkit.broadcastMessage("Game is started!");
cancel();
plugin.setGameScheduler(null);
return;
}
time--;
Bukkit.broadcastMessage(time + " seconds left before the start!");
}
}
private boolean startGame(Location location, double radius, int count) {
return startGame(location, radius, radius, radius, count);
}
private boolean startGame(Location location, double radiusX, double radiusY, double radiusZ, int count) {
return location.getWorld().getNearbyEntities(location, radiusX, radiusY, radiusZ, e -> e instanceof Player).size() >= count;
}
}
private GameScheduler gameScheduler;
@Override
public void onEnable() {
startGameScheduler();
}
public void startGameScheduler() {
gameScheduler = new GameScheduler(this, new Location(Bukkit.getWorld("world"), 0, 60, 0), 10);
gameScheduler.runTaskTimer(this, 0L, 20L);
}
public void setGameScheduler(GameScheduler scheduler) {
gameScheduler = scheduler;
}
Спасибо. Посмотрел исходники, у меня не Paper, а простой Spigot, поэтому вышло так:Это самый не оптимизированный способ.
BoundingBox bb = BoundingBox.of(minLocation, maxLocation);
List<Entity> = minLocation.getWorld()
.getNearbyEntities(bb, e -> e instanceof Player);
А вот и плохо, лучше Paper юзай. На нём и есть удобные хандлеры и он сам по себе как ядро сильно оптимизированнейСпасибо. Посмотрел исходники, у меня не Paper, а простой Spigot, поэтому вышло так:
Код:BoundingBox bb = BoundingBox.of(minLocation, maxLocation); List<Entity> = minLocation.getWorld() .getNearbyEntities(bb, e -> e instanceof Player);
Tам примерно тоже самое делается под капотом метода getNearbyPlayers.А вот и плохо, лучше Paper юзай.
Я в общем. Как про ядро, а не как апиTам примерно тоже самое делается под капотом метода getNearbyPlayers.
Все велосипеды уже написаны да.Tам примерно тоже самое делается под капотом метода getNearbyPlayers.
https://papermc.io/forums/c/plugin-releases/Paper-онли. Для паблик плагинов не подойдет, пока Paper не запилят свой репозиторий плагинов.
В курсе, но это прям уровень местных плагинов - тупо темы с ресурсами. По ссылке, которую оставил, готовится полноценный репозиторий.
Да, но на spigotmc.org запрещены плагины, которые не работают, собстна, на spigot'е.А так все уже давно используют Paper, а не Spigot
По факту ничего не юзаю уже лет 6, т.к. сервера не держу.А вот и плохо, лучше Paper юзай. На нём и есть удобные хандлеры и он сам по себе как ядро сильно оптимизированней