EN
Groundbreaking
Groundbreaking
goals
0 of $ 1 450 money raised
For my little dream fund

Народ vs 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 файл во временную папку.
2. Заменял старый класс на новый.
3. Собирал архив обратно.
Создал скрипт, запустил, и — РАБОТАЕТ. Однако в логах появилась ошибка: при запуске через рефлексию пытались получить конструктор класса с параметром WorldGuard. Это я не учёл. Пришлось пересобрать класс, и теперь он выглядел вот так:
Но беда пришла откуда не ждали: не удавалось скомпилировать класс. Дело в том, что javac не мог найти класс WorldGuard по указанному пути. Тогда я решил создать нужную папку и положить туда оригинальный класс из .jar файла WorldGuard. Начал компилировать снова, но столкнулся с ещё одной ошибкой: класс WorldGuard был скомпилирован на Java 17, а я собирался компилировать на Java 8 (чтобы поддерживать все версии WorldGuard, не проверяя, когда именно добавили эту "супер пупер фичу" с командами).
Тогда я сделал вот что:
1. Создал пустышку для класса WorldGuard. (Просто указал package и class + название)
2. Скомпилировал её(пустышку) на Java 8.
3. Наконец, пересобрал всё заново.
Теперь всё работает без ошибок!
Как в итоге "починить" WorldGuard:
1. Поместите в одну папку (Все файлы прикреплены к посту):
    - GeneralCommands.class
    - script.bat
    - .jar файл вашего WorldGuard.
2. Дважды кликните на script.bat.
Вот и всё. Спасибо за внимание <3!
GeneralCommands.class277 ByteDownload
script.bat793 ByteDownload

Subscription levels

Embark

$ 1,87 per month
Даёт доступ к постав где я расказываю про интересные ресурсы, которыми пользуюсь сам. А так-же лайфаки с ними!

Explore

$ 6,3 per month
Даёт доступ к мои приватным плагинам.

Conquer

$ 11,9 per month
Сюда буду стараться излогать самый эксклюзив!
Go up