[Решено] Изменение сообщения о неизвестной или неполной команде

SmashDestroy

Активный участник
Пользователь
Баллы
63
Всем привет!

У меня запущено:
- Paper 1.19.2
- LuckPerms
- ProtocolLib
- Vault

Что я делаю:
Ввожу любую несуществующую команду, либо команду без необходимых параметров.
Например, "/qwerty" или "/gamemode" (без указания названия игрового режима).

Что происходит:
Получаю сообщение об ошибке:
qPiaHbO.png


Что я хочу сделать:
Мне хотелось бы изменить это сообщение об ошибке.
Например, чтобы вместо нее выводилось обычное "Unknown command. Type "/help" for help.".

Я уже пробовал изменять значение параметра "messages.unknown-command" в файле "spigot.yml", это не помогает. Причем по дефолту в этом файле уже находится желаемый текст "Unknown command. Type "/help" for help.", но сервер его оттуда не подтягивает в чат.

Зато сообщение из этого файла выводится в консоли сервера, если вбить туда несуществующую команду.
9S3KtUn.png


Собственно, мой вопрос и просьба о помощи:
Подскажите пожалуйста, можно ли надпись "Неизвестная или неполная команда..." заменить на свою? Может быть, я просто не нашел нужный конфиг.
Если сообщение нельзя изменить через конфиг, можно ли изменить его, написав какой-нибудь листенер?
Если это возможно, прошу подсказать, какой именно ивент нужно перехватывать.
 
Нашел способ, как можно выводить свое сообщение на несуществующие команды.

Нужно обрабатывать PlayerCommandPreprocessEvent и проверять отправленную команду с помощью Bukkit.getServer().getHelpMap().getHelpTopic("command") == null

Тогда, например, если введена команда "/asdasdasdasdasd", можно будет отменить ивент и отправить игроку кастомное сообщение.

Но это решение не подойдет для команд, которые существуют, но отправлены без необходимых параметров (например, '/gamemode").
 
Скорее всего, это сообщение локализуется на клиенте. А клиентская локализация меняется ресурспаком.
Ещё как вариант анализировать и изменять отправляемые сообщение при отправке на уровне пакетов.
Оба варианта изврат, но, возможно, кто-то предложит более адекватное решение
 
Скорее всего, это сообщение локализуется на клиенте. А клиентская локализация меняется ресурспаком.
Да, действительно :confused:
Если сменить язык на английский, то и ошибка будет на английском языке.
 
Да, действительно :confused:
Если сменить язык на английский, то и ошибка будет на английском языке.
Это не означает, что локализация происходит на клиенте. Сервер тоже прекрасно знает язык клиента, выбранный в настройках. Поэтому с сервера тоже в теории можно посылать сообщения на разных языках.

Но чисто интуитивно могу сказать, что это всё-таки клиентская локализация
 
В общем решил зайти немного с другой стороны.

Не пытаюсь изменить текст ошибки, а перехватываю PlayerCommandPreprocessEvent, там проверяю отправленную игроком команду на соответствие любомуиз условий:
  • на отсутствие команды в Bukkit.getServer().getCommandMap().getKnownCommands() (чтобы на команды типа "/asdasdasd" вывести свое сообщение об ошибке)
  • на наличие у игрока пермишена на команду (чтобы в ответ на команды типа "/me", которые запрещены через LuckPerms, вывести сообщение об отсутствии разрешения на использование команды)
  • на наличие команды в списке запрещенных команд из конфига плагина (туда пока что впихнул только команду /luckperms и ее алиасы, потому что, как я понял, у нее нет пермишена и ее нельзя запретить только для игроков)
 
В общем решил зайти немного с другой стороны.

Не пытаюсь изменить текст ошибки, а перехватываю PlayerCommandPreprocessEvent, там проверяю отправленную игроком команду на соответствие любомуиз условий:
  • на отсутствие команды в Bukkit.getServer().getCommandMap().getKnownCommands() (чтобы на команды типа "/asdasdasd" вывести свое сообщение об ошибке)
  • на наличие у игрока пермишена на команду (чтобы в ответ на команды типа "/me", которые запрещены через LuckPerms, вывести сообщение об отсутствии разрешения на использование команды)
  • на наличие команды в списке запрещенных команд из конфига плагина (туда пока что впихнул только команду /luckperms и ее алиасы, потому что, как я понял, у нее нет пермишена и ее нельзя запретить только для игроков)
Это всё, конечно, хорошо, но:

1) Не все плагины полноценно регистрируют команды. Некоторые обрабатывают их как раз через CommandPreprocessEvent. Правда, скорее всего, там и сообщения другие

2) Данное решение не подойдёт для подаргументов команды. Ты сам привёл пример с /gamemode
Права подаргументов в теории можно получить только у ванильных команд, и то не уверен, что это будет легко
 
Это всё, конечно, хорошо, но:

1) Не все плагины полноценно регистрируют команды. Некоторые обрабатывают их как раз через CommandPreprocessEvent. Правда, скорее всего, там и сообщения другие
Понятно, спасибо.
Теперь буду знать, в чем дело, если на такой плагин попаду.


2) Данное решение не подойдёт для подаргументов команды. Ты сам привёл пример с /gamemode
Права подаргументов в теории можно получить только у ванильных команд, и то не уверен, что это будет легко
Еще раз спасибо.
Я вообще не знал, что у аргументов команды могут быть свои отдельные пермишны.

А "/gamemode" я заблочил полностью через Лакпермс по его пермишну "minecraft.command.gamemode" и результат мне понравился.
Команда не работает даже если вызвать ее с аргументом "/gamemode creative", и в чат приходит сообщение об отсутствии разрешения.
 
Назад
Верх