Помогите Работа с BukkitRunnable

Hittcliff

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Relion128
Мне нужно дабы код:

Код:
                    if (b.getX() > valueX[rec] && b.getX() < valueXX[rec]) {
                        if (b.getY() > valueY[rec] && b.getY() < valueYY[rec]) {
                            if (b.getZ() > valueZ[rec] && b.getZ() < valueZZ[rec]) {

                                tested(event, array[rec]);
                            }
                        }
                        rec++;
                    }

выполнялась с другой задержкой, т.е эта часть кода находится в цикле (ниже фул код), и нужно чтобы конкретно этот код что указан выше работал с другой задержкой, допустим выполнился цикл фул кода, но т.к у кода выше другая задержка он не запускается вплодь до тех пор пока не закончится его цикл, ну или просто сделать задержку...



Код:
        int timer = Integer.parseInt(getConfig().getString("array.time")) * 20;

        new BukkitRunnable() {

            int rec = 0;
            int rec3 = Integer.parseInt(getConfig().getString("array.value"));

            List<String> list = config.getStringList("array.dir");
            String[] array = list.toArray(new String[0]);

            @Override
            public void run() {

                if (rec == rec3 || rec > rec3) {

                    rec = 0;
                } else {

                    // Позиция 1
                    int[] valueX = new int[rec3];
                    valueX[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".x: " + "pos1"));

                    int[] valueY = new int[rec3];
                    valueY[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".y: " + "pos1"));

                    int[] valueZ = new int[rec3];
                    valueZ[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".z: " + "pos1"));

                    // Позиция 2
                    int[] valueXX = new int[rec3];
                    valueXX[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".x: " + "pos2"));

                    int[] valueYY = new int[rec3];
                    valueYY[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".y: " + "pos2"));

                    int[] valueZZ = new int[rec3];
                    valueZZ[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".z: " + "pos2"));
                    Location b = player.getLocation();

                    if (b.getX() > valueX[rec] && b.getX() < valueXX[rec]) { //От сюда
                        if (b.getY() > valueY[rec] && b.getY() < valueYY[rec]) {
                            if (b.getZ() > valueZ[rec] && b.getZ() < valueZZ[rec]) {

                                tested(event, array[rec]);
                            }
                        }
                        rec++;
                    } //До сюда нужно делать задержку, дабы он работал с другой задержкой... Эта работает раз в 60 секунд..
                }
            }
        }.runTaskTimer(this, 0L, timer); //Эта допустим работает раз в 3 секунды..
Я пытался делить на классы, но суть такова, что код выше в любом случае обращается каждые 3 секунды, хотя мне нужно чтобы он делал это с задержкой в 60 секунд.


Для примера tested к которому обращается код выше:

Код:
 public void tested(PlayerJoinEvent event, String vois) {
        Player player = event.getPlayer();
        player.sendMessage(ChatColor.BLUE + "[DCore]: Вы на территорий: " + vois);
    }

Ах да, почему я просто не укажу основному циклу 60 секунд? Да просто потому, что он каждые 3 секунды ищет игрока, и если находит то должен выполнять действие с задержкой, например запускается песня, и дабы это песня каждые 3 секунды снова - снова - снова не включалась, нужно чтобы была задержка в цикле.
 
1. Ты извлёк все файлы из архива? У тебя ошибка, что нет одного класса, MovingPlayersCatcher. Ааа, и Area тоже нету.
Извлекай всё.
2. Не надо было конечно подсовывать тебе Ломбок ... Ок, в классе Area убери все аннотации ( @ ), напиши сам конструктор и геттеры (методы вида getXPos1() и т.п.), в общем все, чего не хватает
 
Последнее редактирование:
1. Ты извлёк все файлы из архива? У тебя ошибка, что нет одного класса, MovingPlayersCatcher. Ааа, и Area тоже нету.
Извлекай всё.
2. Не надо было конечно подсовывать тебе Ломбок ... Ок, в классе Area убери все аннотации ( @ ), напиши сам конструктор и геттеры (методы вида getXPos1() и т.п.), в общем все, чего не хватает
Я извлёк все файлы. Сейчас убрал все аннотаций из всех классов, ошибок меньше стало но остались..
upload_2018-1-9_14-5-48.pngЯ
 
Хотя нет... так-же 28 ошибок и осталось, после сохранения все ошибки вернулись.
 
Хотя нет... так-же 28 ошибок и осталось, после сохранения все ошибки вернулись.
Читай ошибку: The method is undefined for the type Area (в классе Area нет метода getZ2).
Я поэтому и сказал:
... напиши сам конструктор и геттеры (методы вида getXPos1() и т.п.), в общем все, чего не хватает
 
На самом деле надо было давно уже сделать плагин-хелпер, который кидал бы нормально эвенты о входе и выходе игрока в/из приватов WG, а потом уже от него и отталкиваться.
 
На самом деле надо было давно уже сделать плагин-хелпер, который кидал бы нормально эвенты о входе и выходе игрока в/из приватов WG, а потом уже от него и отталкиваться.
Так есть такое уже
 
Я нашёл немного другое решение. Немного тупое, но рабочее. Пишу вдруг кому надо будет.

И так, я оставил цикл и т.п всё как есть, за одним исключением, т.е внутри цикла мы проверяем где игрок и если игрок попал в территорию т.е останавливать цикл и передавать сигнал другому классу, который работает с таймером, как только таймер отсчитывает нужное кол-во мы останавливаем его и снова отправляем на повторный запуск первого цикла:

Код:
    @EventHandler
    public void OnJoin(PlayerJoinEvent event) {

        FileConfiguration config = getConfig();

        Player player = event.getPlayer();

        String name = player.getName();
        player.sendMessage(ChatColor.BLUE + "[DCore]: Запуск...");
        config.set(name + ".position.x: " + "pos1", "0");
        config.set(name + ".position.y: " + "pos1", "0");
        config.set(name + ".position.z: " + "pos1", "0");
        config.set(name + ".position.x: " + "pos2", "0");
        config.set(name + ".position.y: " + "pos2", "0");
        config.set(name + ".position.z: " + "pos2", "0");

        config.set("settings.dev", 1); // Режим разработчика

        saveConfig();

        int timer = Integer.parseInt(getConfig().getString("array.time")) * 20;

        new BukkitRunnable() {
            int rec = 0;
            int rec3 = Integer.parseInt(getConfig().getString("array.value"));

            List<String> list = config.getStringList("array.dir");
            String[] array = list.toArray(new String[0]);

           
            @Override
            public void run() {
                if (rec == rec3 || rec > rec3) {
                    rec = 0;
                } else {
                    // Позиция 1
                    int[] valueX = new int[rec3];
                    valueX[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".x: " + "pos1"));

                    int[] valueY = new int[rec3];
                    valueY[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".y: " + "pos1"));

                    int[] valueZ = new int[rec3];
                    valueZ[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".z: " + "pos1"));

                    // Позиция 2
                    int[] valueXX = new int[rec3];
                    valueXX[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".x: " + "pos2"));

                    int[] valueYY = new int[rec3];
                    valueYY[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".y: " + "pos2"));

                    int[] valueZZ = new int[rec3];
                    valueZZ[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".z: " + "pos2"));
                    Location b = player.getLocation(); // Создаём переменную!

                    if (b.getX() > valueX[rec] && b.getX() < valueXX[rec]) {
                        if (b.getY() > valueY[rec] && b.getY() < valueYY[rec]) {
                            if (b.getZ() > valueZ[rec] && b.getZ() < valueZZ[rec]) {
                                    tested(event, array[rec]);
                                    player.sendMessage(ChatColor.BLUE + "[DCore]: Остановка..."); //Для проверки этапа выводил в чат
                                    cancel(); //Делаем остановку цикла
                            }
                        }
                    }
                    rec++;
                }
            }
        }.runTaskTimer(this, 0L, timer);
    }

далее в tested
Код:
    public void tested(PlayerJoinEvent event, String vois) {
        Player player = event.getPlayer();

        // Позиция 1
        int SettinX1 = getConfig().getInt("swarp." + vois + ".x: " + "pos1");
        int SettinY1 = getConfig().getInt("swarp." + vois + ".y: " + "pos1");
        int SettinZ1 = getConfig().getInt("swarp." + vois + ".z: " + "pos1");

        // Звук
        String SettinS = getConfig().getString(".swarp." + "." + vois + ".sound:");
        String master = getConfig().getString(".swarp." + "." + vois + ".category:");
        int Volume = Integer.parseInt(getConfig().getString(".swarp." + "." + vois + ".sound-volume:")); // Громкость

        getServer().dispatchCommand(getServer().getConsoleSender(), "playsound " + SettinS + " " + master + " "
                + player.getName() + " " + SettinX1 + " " + SettinY1 + " " + SettinZ1 + " " + Volume);
        player.sendMessage(ChatColor.BLUE + "[DCore]: Вы на терреторий: " + vois);
        player.sendMessage(ChatColor.BLUE + "[DCore]: Играет:  " + SettinS);


       
        new BukkitRunnable() {
            int rec = 0; //Начальное кол-во
            int interTimer = Integer.parseInt(getConfig().getString(".swarp." + "." + vois + ".sound-time:")); //Берём из конфига через сколько повторять действие тут

            @Override
            public void run() {
                if (rec == interTimer) {
                    player.sendMessage(ChatColor.BLUE + "[DCore]: Перезапуск..."); //Для себя сообщение
                    cancel(); //Останавливаем таймер
                    OnJoin(event); //Запускаем снова OnJoin
                }
                rec++;
            }
        }.runTaskTimer(this, 0L, 20); //Задержка 1 секунда
    }
}

В чём плюс этого для меня, во первых настройка процесса достаточно гибкая, второе что для меня важно это первый запуск скрипта происходит сразу после захода игрока в зону и повторный запуск скрипта через указанное время. Знаю что скрипт очень фиговый, но я пока что очень херовый говнокодер, да и допедрил до идеи такой случайно.
 
Последнее редактирование:
Спасибо всем кто помогал на форуме, я ценю вашу помощь!
 
Слушай, теперь вопрос по другой части. Есть основной файл config.yml как допустим для определённой команды делай свой конфиг файл...
 
Назад
Верх