RE:NODE

Сообщения о входе и выходе в Minecraft: как скрыть или изменить

Автор Команда RE:NODE
14 мин чтения


В vanilla Minecraft нет настройки, которая скрывает или меняет жёлтые строки «joined the game» и «left the game». Для них нет ни gamerule, ни ключа в server.properties, ни хука в датапаке. Чтобы их изменить, нужен плагин, а на сервере Paper обычный ответ - EssentialsX: ключи custom-join-message и custom-quit-message в его config.yml, где "none" оставляет стандартное сообщение, а "" полностью его скрывает. Персоналу, который должен заходить без объявления, нужны allow-silent-join-quit: true и права essentials.silentjoin и essentials.silentquit. Единственный запрос, который не закрывается конфигом, - «показывать сообщение всем, кроме вошедшего игрока». Для него понадобится несколько строк Skript или небольшой плагин, оба варианта показаны ниже.

Почему в vanilla нет переключателя#

Сообщение о входе - это не текст, который пишет сервер. Когда игрок входит, сервер отправляет каждому подключённому клиенту переводимый компонент: ключ multiplayer.player.joined с именем игрока в качестве аргумента, а клиент отображает его на своём языке. Для выхода используется multiplayer.player.left, а игрок, сменивший имя с прошлого визита, получает multiplayer.player.joined.renamed - строку «(formerly known as ...)». Сообщение рассылается всем, кто онлайн, включая только что вошедшего игрока, и дублируется в консоль сервера.

За годы Mojang добавила gamerule для многих рассылаемых сообщений - о смертях, о достижениях, об ответах команд, - но никогда не добавляла такое правило для входов и выходов. Именно поэтому этот вопрос возникает снова и снова: люди ищут в списке gamerule, находят showDeathMessages и announceAdvancements и считают, что аналог для входа обязан существовать. Его нет. Кроме того, в последних версиях gamerule переименовывают (в 1.21.11 они перешли на имена в нижнем регистре с подчёркиваниями, например show_death_messages), поэтому, если вы ищете переключатель для смертей или достижений, нажмите Tab в /gamerule на своей версии, а не доверяйте старому списку.

Что в vanilla всё-таки есть, для полноты картины:

  • Серверный resource pack может переопределить перевод. Если в языковом файле пакета задать для multiplayer.player.joined пустую строку, клиенты покажут другой текст, но это работает только у игроков, принявших пакет, на некоторых версиях оставляет в чате пустую строку и, пока пакет загружен, меняет текст и в одиночной игре. Это курьёз, а не решение. О том, как доставляется серверный пакет, рассказано в статье MOTD, иконка и resource pack.
  • Ничего на стороне консоли. Строку в консольном логе тоже нельзя подавить без плагина.

Поэтому на сервере vanilla или Fabric честный ответ такой: «перейдите на Paper или найдите мод, который правит это сообщение». Дальше в статье предполагается Paper или его форк - то, на чём работает большинство серверов с плагинами.

Что можно и нельзя изменить в Paper и Spigot#

Ни Paper, ни Spigot не выносят сообщение о входе в собственные файлы настроек. В spigot.yml есть блок messages:, но он охватывает кик по whitelist, неизвестную команду, переполненный сервер, устаревшие клиент и сервер и тексты перезапуска - только не входы. В config/paper-global.yml в секции messages: есть один родственный ключ:

config/paper-global.yml
messages:  use-display-name-in-quit-message: false

При значении true сообщение о выходе использует отображаемое имя игрока (которое мог изменить плагин никнеймов или префиксов) вместо его username. Сообщение это не скрывает, а парного ключа для входа нет.

Зато Paper даёт API. Каждый вход вызывает PlayerJoinEvent, сообщение которого любой плагин может заменить или очистить, и каждый выход так же вызывает PlayerQuitEvent. Paper использует для них компоненты Adventure, так что плагин может задать полностью оформленное сообщение с hex-цветами, всплывающим текстом и действиями по клику. Так работают и EssentialsX, и плагины vanish, и чат-плагины - и поэтому два таких плагина, установленные вместе, могут бороться за одно и то же сообщение, о чём сказано в разделе о неполадках ниже.

ГдеУправление входом и выходомПримечания
Vanilla, FabricНетТолько моды или трюк с resource pack
spigot.ymlНетТолько другие тексты киков и ошибок
paper-global.ymlТолько имя при выходеuse-display-name-in-quit-message
ПлагиныПолноеЧерез события входа и выхода

EssentialsX: custom-join-message и custom-quit-message#

Если EssentialsX уже стоит на сервере, для типовых случаев больше ничего не нужно. Ключи находятся в plugins/Essentials/config.yml в основном jar, поэтому никакой дополнительный модуль не требуется. Значения по умолчанию:

plugins/Essentials/config.yml
custom-join-message: "none"custom-quit-message: "none"custom-new-username-message: "none"hide-join-quit-messages-above: -1

Два важных значения легко перепутать, и во многих ответах на форумах они указаны наоборот:

  • "none" означает Essentials не трогает сообщение - игроки видят обычную строку «joined the game».
  • "" (пустая строка) означает скрыть сообщение полностью.

Значит, чтобы скрыть оба сообщения для всех, нужно так:

yaml
custom-join-message: ""custom-quit-message: ""

Затем выполните /essentials reload (из консоли - essentials reload без слеша) и проверьте, войдя со второго аккаунта. Общие принципы работы файла - правила YAML, что требует перезапуска, какие разделы зависят от jar-модулей - описаны в руководстве по config.yml в EssentialsX, поэтому здесь они не повторяются.

Чтобы заменить сообщение, а не скрыть его, напишите свой текст с цветовыми кодами & и плейсхолдерами, которые предоставляет Essentials:

ПлейсхолдерПревращается в
{PLAYER}Отображаемое имя (никнейм, префикс)
{USERNAME}Имя аккаунта
{PREFIX} / {SUFFIX}Префикс и суффикс из плагина прав
{ONLINE}Игроков онлайн сейчас
{UNIQUE}Уникальных игроков, когда-либо заходивших
{UPTIME}Сколько времени работает сервер
yaml
custom-join-message: "&8[&a+&8] &7{USERNAME}"custom-quit-message: "&8[&c-&8] &7{USERNAME}"

Такой компактный стиль [+] name / [-] name популярен на загруженных серверах, потому что передаёт информацию на четверти места. Более дружелюбный вариант для небольшого сервера - "&e{PLAYER} &7has arrived - {ONLINE} online".

Несколько деталей, которые стоит знать, прежде чем выбрать формат:

  • `{PLAYER}` и `{USERNAME}`. {PLAYER} включает всё, что успело попасть в отображаемое имя: /nick, префикс ранга из LuckPerms через Vault. Если формат чата и так показывает ранги, строка входа с {PLAYER} может получиться длинной и шумной. {USERNAME} - всегда простое имя аккаунта.
  • Для префиксов нужен Vault. {PREFIX} и {SUFFIX} берутся из плагина прав через Vault. Если есть LuckPerms, но нет Vault, они будут пустыми. О задании префиксов для групп рассказано в руководстве по LuckPerms.
  • Берите значение в кавычки. Сообщение, начинающееся с & или содержащее двоеточие, должно быть в кавычках, иначе YAML не разберётся, а Essentials молча сохранит старое значение.

Игроки со сменой имени

custom-new-username-message используется вместо custom-join-message, когда вернувшийся игрок сменил имя Mojang с прошлого визита. При значении по умолчанию "none" Essentials использует для него ваше обычное пользовательское сообщение о входе. Если вы хотите отмечать смену имени, ключ принимает и {OLDUSERNAME}. Если вы задаёте своё сообщение о входе, проверьте и этот ключ, иначе игроки со сменой имени получат сообщение в другом стиле, чем все остальные.

Скрывать сообщения, только когда сервер загружен

hide-join-quit-messages-above - настройка, которая нужна крупным серверам и не нужна маленьким. При -1 (по умолчанию) сообщения показываются всегда. Если задать число, сообщения о входе и выходе перестанут выводиться, когда онлайн будет столько игроков:

yaml
hide-join-quit-messages-above: 40

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

Как скрыть от игрока его собственное сообщение о входе#

Тема, с которой сюда приходят многие, уже: все остальные должны видеть «Alex joined the game», а сам Alex - нет, потому что он и так знает, а на сервере с приветствием или MOTD в чате это ещё одна строка, оттесняющая полезный текст.

Ключа в EssentialsX для этого нет. У события входа одно сообщение, которое рассылается всем, списка получателей у него нет. Обойти это можно так: очистить сообщение события и отправить свою копию всем игрокам, кроме вошедшего. В Skript, если вы им уже пользуетесь:

plugins/Skript/scripts/joinmessage.sk
on join:    set join message to ""    loop all players:        loop-player is not player        send "&e%player% joined the game" to loop-player

Строка loop-player is not player - это условие, которое пропускает входящего игрока. Но ставить Skript только ради этого - тяжело. Если вы или кто-то из вашей команды пишет на Java, то же самое - около дюжины строк в обработчике плагина Paper:

JoinListener.java
@EventHandlerpublic void onJoin(PlayerJoinEvent event) {    Component message = event.joinMessage();    event.joinMessage(null);    if (message == null) return;    Player joined = event.getPlayer();    for (Player p : Bukkit.getOnlinePlayers()) {        if (!p.equals(joined)) p.sendMessage(message);    }    Bukkit.getConsoleSender().sendMessage(message);}

В этом фрагменте два момента сделаны намеренно. Сначала чтение joinMessage() и повторная отправка означают, что всё, что уже задали EssentialsX или другой плагин, сохраняется - ваш обработчик меняет только то, кто его получает. А строка для консоли возвращает вход в лог сервера, потому что очистка сообщения события убирает его и из консоли, что усложняет последующую модерацию. Зарегистрируйте обработчик с поздним приоритетом (@EventHandler(priority = EventPriority.HIGHEST)), чтобы он срабатывал после плагинов, форматирующих сообщение.

Не сочетайте это с custom-join-message: "" в Essentials. Если Essentials очистит сообщение первым, ваш обработчик не найдёт, что пересылать, и никто не увидит вход вовсе.

Тихий вход для персонала#

Персонал часто хочет заходить, не объявляя о себе: понаблюдать за подозреваемым в читах, проверить что-то в 3 часа ночи или просто потому, что вход модератора меняет поведение чата. EssentialsX решает это одним ключом конфига и тремя правами:

plugins/Essentials/config.yml
allow-silent-join-quit: true
ПравоЭффект
essentials.silentjoinНет сообщения о входе для этого игрока
essentials.silentquitНет сообщения о выходе для этого игрока
essentials.silentjoin.vanishДополнительно невидим при входе

Ни одно из прав ничего не делает, пока allow-silent-join-quit равно false (это значение по умолчанию), так что включение ключа - шаг, который чаще всего упускают. Выдавайте эти права группе, а не отдельным людям:

bash
$ lp group moderator permission set essentials.silentjoin true$ lp group moderator permission set essentials.silentquit true$ lp group moderator permission set essentials.silentjoin.vanish true

Подумайте, нужно ли вам и право vanish. Тихий вход без vanish всё равно оставляет игрока в списке игроков по Tab, в выводе /list и в подсчёте спящих игроков, так что любой внимательный увидит его появление через несколько секунд. Тихий вход убирает только строку в чате. Следите за одной ловушкой в группах с wildcard: группа с essentials.* получает все три права, и администраторы, рассчитывавшие на обычное объявление, объявляться не будут. Если вам нужен wildcard, но не тишина, явно задайте этим правам false для такой группы.

Плагины vanish и поддельные сообщения о входе и выходе#

Vanish - вторая половина задачи для персонала. В EssentialsX есть /vanish (право essentials.vanish), который скрывает игрока из списка по Tab и из поля зрения остальных. Связанные с ним ключи:

  • hide-displayname-in-vanish: true - не выводит отображаемое имя скрытого игрока в местах, которые его выдали бы.
  • sleep-ignores-vanished-player: true - скрытый администратор не мешает пропуску ночи.
  • last-message-reply-vanished: false - игроки не могут ответить через /reply скрытому игроку, которого они не видят, иначе это выдало бы его присутствие.

/vanish в Essentials не публикует поддельную строку «left the game», когда кто-то скрывается, поэтому модератор, исчезнувший посреди разговора, просто пропадает из списка по Tab без объяснений. Здесь и оправдывают себя специальные плагины vanish. SuperVanish (бесплатный) и PremiumVanish (платный, того же автора) умеют рассылать поддельное сообщение о выходе, когда игрок скрывается, и поддельное сообщение о входе, когда он снова появляется, скрывать настоящие сообщения о входе и выходе для игроков, зашедших скрытыми, и интегрироваться с другими плагинами, чтобы скрытый персонал не попадал в такие места, как веб-карты или мосты с Discord. Их настройки находятся в собственных файлах конфигурации; читайте сгенерированный config.yml после первого запуска, а не копируйте ключи из старого поста на форуме, потому что структура менялась от версии к версии.

Используйте одну систему vanish, а не две. Если SuperVanish работает рядом с /vanish из Essentials, у вас оказываются две разные картины того, кто скрыт, и другие плагины поверят тому, у кого спросят.

Сообщения о первом входе и приветствия#

Когда игрок заходит впервые, могут появиться два сообщения: обычное сообщение о входе (vanilla или ваше собственное) и объявление о новом игроке от Essentials из модуля Spawn.

yaml
newbies:  announce-format: '&dWelcome {DISPLAYNAME}&d to the server!'  spawnpoint: newbies  kit: tools

announce-format рассылается всем, только при самом первом входе игрока и только если установлен jar EssentialsX Spawn - без него секция newbies: вообще не читается. Чтобы отключить приветствие, задайте ''. Обратите внимание: плейсхолдер здесь {DISPLAYNAME}, а не {PLAYER}; в двух секциях одно и то же называется по-разному, и копирование из одной в другую выводит буквальный текст. Строки kit и spawnpoint в том же блоке разобраны в статье киты, варпы и дома в EssentialsX.

Хороший приём для сервера сообщества - тихий обычный вход ([+] name) и более заметное приветствие при первом входе, чтобы постоянные игроки заметили новичка и поздоровались, а чат весь вечер не был забит жёлтыми строками. Если вам нужно личное приветствие, которое видит только новичок - правила, ссылка на Discord, - то это сообщение дня, а не сообщение о входе. EssentialsX показывает файл motd.txt из своей папки каждому игроку при входе, и только ему.

Цвета, hex и MiniMessage#

custom-join-message и custom-quit-message принимают старые коды &: от &a до &f и от &0 до &9 для цветов, &l - жирный, &o - курсив, &r - сброс. Для большинства задач этого достаточно.

MiniMessage - это формат на основе тегов из библиотеки Adventure, которую использует Paper: <green>, <gradient:#ff0000:#0000ff>, <hover:show_text:'...'>. Современные плагины всё чаще ожидают именно его, и это единственный практичный способ добавить к строке входа всплывающий текст или действия по клику. EssentialsX перевёл собственные языковые файлы на теги в стиле MiniMessage в релизах 2.21 (отсюда берутся основной и вторичный цвета message-colors в config.yml), но ключи входа и выхода в config.yml по-прежнему описаны с кодами & и плейсхолдерами. Если вам нужен градиент или кликабельное сообщение о входе, задавайте сообщение из плагина с поддержкой MiniMessage или из собственного обработчика через MiniMessage.miniMessage().deserialize(...), а ключи Essentials оставьте на "none", чтобы они не конфликтовали.

Что бы вы ни выбрали, делайте строки входа короткими. Они появляются десятки раз в день, и двухстрочный градиентный баннер перестаёт радовать уже ко второму вечеру.

Сети, Discord и другие места, где видны входы#

Скрыв строку в игре, вы не скрываете вход везде.

  • Сети с прокси. За Velocity или BungeeCord каждый внутренний сервер вызывает собственные события входа и выхода. Игрок, переходящий из лобби в survival, «выходит» из лобби и «входит» в survival, поэтому объявляют оба сервера, и игроки видят спам о входах при каждой смене сервера. Обычное решение - скрыть сообщения о входе и выходе на каждом внутреннем сервере (custom-join-message: "" на каждом) и использовать плагин на стороне прокси для общесетевых сообщений. Структура сети описана в статье сети прокси Velocity.
  • Мосты с Discord. DiscordSRV публикует собственные сообщения о входе и выходе в связанный канал, они настраиваются в его файлах. Скрытие в игре там ничего не меняет - см. DiscordSRV и интеграция с Discord и проверьте его интеграцию с vanish, если персонал входит тихо.
  • Список по Tab и `/list`. Скрытое сообщение о входе всё равно оставляет игрока видимым в обоих, если он не в vanish.
  • Консоль. Очистка сообщения в событии убирает его и из лога. Если модерация опирается на лог, отправьте его в консоль повторно, как в обработчике выше.

Неполадки#

`custom-join-message: "none"` всё равно показывает сообщение. Это правильное поведение - "none" означает vanilla. Чтобы скрыть сообщение, используйте "".

После reload ничего не меняется. YAML не разобрался (обычная причина - значение, начинающееся с & без кавычек) или вы отредактировали копию файла. Следите за консолью, когда выполняете /essentials reload; ошибка разбора называет строку.

Появляются два сообщения о входе. Два плагина оба задают его - Essentials и чат-плагин или плагин сообщений о входе, либо Essentials и SuperVanish. Оставьте один из них со значением по умолчанию. Если одно из двух - это announce-format для первого входа, то это ожидаемо, но только при первом входе.

Персонал с тихим входом всё равно объявляется. allow-silent-join-quit по-прежнему равно false, или право задано группе, от которой игрок не наследует. lp user <name> permission check essentials.silentjoin показывает, что видит Essentials.

Администраторы входят тихо, когда не должны. Wildcard вроде essentials.* включает тихие права. Задайте им false для этой группы.

Сообщения полностью пропали после установки плагина. Что-то очистило сообщение события с более высоким приоритетом. Удаляйте плагины по одному или выполните /plugins и поищите всё, в названии чего есть «join» или «chat». Почему два плагина, делающих одну работу, вызывают именно это, рассказано в статье плагины, которые стоит установить.

FAQ#

Есть ли gamerule, чтобы отключить сообщения о входе?

Нет. Есть gamerule для сообщений о смерти и объявлений о достижениях, но для сообщений о входе и выходе его в Java Edition никогда не было. Вам нужен плагин или мод.

Скрывает ли "none" сообщение о входе в EssentialsX?

Нет, он делает обратное: "none" говорит Essentials не трогать стандартное сообщение. Скрывает его пустая строка "".

Можно ли скрыть сообщение о входе только для вошедшего игрока?

Настройкой конфига - нет. Сообщение о входе - это одна рассылка всем. Очистите его и отправьте повторно всем игрокам, кроме вошедшего, с помощью Skript или небольшого обработчика.

Могут ли игроки с рангом входить без объявления?

Да. Задайте allow-silent-join-quit: true в Essentials и выдайте их группе essentials.silentjoin и essentials.silentquit. Добавьте essentials.silentjoin.vanish, если при входе они должны ещё и быть невидимыми.

Перестанет ли Discord показывать входы, если скрыть сообщения о входе?

Нет. Мосты с Discord, такие как DiscordSRV, отправляют собственные уведомления о входе и выходе, которые настраиваются отдельно в файлах моста.