Помогите Работа с 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 секунды снова - снова - снова не включалась, нужно чтобы была задержка в цикле.
 
Несколько замечаний.
"swarp." + vois + ".x: " + "pos1"
".swarp." + "." + vois + ".sound:"
1. Хотелось бы обратить внимание на все эти беспорядочные связи точки и двоеточия. Это очень трудно читать и поведение/структура конфига становится неочевидной.
Постарайся следовать простым правилам именования секций/ключей: "abc.def.xyz". И лучше без пробелов. Примеры выше превратятся из
"swarp.vois.x:_pos1" в "swarp.vois.x1" и
".swarp..vois.sound:" в "swarp.void.sound".

2. Не нужно пользоваться конфигов внутри таймеров. Даже если это можно себе позволить по ряду причин:
  • события (player join event) и таймеры, в которых производятся манипуляции с конфигом, запускаются относительно редко
  • реализация конфига представляет собой точно такой же ассоциативный массив (Map) и обращение к нему по факту не приводит к чтению/записи на диск
это всё равно будет очень плохим вариантом по следующим причинам:
  • влияние плагина на быстродействие сервера в большой степени будет полагаться на правильную настройку таймеров
  • нельзя полагаться на чужую реализацию интерфейсов — она может быть в любой момент изменена и её поведение не очевидным образом скажется на работе сервера
  • это совершенно неправильно с точки зрения архитектуры — фактически ты пытаешься пользоваться интерфейсом к файлам для того, чтобы хранить данные в оперативной памяти.
Я бы посоветовал тебе попробовать разобраться в том, как работает код, который я ранее скидывал (тот его кусок, который относится к чтению и сохранению кубоидов).

3. Запись вида rec == rec3 || rec > rec3 на самом деле представляет собой rec >= rec3.

4. Код BukkitRunnable внутри обработчика события public void OnJoin(PlayerJoinEvent event) выполняется раз в секунду (кроме случая rec == rec3, тогда чтобы перейти с 3 до 0 записи нужно 2 секунды) и отменяется, когда игрок попал в зону. При отмене запускается другой таймер, который отсчитывает sound-time раз по 1 секунде.
На самом деле это равно sound-time секунд и тебе вообще не нужен таймер для этого (нужно только отложенное одноразовое действие, scheduler.runTaskLater, точно не помню название метода).

5. Если игрок выйдет из игры, то таймер никогда не отменится. В каждый момент времени на него всё равно будет повешан или проверяющий (да), или играющий таймер (вообще нет), который будет забивать своим выполнением тики главного цикла и память сервера. BukkitRunnable будет хранить ссылку на event, в котором хранится ссылка на игрока. Если игрок перезайдёт, ему будет создан новый экземпляр Player.
Это, мягко говоря, оставляет возможности для ддоса сервера входом и выходом игроков.

Возможно, можно ещё что-то найти, я очень бегло посмотрел.
 
Вот, сделал ещё правки в том коде, который скидывал ранее.
Убрал lombok, чтобы он не мешал.
Добавил много комментариев, кое что упростил.
Если будут вопросы, спрашивай.
Сейчас оно всё должно работать, только вопрос с этим огромнейшим методом "обработки команд".
 

Вложения

Вот, сделал ещё правки в том коде, который скидывал ранее.
Убрал lombok, чтобы он не мешал.
Добавил много комментариев, кое что упростил.
Если будут вопросы, спрашивай.
Сейчас оно всё должно работать, только вопрос с этим огромнейшим методом "обработки команд".
Так сейчас загрузил открыл как проект Maven, сначала ошибка при компиле, потом разобрался что к чему (просто он пытался собирать проект используя JRE я переключил JDK) далее всё собрал и понял что ты сменил некоторые момент чтения из конфига, это я понял и всё поправил в конфах теперь пашет нормально.. но меня раздражает что в IDE в скриптах подсвечивает мол ошибка кода это не мешает сборке но для работы с плагином мешает, как сделать чтобы он перестал жаловать на эти ошибки. IDE Eclipse.
 
На какие именно ошибки он ругается, накидай плиз скринов под спойлер?
 
Код:
 private final MovingPlayersCatcher catcher = new MovingPlayersCatcher();
    /**
     * Ассоциативный массив, хранщий пары [Название зоны; Зона]
     */
    private final Map<String, Area> areas = new HashMap<>();

    /**
     * Ассоциативный массив, хранящий пары [Игрок; Зона, в которой он находится]
     */
    private final Map<Player, Area> playersPerAreas = new HashMap<>();

getServer().getPluginManager().registerEvents(catcher, this);
processMovedPlayers(catcher.getMovedPlayersAsync());

   playersPerAreas.clear();
        areas.clear();


            Area area = new Area(name,
                    body.getInt("x: pos1"), body.getInt("y: pos1"), body.getInt("z: pos1"),
                    body.getInt("x: pos2"), body.getInt("y: pos2"), body.getInt("z: pos2"),
                    body.getString("category"),
                    body.getString("sound"),
                    body.getInt("soundDuration"),
                    body.getDouble("soundVolume"));
            areas.put(name, area);

for (Map.Entry<String, Area> entry : areas.entrySet()) {

Area area = entry.getValue();

            Area previous = playersPerAreas.get(player);
            Optional<Area> optional = searchAreaByPlayerLocation(player.getLocation());

                Area current = optional.get();
                playersPerAreas.put(player, current);

    private Optional<Area> searchAreaByPlayerLocation(Location loc) {
        return areas.values().stream()

    private void onPlayerEnteringArea(Player player, Area area) {

                if (player.isOnline() && Objects.equals(playersPerAreas.get(player), area)) {

    public void playSoundForPlayer(Player player, Area area) {
 

Вложения

  • upload_2018-1-12_20-42-14.png
    upload_2018-1-12_20-42-14.png
    124,9 КБ · Просмотры: 17
Я бы убедился, что файлы классов Area и MovingPlayersCatcher лежат в одной папке с файлом главного класса, и что во всех классах правильно прописаны package и import-ы.
 
Я бы убедился, что файлы классов Area и MovingPlayersCatcher лежат в одной папке с файлом главного класса, и что во всех классах правильно прописаны package и import-ы.
Я не знаю, я открыл в IDE проект как Maven, далее -> Maven Clean, для сборки -> Maven Build. Ошибки образовались изначально, я просто распаковал ваш архив, далее открыл его как проект и ошибки.

Как бы он работает и собирается проект, но в игре не пойму как он запускается, раз через раз, конфиги имеют такую структуру:

swarp:
Boss:
'x: pos1': -214
'y: pos1': 40
'z: pos1': 44
'x: pos2': -194
'y: pos2': 44
'z: pos2': 63
sound: piano.music
category: master
sound-time: 255
sound-volume: 1.0

он будет работать, но если создать новый он его просто не ест и никак не воспринимает... не знаю даже почему, весь код перерыскал... сначала понял что проблема была в том, что скрипт который отвечает за добавление данных в конфиги создавал их используя String т.е в конфигах были скобки и в них значение, я специально убрал все скобки с координат, и он заработает если сотню раз перезапустить и перезайти.. не знаю, сейчас голова не варит, завтра попробую посмотреть чего там именно с area классом, а так-же глянуть как он читает файлы.. я понял по вашим комментариям что к чему, за что спасибо.
 
Я не знаю, я открыл в IDE проект как Maven, далее -> Maven Clean, для сборки -> Maven Build. Ошибки образовались изначально, я просто распаковал ваш архив, далее открыл его как проект и ошибки.

Как бы он работает и собирается проект, но в игре не пойму как он запускается, раз через раз, конфиги имеют такую структуру:

swarp:
Boss:
'x: pos1': -214
'y: pos1': 40
'z: pos1': 44
'x: pos2': -194
'y: pos2': 44
'z: pos2': 63
sound: piano.music
category: master
sound-time: 255
sound-volume: 1.0

он будет работать, но если создать новый он его просто не ест и никак не воспринимает... не знаю даже почему, весь код перерыскал... сначала понял что проблема была в том, что скрипт который отвечает за добавление данных в конфиги создавал их используя String т.е в конфигах были скобки и в них значение, я специально убрал все скобки с координат, и он заработает если сотню раз перезапустить и перезайти.. не знаю, сейчас голова не варит, завтра попробую посмотреть чего там именно с area классом, а так-же глянуть как он читает файлы.. я понял по вашим комментариям что к чему, за что спасибо.
Иди яву учи, тебе уже кучу готовых примеров кинули а ты чет тугодум какой то
 
Автору, в личной переписке нельзя прицеплять.

p.s. ничего интересного.
 

Вложения

Назад
Верх