Народ vs WorldGuard
(Если кто-то не хочет читать весь текст, то в самом низу в двух словах написано, как избавиться от назойливого перезаписывания команд!)
Многие сталкивались с проблемой, когда WorldGuard в новых версиях "отбирает" команды, такие как god, heal и locate. Помимо этого, он добавляет ещё команду ungod, slay и stack. Пользователям CMI, возможно, это не доставляет неудобств(не проверял), но пользователи Essentials точно сталкиваются с проблемами использования команд на лечение и режим бога.
Настройка overridden-command(Essentils\config.yml) (например, добавление туда god и heal) редко помогает решить проблему. А что насчет команды locate? В итоге оставался единственный вариант: добавлять команды в файл commands.yml. Однако у этого способа есть недостаток — мы теряем автодополнение (tab-комплит подставляет только ники игроков).
Сначала я решил написать плагин, который будет лезть в CommandMap и менять обработчики команд. Но вчера мне пришло озарение: почему бы просто не изменить код WorldGuard, чтобы он не регистрировал эти команды? После недолгого изучения кода я понял, что проще всего скомпилировать класс с модифицированной реализацией, в которой эти команды просто не регистрируются. В результате:
- Команды перестанут регистрироваться;
- Плагин будет работать корректно;
- Ошибок в консоли не будет.
Вот что вышло:
Многие сталкивались с проблемой, когда WorldGuard в новых версиях "отбирает" команды, такие как god, heal и locate. Помимо этого, он добавляет ещё команду ungod, slay и stack. Пользователям CMI, возможно, это не доставляет неудобств(не проверял), но пользователи Essentials точно сталкиваются с проблемами использования команд на лечение и режим бога.
Настройка overridden-command(Essentils\config.yml) (например, добавление туда god и heal) редко помогает решить проблему. А что насчет команды locate? В итоге оставался единственный вариант: добавлять команды в файл commands.yml. Однако у этого способа есть недостаток — мы теряем автодополнение (tab-комплит подставляет только ники игроков).
Сначала я решил написать плагин, который будет лезть в CommandMap и менять обработчики команд. Но вчера мне пришло озарение: почему бы просто не изменить код WorldGuard, чтобы он не регистрировал эти команды? После недолгого изучения кода я понял, что проще всего скомпилировать класс с модифицированной реализацией, в которой эти команды просто не регистрируются. В результате:
- Команды перестанут регистрироваться;
- Плагин будет работать корректно;
- Ошибок в консоли не будет.
Вот что вышло:
Сначала я скомпилировал класс и попытался заменить его в архиве .jar с помощью архиватора. Однако не сработало: получившийся .jar файл оказывался повреждённым. Тогда я решил разархивировать .jar файл, заменить нужный класс, собрать архив обратно и изменить его расширение(.rar -> .jar). Но и это не помогло(ну кто-же знал, что это так не работает хехе). Погуглив, я нашёл команду для правильной сборки .jar файлов. Так появилась идея написать скрипт, который бы:
1. Разбирал .jar файл во временную папку.
1. Разбирал .jar файл во временную папку.
2. Заменял старый класс на новый.
3. Собирал архив обратно.
Создал скрипт, запустил, и — РАБОТАЕТ. Однако в логах появилась ошибка: при запуске через рефлексию пытались получить конструктор класса с параметром WorldGuard. Это я не учёл. Пришлось пересобрать класс, и теперь он выглядел вот так: