Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите EventPriority как это блин работает?

Тема в разделе "Разработка плагинов для новичков", создана пользователем Mr_RoboMan, 12 апр 2016.

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

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

    Баллы:
    123
    Есть два метода, оба в разных классах наследующихся от Listener, оба слушают событие AsyncPlayerChatEvent..
    Один из них выполняет функцию отмены чата если игрок не авторизировался/не зарегестрировался, а второй форматирует чат. Разумеется мне надо сделать чтоб сначало вызывался метод проверки авторизации, и если он отменял евент, то метод форматирования уже не вызывался...
    Исходя из логики, я поставил первому методу приоритет HIGHEST, а второму LOW, если до этого у меня вызывалось два метода, то теперь просто отправляется отформатированное сообщение...
    Что я делаю не так?
    Код:
    @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
        public boolean cancelChat(AsyncPlayerChatEvent event) {
            if (playersOnRegister.contains(event.getPlayer())) {
                event.setCancelled(true);
                event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&',
                        Phrase.PLAYER_MESSAGE_NEED_REGISTER.text(new Pair("%PLAYER%", event.getPlayer().getDisplayName()))));
                return true;
            }
            if (playersOnLogin.containsKey(event.getPlayer())) {
                event.setCancelled(true);
                event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&',
                        Phrase.PLAYER_MESSAGE_NEED_LOGIN.text(new Pair("%PLAYER%", event.getPlayer().getDisplayName()))));
                return true;
            }
            return false;
        }
    Код:
    @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW)
        public void checkChat(AsyncPlayerChatEvent event) {
            event.setCancelled(true);
            try {
                Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', formatMessage(event.getPlayer(), event.getMessage())));
            } catch (PlayerFileNotFoundException e) {
    
            } catch (IOException | InvalidConfigurationException e) {
                Main.standardCatchException(e, new Pair(event.getPlayer(), false));
            }
        }
     
  2. Хостинг MineCraft
    <
  3. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Может изза того что ты игноришь отмену сообщения во втором коде?
     
  4. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Может я просто снова не правильно понял, но по идее ignoreCancelled = игнорировать отмененные события, т.е. (как мне кажется) если первый метод отменит событие - то это событие (евент) не должно посылатся этому методу, так как он игнорирует отмененные события..
    Или я неправильно понял?
     
  5. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Попробуй у первого труе и второго фалсе.
     
  6. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Приоритеты идут от LOWEST до MONITOR в порядке убывания приоритета обработки, несмотря на наименование(ошибка разрабов?).
    Прядок: LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR.
    То есть LOWEST обрабатывается раньше всех.
     
    Последнее редактирование: 12 апр 2016
  7. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    А изменяет его Highest.
     
  8. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
  9. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Чет бред... Ну ладно, спасибо)
     
  10. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Не бред, не смотря на странноватость - логика тут есть)
    Это приоритет.. факта выполнения, а не порядка.
    Если вы ставите HIGHEST - ваш метод будет вызыван в последнюю очередь, что значит что вы будете иметь возможность отменить / изменить / использовать результат всех предыдущих евентов

    Хотя я бы и сам не против чтоб они были названы наоборот
     
  11. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Нууу.... Впринципе конечно да... Но если не знать - то понять что это именно так - сложно...
     
  12. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Если ignoreCancelled=TRUE, то в этот слушатель не попадет ОТМЕНЕННЫЕ события.
     
  13. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Ну вот, я вроде так и сказал..
    Мне это и надо, если проверяя авторизирован ли игрок я отменяю событие чата, то мне не надо чтоб второй метод ловил событие чата и форматировал его)
     
  14. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    1) Убери все игноры
    2) Проверка на кенцел через event.isCancelled()
    3) Довольно странная идея форматирования у тебя. Ты отменяешь евент, а затем отсылаешь сообщение сам, но зачем? Такая штука нужна только в очень рарных случаях, ты уверен что у тебя этот случай?
     
  15. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    1) Но... Зачем? У меня довольно много листенеров, и еще планирую много, и если хоть один из них событие отменяет, то мне не надо чтоб кто-то еще продолжил его обрабатывать...
    2) Знаю.
    3) Ну... Мне так удобнее :3 Не думаю что это так уж сильно нагружает..)
    4) И вообще, проблема решена еще с того момента когда мне объяснили что приоритеты наоборот работают.. После этого все работает как надо...
     

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