В 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: есть один родственный ключ:
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, поэтому никакой дополнительный модуль не требуется. Значения по умолчанию:
custom-join-message: "none"custom-quit-message: "none"custom-new-username-message: "none"hide-join-quit-messages-above: -1Два важных значения легко перепутать, и во многих ответах на форумах они указаны наоборот:
"none"означает Essentials не трогает сообщение - игроки видят обычную строку «joined the game».""(пустая строка) означает скрыть сообщение полностью.
Значит, чтобы скрыть оба сообщения для всех, нужно так:
custom-join-message: ""custom-quit-message: ""Затем выполните /essentials reload (из консоли - essentials reload без слеша) и проверьте, войдя со второго аккаунта. Общие принципы работы файла - правила YAML, что требует перезапуска, какие разделы зависят от jar-модулей - описаны в руководстве по config.yml в EssentialsX, поэтому здесь они не повторяются.
Чтобы заменить сообщение, а не скрыть его, напишите свой текст с цветовыми кодами & и плейсхолдерами, которые предоставляет Essentials:
| Плейсхолдер | Превращается в |
|---|---|
{PLAYER} | Отображаемое имя (никнейм, префикс) |
{USERNAME} | Имя аккаунта |
{PREFIX} / {SUFFIX} | Префикс и суффикс из плагина прав |
{ONLINE} | Игроков онлайн сейчас |
{UNIQUE} | Уникальных игроков, когда-либо заходивших |
{UPTIME} | Сколько времени работает сервер |
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 (по умолчанию) сообщения показываются всегда. Если задать число, сообщения о входе и выходе перестанут выводиться, когда онлайн будет столько игроков:
hide-join-quit-messages-above: 40На сервере с шестьюдесятью игроками и постоянной текучкой спам о входах вытесняет с экрана настоящие разговоры, а на сервере с восемью друзьями строка о входе - это способ узнать, что кто-то онлайн. Этот ключ позволяет одному конфигу подходить для обоих периодов жизни сервера.
Как скрыть от игрока его собственное сообщение о входе#
Тема, с которой сюда приходят многие, уже: все остальные должны видеть «Alex joined the game», а сам Alex - нет, потому что он и так знает, а на сервере с приветствием или MOTD в чате это ещё одна строка, оттесняющая полезный текст.
Ключа в EssentialsX для этого нет. У события входа одно сообщение, которое рассылается всем, списка получателей у него нет. Обойти это можно так: очистить сообщение события и отправить свою копию всем игрокам, кроме вошедшего. В Skript, если вы им уже пользуетесь:
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:
@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 решает это одним ключом конфига и тремя правами:
allow-silent-join-quit: true| Право | Эффект |
|---|---|
essentials.silentjoin | Нет сообщения о входе для этого игрока |
essentials.silentquit | Нет сообщения о выходе для этого игрока |
essentials.silentjoin.vanish | Дополнительно невидим при входе |
Ни одно из прав ничего не делает, пока allow-silent-join-quit равно false (это значение по умолчанию), так что включение ключа - шаг, который чаще всего упускают. Выдавайте эти права группе, а не отдельным людям:
$ 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.
newbies: announce-format: '&dWelcome {DISPLAYNAME}&d to the server!' spawnpoint: newbies kit: toolsannounce-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, отправляют собственные уведомления о входе и выходе, которые настраиваются отдельно в файлах моста.


