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

Помогите Получение слушателем информации раньше других

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

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

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

    Баллы:
    88
    Приветствую самых умных людей сообщества!

    Мне снова нужна ваша помощь, допустим есть у меня слушатель PlayerCommandPreprocessEvent, я хочу, чтобы он получал информацию о событии раньше любых других подобных слушателей, соответственно, ставлю ему приоритет @EventHandler(priority = EventPriority.LOWEST), это всё хорошо, но работает ровно до тех пор, пока у другого плагина не появится аналогичный слушатель с таким же приоритетом. И тут начинается рулетка, какой из плагинов с слушателем с таким же приоритетом загружен сервером раньше, тот слушатель и доберется до события раньше других. Попытка называть плагин согласно алфавита не помогает загрузиться раньше...

    Вопросы:
    1. Как сделать так, чтобы мой слушатель получал информацию о событии раньше других?
    2. Или как заставить мой плагин загрузиться раньше других плагинов?
    3. Такое вообще возможно?
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Обратиться к разработчику плагина, где тоже стоит LOWEST, и попросить повысить. Но шанс на успех мал. Но других вариантов в бакките нет.
    Можешь перехватывать команды на уровне BungeeCord или Velocity - это будет раньше любых баккитовских плагинов
     
  3. Автор темы
    Korvinius

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

    Баллы:
    88
    Я пишу общедоступный плагин, но не все владельцы серверов могут быть порядочными и некоторые могут захотеть украсть приватную информацию, а это нужно для того, чтобы предохраниться от возможных потенциальных плагинов-взломщиков, которые могут поставить себе такие админы, так что врятли обращение к кому-то неизвестному может быть успешным)
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ну если админ сервера захочет, то он украдёт в любом случае, чего бы ты не делал. Вариант с банжой актуален. Ещё можно на уровне пакетов производить необходимые действия. Но опять же, смысла в этом надо. Кому надо - украдёт
     
  5. Автор темы
    Korvinius

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

    Баллы:
    88
    ну как минимум попытаюсь организовать проверку отслеживаются ли команды на этом сервере и вывести сообщение игроку с предупреждением, что такие-то плагины пытаются отслеживать команды, чтобы игроки знали можно ли доверять этому серверу
     
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Слежку никак не отследить от обычной работы плагина. Ты можешь получить все обработчики PlayerCommandPreprocessEvent с приоритетом LOWEST, но это не скажет ровным счётом ни о чём
     
  7. Автор темы
    Korvinius

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

    Баллы:
    88
    да, я понимаю, но я могу вывести список этих плагинов игроку, а он уже сам пусть решает доверять или нет
     
  8. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ну ок. В таком случае можно примерно так:
    PHP:
    for (RegisteredListener listener PlayerCommandPreprocessEvent.getHandlerList().getRegisteredListeners()) {
        if (
    listener.getPriority() != EventPriority.LOWEST) continue;
        if (
    listener.getPlugin() == this.plugin) continue;
        
    this.plugin.getLogger().warning("Плагин " listener.getPlugin().getName() + " может перехватывать"
            
    " команды (класс " listener.getListener().getClass().getName() + ")");
    }
     
  9. Автор темы
    Korvinius

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

    Баллы:
    88
    Спасибо!
     
  10. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Как вариант перетасовать RegisteredListener в HandlerList как тебе нужно, с помощью рефлексии, может сработать
     
  11. Автор темы
    Korvinius

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

    Баллы:
    88
    Понял, спасибо, буду пытатьтся
     
    Последнее редактирование: 23 мар 2023
  12. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Не было времени на твой комент с кодом, если все ещё актуально, могу попробовать помочь
     
  13. ZDCoder

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

    Баллы:
    76
    Не знаю будет ли это работать, но можно было бы хукнуть класс в котором вызывается наше событие по дефолту, и перед вызовом оригинального события, вызвать наше. Это только на уровне догадок, мне лень было проверять.
     
  14. Автор темы
    Korvinius

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

    Баллы:
    88
    Не спасибо, уже не актуально, я понял что смысла нет, всё-равно на каждый костыль, найдётся другой, который его обойдёт, АПИ сервера так сделано, в нём не о безопасности совсем речь), там даже плагины авторизации типа Authme не могут защитить пароли, если админ сервера захочет их просматривать с помощью другого плагина
     
  15. HauserGrim

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

    Баллы:
    96
    loadbefore в plugin.yml, но там нужно указывать список таких плагинов.
     

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