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

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

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

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

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

    Баллы:
    76
    Skype:
    discord
    Как сделать чтобы мини-игра запускалась только тогда, когда в радиусе определенных координат было n игроков?
     
  2. Ilya071

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

    Баллы:
    66
    Имя в Minecraft:
    ERR_CON_RESET
    Возможный выход из ситуации:
    1. Спавнишь Entity на нужных координатах
    2. Проверяешь с помощью BukkitRunnable каждую 1 секунду (или больше) сколько существ находится рядом с этой Entity (это делается с помощю метода getNearbyEntities). Также должно выполняться условие entity instanceof Player
    3. Если количество игроков - столько, сколько тебе нужно - можно запустить мини-игру.
     
  3. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Второй возможный вариант.
    1. Заводишь 2 точки (Location), min и max.
    2. Раз в 1 секунду (или больше) чекаешь всех игроков онлайн, кто в этом мире и все три координаты (x,y,z) между min и max. Считаешь их или заполняешь в список.
    3. Если достаточно, начинаешь игру.
     
  4. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Создаёшь локацию в центре, получаешь энтити рядом, через getNearbyEntites и чекешь сколько игроков в радиусе например 20 блоков, если столько, сколько тебе надо - запускаешь игру
     
  5. Evolum

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

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    Это самый костыль из костылей. Когда можно получить локацию и по ней проверять гетНеарбиPlayers, а не Ентитиес.
     
  6. Evolum

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

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    BukkitTask bukkitTask;

    onEnable(){
    Location center = new Location(Bukki.getWorlds().get(0), x, y, z);
    bukkitTask = Bukkit.getScheduler().runTaskTimerAsynchronously(Prison.plugin, () -> {
    if(center.getNearbyPlayers(radius).size() >= n) {
    //start game...
    bukkitTask.cancel(); //Выключаем наш бакитТаск, чтобы не работал по кд.
    bukkitTask = null; //И присваиваем его null
    }
    }, 5L, 5L);
    }
     
    Последнее редактирование: 16 май 2021
  7. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Paper-онли. Для паблик плагинов не подойдет, пока Paper не запилят свой репозиторий плагинов.
     
  8. Evolum

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

    Баллы:
    66
    Имя в Minecraft:
    Evolum
    Это самый не оптимизированный способ.
     
  9. swat1x

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

    Баллы:
    76
    Имя в Minecraft:
    swat1x
    Мдэ, магазин костылей открыли
    Код:
    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;
            }
        }
     
  10. swat1x

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

    Баллы:
    76
    Имя в Minecraft:
    swat1x
    Не так вопрос прочитал. Вот нужный
    Код:
    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;
            }
        }
    Потом создаёшь повторяющийся поток и проверяешь, сколько там игроков
     
  11. LOVEC3327

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

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    Присоединяюсь к обсуждению

    PHP:
    public class GameScheduler extends BukkitRunnable {

        private final 
    Test plugin;
        private final 
    Location location;
        private final 
    int sourceTime;
        private 
    int time;

        public 
    GameScheduler(Test pluginLocation locationint sourceTime) {
            
    this.plugin plugin;
            
    this.location location;
            
    this.sourceTime sourceTime;
            
    this.time sourceTime;
        }

        @
    Override
        
    public void run() {
            
    boolean start startGame(location1010101);
            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 locationdouble radiusint count) {
            return 
    startGame(locationradiusradiusradiuscount);
        }

        private 
    boolean startGame(Location locationdouble radiusXdouble radiusYdouble radiusZint count) {
            return 
    location.getWorld().getNearbyEntities(locationradiusXradiusYradiusZ-> instanceof Player).size() >= count;
        }

    }
    PHP:
        private GameScheduler gameScheduler;

        @
    Override
        
    public void onEnable() {
            
    startGameScheduler();
        }

        public 
    void startGameScheduler() {
            
    gameScheduler = new GameScheduler(this, new Location(Bukkit.getWorld("world"), 0600), 10);
            
    gameScheduler.runTaskTimer(this0L20L);
        }

        public 
    void setGameScheduler(GameScheduler scheduler) {
            
    gameScheduler scheduler;
        }
     
    Последнее редактирование: 13 май 2021
  12. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Спасибо. Посмотрел исходники, у меня не Paper, а простой Spigot, поэтому вышло так:
    Код:
    BoundingBox bb = BoundingBox.of(minLocation, maxLocation);
    List<Entity> = minLocation.getWorld()
       .getNearbyEntities(bb, e -> e instanceof Player);
    
     
  13. swat1x

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

    Баллы:
    76
    Имя в Minecraft:
    swat1x
    А вот и плохо, лучше Paper юзай. На нём и есть удобные хандлеры и он сам по себе как ядро сильно оптимизированней
     
  14. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Tам примерно тоже самое делается под капотом метода getNearbyPlayers.
     
  15. swat1x

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

    Баллы:
    76
    Имя в Minecraft:
    swat1x
    Я в общем. Как про ядро, а не как апи
     
  16. alexandrage

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

    Баллы:
    173
    Все велосипеды уже написаны да.
     
  17. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    https://papermc.io/forums/c/plugin-releases/

    А так все уже давно используют Paper, а не Spigot
     
  18. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    В курсе, но это прям уровень местных плагинов - тупо темы с ресурсами. По ссылке, которую оставил, готовится полноценный репозиторий.
    Да, но на spigotmc.org запрещены плагины, которые не работают, собстна, на spigot'е.
     
  19. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    По факту ничего не юзаю уже лет 6, т.к. сервера не держу.
     
  20. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    По факту getNearbyEntities для игроков в большом радиусе - это большая жопа. Ибо во первых итерирует оно по списку энтитей каждого чанка в радиусе, проверяя при этом дальность, что уже получается медленней, дык ещё и энтитей в этих списках может быть вагон и маленькая тележка, и при этом для всех них будет выполняться проверка дальности.
    Потому в 99.9999% случаев лучше проитерировать по world#getPlayers и проверить расстоние руками. А если боретесь за каждую копейку перформанса, тогда придётся варить карту дистанций с какой-то дискретностью самому.
     

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