Помогите Работа с 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 секунды снова - снова - снова не включалась, нужно чтобы была задержка в цикле.
 
У меня получилось что-то такое.
Никакой сборки сервера под рукой нет, так что сорян -- писал и не тестировал (за такое, конечно, руки отрывать надо).
 

Вложения

Локализация от бога))
А так, зачем в MovingPlayersCatcher блокировки? Я не нашел, чтобы они использовались в другом потоке((
 
А так, зачем в MovingPlayersCatcher блокировки?
Согласен, ****ил у себя же код и забыл потереть.
Оно использовалось в multithreaded плагине.
Что за классы lombok?
Ломбок — это штука, которая перерабатывает исходный код, заменяя свои аннотации на какие-то сгенерированные вещи (геттеры, конструкторы, и много чего).
В твоём случае они попали туда от Cookie1337, если будут трудности, можешь убрать их все и пользоваться public полями (что как бы не супер, но мы потерпим🙂).
 
fe9ea055-af44-4d47-bee0-fe6b460f08cc
 

Вложения

  • upload_2018-1-7_22-24-48.png
    upload_2018-1-7_22-24-48.png
    587 КБ · Просмотры: 21
name, body...., а не name.body....
магическое превращение запятой в точку? )
 
А я бы посоветовал, пока плагин не очень сложный, попробовать заодно освоить maven.
Maven -- инструмент для сборки приложения (окей, назовём твой плагин сейчас именно так).

Просто перетащить свои изменения в то, что прислал я.
А в Eclipse-е, я не знаю как сейчас, оно (проект) наверное должно сходу открыться как "Проект Maven"?
 
Библиотека просто переделает аннотации в код, то есть получится обычный код
С ним я завтра подумаю...

А я бы посоветовал, пока плагин не очень сложный, попробовать заодно освоить maven.
Maven -- инструмент для сборки приложения (окей, назовём твой плагин сейчас именно так).

Просто перетащить свои изменения в то, что прислал я.
А в Eclipse-е, я не знаю как сейчас, оно (проект) наверное должно сходу открыться как "Проект Maven"?
Я загрузил библиотеку в проект, чего далее?))
 
Какую библиотеку? ))
Ладно, попробуй сам разобраться 🙂
 
С конфигом тут всё более менее терпимо, нужно сосредоточиться на более приоритетных изменениях.
Можно было заодно заменить ".x: " + "pos1" на ".x: pos1", но это тоже, чисто придраться 🙂

1. ArrayList<Area> area — лучше использовать интерфейс (можно даже Collection), чтобы не завязываться на имплементацию.
2. isOnPrivate — с точки зрения англ. языка, правильно будет isInPrivate.
3. (x > area.x1) && (x < area.x2) ... — избыточные скобки.
4. Оба метода isOnPrivate логичнее расположить в классе Area — привет от ООП.
5. .get();; — пропустил вторую точку с запятой 🙂
6. .get() у Optional<Area> выкинет исключение, если элемента нет. И привет, плагин выключен. Следует использовать orElse(null), либо ловить исключение в точке вызова метода.
7. public void onJoin(PlayerJoinEvent e) { ... } — не используй присвоение внутри if-а, вычисли значение отдельно, сравни его отдельно. Это, конечно, не C++, где if (abc = 12) вполне себе нормальная конструкция, но некоторые правила стоит соблюдать.
8. Вызов isOnPrivate, сравнение результата, вызов enterArea — лучше вынести в отдельный приватный метод, чтобы избежать повторения кода.
И это чтобы придраться, сам же попросил 🙂
Единственный относительно серъёзный вопрос к твоему коду — ты не показал, как этим пользоваться 🙂
Использовать npe защиту ввиде Optional, при этом юзать orElse(null)... Логика
 
Назад
Верх