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

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

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

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

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

    Баллы:
    63
    Всем привет!

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

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

    Что происходит:
    Получаю сообщение об ошибке:
    [​IMG]

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

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

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

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

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

    Баллы:
    63
    Нашел способ, как можно выводить свое сообщение на несуществующие команды.

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

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

    Но это решение не подойдет для команд, которые существуют, но отправлены без необходимых параметров (например, '/gamemode").
     
  3. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Скорее всего, это сообщение локализуется на клиенте. А клиентская локализация меняется ресурспаком.
    Ещё как вариант анализировать и изменять отправляемые сообщение при отправке на уровне пакетов.
    Оба варианта изврат, но, возможно, кто-то предложит более адекватное решение
     
  4. Автор темы
    SmashDestroy

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

    Баллы:
    63
    Да, действительно :confused:
    Если сменить язык на английский, то и ошибка будет на английском языке.
     
  5. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Это не означает, что локализация происходит на клиенте. Сервер тоже прекрасно знает язык клиента, выбранный в настройках. Поэтому с сервера тоже в теории можно посылать сообщения на разных языках.

    Но чисто интуитивно могу сказать, что это всё-таки клиентская локализация
     
  6. Автор темы
    SmashDestroy

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

    Баллы:
    63
    В общем решил зайти немного с другой стороны.

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

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Это всё, конечно, хорошо, но:

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

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

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

    Баллы:
    63
    Понятно, спасибо.
    Теперь буду знать, в чем дело, если на такой плагин попаду.


    Еще раз спасибо.
    Я вообще не знал, что у аргументов команды могут быть свои отдельные пермишны.

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

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