RE:NODE

Zprávy o připojení a odchodu v Minecraftu: skrytí a úprava

Text: Tým RE:NODE
14 min čtení


Vanilla Minecraft nemá žádné nastavení, které by skrylo nebo změnilo žluté řádky „joined the game“ a „left the game“. Neexistuje na ně gamerule, klíč v server.properties ani háček pro datapack. Chceš-li je změnit, potřebuješ plugin a na serveru s Paperem je obvyklou odpovědí EssentialsX: custom-join-message a custom-quit-message v jeho config.yml, kde "none" ponechá vanilla zprávu a "" ji úplně skryje. Členové staffu, kteří se mají připojit bez ohlášení, dostanou allow-silent-join-quit: true a oprávnění essentials.silentjoin a essentials.silentquit. Jediný požadavek, který žádný konfigurační soubor nepokryje, je „ukaž zprávu všem kromě hráče, který se připojil“ - na to stačí pár řádků v Skriptu nebo malý plugin, obojí najdeš níže.

Proč na to vanilla nemá přepínač#

Zpráva o připojení není text, který server napíše sám. Když se hráč přihlásí, server pošle všem připojeným klientům překládatelnou komponentu - klíč multiplayer.player.joined s jménem hráče jako argumentem - a každý klient ji vykreslí ve svém jazyce. Odchod používá multiplayer.player.left a hráč, který si od poslední návštěvy změnil jméno, dostane multiplayer.player.joined.renamed, tedy řádek „(formerly known as ...)“. Zpráva jde všem online, včetně hráče, který právě dorazil, a vypíše se také do konzole serveru.

Mojang za ta léta přidal gamerule pro mnoho hlášení - zprávy o smrti, oznámení o advancementech, výstupy příkazů - ale nikdy ne pro připojení a odchody. To je celý důvod, proč se na to lidé pořád ptají: projdou seznam gamerules, najdou showDeathMessages a announceAdvancements a předpokládají, že musí existovat i varianta pro připojení. Neexistuje. Novější verze navíc gamerules přejmenovávají (1.21.11 je přesunula na názvy malými písmeny s podtržítky, například show_death_messages), takže když hledáš přepínač pro smrt nebo advancementy, doplň si /gamerule tabulátorem na své vlastní verzi a nespoléhej na starý seznam.

Co vanilla má, pro úplnost:

  • Resource pack serveru může přepsat překlad. Nastavením multiplayer.player.joined na prázdný řetězec v jazykovém souboru packu se změní, co klienti zobrazují, ale funguje to jen u hráčů, kteří pack přijmou, na některých verzích to nechá v chatu prázdný řádek a po dobu, kdy je pack načtený, to mění text i v singleplayeru. Je to kuriozita, ne řešení. Jak se pack serveru doručuje, popisuje článek MOTD, ikona a resource packy.
  • Nic na straně konzole. Ani řádek v logu konzole nejde bez pluginu potlačit.

Na vanilla nebo Fabric serveru je tedy upřímná odpověď „přejdi na Paper, nebo najdi mod, který zprávu upraví“. Zbytek tohoto návodu počítá s Paperem nebo jeho forkem, což je to, co provozuje většina serverů s pluginy.

Co Paper a Spigot umí a neumí změnit#

Paper ani Spigot nevystavují zprávu o připojení ve svých vlastních konfiguračních souborech. spigot.yml má blok messages:, ale ten pokrývá kick kvůli whitelistu, neznámý příkaz, plný server, zastaralého klienta a server a texty restartu - ne připojení. Paperův config/paper-global.yml má sekci messages: s jedním souvisejícím klíčem:

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

S hodnotou true používá zpráva o odchodu zobrazované jméno hráče (které mohl změnit plugin pro přezdívky nebo prefixy) místo uživatelského jména. Zprávu to neskryje a pro připojení žádný odpovídající klíč není.

Co Paper dává, je API. Každé připojení vyvolá PlayerJoinEvent, jehož zprávu může libovolný plugin nahradit nebo vymazat, a každý odchod stejně tak PlayerQuitEvent. Paper pro ně používá komponenty Adventure, takže plugin může nastavit plně formátovanou zprávu s hex barvami, textem při najetí myší a akcemi po kliknutí. Tak to dělá EssentialsX, vanish pluginy i chatové pluginy - a proto se také dva nainstalované současně mohou o stejnou zprávu přetahovat, což je rozebráno v řešení potíží níže.

KdeKontrola připojení a odchoduPoznámky
Vanilla, FabricŽádnáJen mody nebo trik s resource packem
spigot.ymlŽádnáJen jiné kick a chybové texty
paper-global.ymlJen jméno u odchoduuse-display-name-in-quit-message
PluginyPlnáPřes eventy připojení a odchodu

EssentialsX custom-join-message a custom-quit-message#

Pokud už EssentialsX na serveru běží, pro běžné případy nepotřebuješ nic dalšího. Klíče jsou v plugins/Essentials/config.yml v hlavním jaru, takže není potřeba žádný modul. Výchozí hodnoty:

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

Ty dvě hodnoty, na kterých záleží, se snadno zamění a spousta odpovědí na fórech je má obráceně:

  • "none" znamená, že Essentials zprávu nechá být - hráči uvidí normální vanilla řádek „joined the game“.
  • "" (prázdný řetězec) znamená, že zpráva se úplně skryje.

Skrytí obou zpráv pro všechny tedy vypadá takto:

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

Pak spusť /essentials reload (z konzole essentials reload bez lomítka) a vyzkoušej to přihlášením z druhého účtu. Obecná mechanika souboru - pravidla YAML, co vyžaduje restart, které sekce závisí na jarech modulů - je v průvodci config.yml pro EssentialsX, takže se tu neopakuje.

Chceš-li zprávu místo skrytí nahradit, napiš vlastní text s barevnými kódy & a zástupnými výrazy, které Essentials nabízí:

Zástupný výrazZmění se na
{PLAYER}Zobrazované jméno (přezdívka, prefix)
{USERNAME}Jméno účtu
{PREFIX} / {SUFFIX}Prefix a suffix z pluginu pro oprávnění
{ONLINE}Aktuálně online hráči
{UNIQUE}Unikátní hráči, kteří se kdy připojili
{UPTIME}Jak dlouho server běží
yaml
custom-join-message: "&8[&a+&8] &7{USERNAME}"custom-quit-message: "&8[&c-&8] &7{USERNAME}"

Tento kompaktní styl [+] jméno / [-] jméno je na vytížených serverech oblíbený, protože přenese informaci na čtvrtině místa. Přívětivější verze pro malý server může být "&e{PLAYER} &7has arrived - {ONLINE} online".

Pár detailů, které stojí za to znát, než si vybereš formát:

  • `{PLAYER}` oproti `{USERNAME}`. {PLAYER} obsahuje všechno, co si zobrazované jméno nabralo - /nick, prefix ranku z LuckPerms přes Vault. Pokud tvůj formát chatu už ranky ukazuje, může být řádek o připojení s {PLAYER} dlouhý a hlučný. {USERNAME} je vždy čisté jméno účtu.
  • Prefixy potřebují Vault. {PREFIX} a {SUFFIX} pocházejí z tvého pluginu pro oprávnění přes Vault. S LuckPerms bez Vaultu vyjdou prázdné. Průvodce LuckPerms popisuje nastavení prefixů po skupinách.
  • Hodnotu dej do uvozovek. Zpráva začínající znakem & nebo obsahující dvojtečku musí být v uvozovkách, jinak se YAML nenačte a Essentials tiše ponechá starou hodnotu.

Přejmenovaní hráči

custom-new-username-message se použije místo custom-join-message, když se vracející se hráč od poslední návštěvy přejmenoval v Mojangu. S výchozí hodnotou "none" Essentials použije i pro něj tvoji běžnou vlastní zprávu o připojení. Chceš-li přejmenování zdůraznit, klíč přijímá také {OLDUSERNAME}. Pokud nastavíš vlastní zprávu o připojení, zkontroluj i tento klíč, jinak dostanou přejmenovaní hráči zprávu v jiném stylu než všichni ostatní.

Skrytí zpráv jen při vytíženém serveru

hide-join-quit-messages-above je nastavení, které chtějí velké servery a malé ne. S hodnotou -1 (výchozí) se zprávy zobrazují vždy. Nastav číslo a zprávy o připojení a odchodu se přestanou zobrazovat, jakmile je online tolik hráčů:

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

Na serveru se šedesáti lidmi a neustálým příchodem a odchodem spam o připojeních vytlačuje skutečnou konverzaci z obrazovky, kdežto na serveru s osmi kamarády je řádek o připojení způsob, jak poznáš, že je někdo online. Tento klíč umožní, aby stejná konfigurace sloužila oběma fázím života serveru.

Skrytí vlastní zprávy o připojení před samotným hráčem#

Téma, které sem přivádí mnoho lidí, je užší: všichni ostatní mají vidět „Alex joined the game“, ale Alex ne, protože to ví, a na serveru s uvítací zprávou nebo MOTD v chatu je to jen další řádek, který odsouvá užitečný text.

Žádný klíč v EssentialsX to neumí. Event připojení má jednu zprávu, která se rozešle všem; nemá seznam příjemců. Cesta okolo je vymazat zprávu eventu a poslat vlastní kopii každému hráči kromě toho, kdo se připojil. Ve Skriptu, pokud ho už provozuješ:

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

Řádek loop-player is not player je podmínka, která připojujícího se hráče přeskočí. Skript je ale na tohle samotné těžký plugin. Pokud ty nebo někdo z tvého týmu píše v Javě, je totéž tucet řádků v listeneru Paper pluginu:

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);}

Dvě věci v tomto úryvku jsou záměrné. Nejdřív přečíst joinMessage() a znovu ji odeslat znamená, že zůstane zachováno, cokoli už nastavil EssentialsX nebo jiný plugin - tvůj listener mění jen to, kdo ji dostane. A řádek pro konzoli vrací připojení do logu serveru, protože vymazání zprávy eventu ji odstraní i z konzole, což později ztěžuje moderaci. Listener zaregistruj s pozdní prioritou (@EventHandler(priority = EventPriority.HIGHEST)), aby běžel až po pluginech, které zprávu formátují.

Nekombinuj to s custom-join-message: "" v Essentials. Pokud Essentials zprávu vymaže jako první, tvůj listener nemá co přeposlat a připojení neuvidí vůbec nikdo.

Tiché připojení pro staff#

Staff se často chce přihlásit bez ohlášení - aby sledoval podezřelého cheatera, něco zkontroloval ve 3 ráno, nebo prostě proto, že připojení moderátora mění chování chatu. EssentialsX to řeší jedním konfiguračním klíčem a třemi oprávněními:

plugins/Essentials/config.yml
allow-silent-join-quit: true
OprávněníEfekt
essentials.silentjoinŽádná zpráva o připojení pro tohoto hráče
essentials.silentquitŽádná zpráva o odchodu pro tohoto hráče
essentials.silentjoin.vanishPři příchodu je navíc ve vanishi

Žádné z těchto oprávnění nic nedělá, dokud je allow-silent-join-quit nastaven na false, což je výchozí hodnota, takže zapnutí klíče je krok, který lidé přehlížejí. Oprávnění přiděluj skupině, ne jednotlivcům:

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

Rozmysli si, jestli chceš i vanish oprávnění. Tiché připojení bez vanishe pořád dá hráče do tab listu, do výpisu /list i do počtu spících hráčů, takže každý, kdo dává pozor, ho za pár sekund uvidí přijít. Tiché připojení odstraní jen řádek v chatu. Pozor na jednu past u skupin s wildcardem: skupina s essentials.* drží všechna tři oprávnění, takže admini, kteří čekali, že budou ohlášeni normálně, ohlášeni nebudou. Pokud chceš wildcard, ale ne ticho, nastav na této skupině oprávnění výslovně na false.

Vanish pluginy a falešné zprávy o připojení a odchodu#

Vanish je druhá polovina problému se staffem. EssentialsX má /vanish (oprávnění essentials.vanish), který hráče skryje v tab listu a ve výhledu ostatních. Související klíče:

  • hide-displayname-in-vanish: true - drží zobrazované jméno hráče ve vanishi mimo místa, která by ho prozradila.
  • sleep-ignores-vanished-player: true - admin ve vanishi neblokuje přeskočení noci.
  • last-message-reply-vanished: false - hráči nemohou odpovědět přes /reply hráči ve vanishi, kterého nevidí, což by ho jinak prozradilo.

Essentials /vanish nevypíše falešný řádek „left the game“, když někdo zmizí, takže moderátor, který zmizí uprostřed rozhovoru, prostě zmizí z tab listu bez vysvětlení. Právě tady si své místo získávají specializované vanish pluginy. SuperVanish (zdarma) a PremiumVanish (placený, od stejného autora) umějí při zmizení hráče poslat falešnou zprávu o odchodu a při jeho znovuobjevení falešnou zprávu o připojení, skrýt skutečné zprávy o připojení a odchodu u hráčů, kteří se přihlásí ve vanishi, a spolupracují s dalšími pluginy, aby se skrytý staff neobjevoval třeba na webových mapách nebo v propojení s Discordem. Jejich volby jsou ve vlastních konfiguračních souborech; po prvním startu si přečti vygenerovaný config.yml a nekopíruj klíče ze starého příspěvku na fóru, protože se rozložení mezi verzemi změnilo.

Používej jeden vanish systém, ne dva. Provoz SuperVanish vedle Essentials /vanish dává dvě různé představy o tom, kdo je skrytý, a ostatní pluginy uvěří tomu, kterého se zrovna zeptají.

Zprávy při prvním připojení a uvítání#

Když se hráč připojí úplně poprvé, mohou se objevit dvě zprávy: normální zpráva o připojení (vanilla nebo tvoje vlastní) a oznámení o novém hráči od Essentials z modulu Spawn.

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

announce-format se rozešle všem, jen při úplně prvním připojení hráče a jen pokud je nainstalováno jar EssentialsX Spawn - bez něj se sekce newbies: vůbec nečte. Nastavením na '' uvítání vypneš. Všimni si, že zástupný výraz je tady {DISPLAYNAME}, ne {PLAYER}; obě sekce používají pro totéž jiné názvy a zkopírování jednoho do druhé vypíše doslovný text. Řádky kit a spawnpoint ve stejném bloku jsou popsány v článku EssentialsX kity, warpy a homes.

Dobrý vzor na komunitním serveru je tiché běžné připojení ([+] jméno) plus hlasitější uvítání při prvním připojení, aby si stálí hráči nováčka všimli a pozdravili ho, aniž by byl chat celý večer plný žlutých řádků. Pokud chceš soukromý pozdrav, který uvidí jen nový hráč - pravidla, odkaz na Discord - jde o message of the day, ne o zprávu o připojení. EssentialsX zobrazuje soubor motd.txt ve své složce každému hráči při přihlášení, a to jen jemu.

Barvy, hex a MiniMessage#

custom-join-message a custom-quit-message berou klasické kódy &: &a až &f a &0 až &9 pro barvy, &l tučně, &o kurzíva, &r reset. To pokryje většinu potřeb.

MiniMessage je formát založený na značkách z knihovny Adventure, kterou Paper používá - <green>, <gradient:#ff0000:#0000ff>, <hover:show_text:'...'>. Moderní pluginy ho čím dál víc očekávají a je to jediný praktický způsob, jak dát na řádek o připojení text při najetí myší nebo akci po kliknutí. EssentialsX přesunul vlastní jazykové soubory na značky ve stylu MiniMessage ve vydáních 2.21 (odtud pocházejí primární a sekundární barvy message-colors v config.yml), ale klíče pro připojení a odchod v config.yml pořád dokumentují kódy & a zástupné výrazy. Pokud chceš gradient nebo klikací zprávu o připojení, nastav zprávu z pluginu, který MiniMessage podporuje, nebo z vlastního listeneru přes MiniMessage.miniMessage().deserialize(...), a klíče Essentials nech na "none", aby se nesrazily.

Ať použiješ cokoli, drž řádky o připojení krátké. Objevují se desítkykrát denně a dvouřádkový gradientní banner přestane být okouzlující už druhý večer.

Sítě, Discord a další místa, kde se připojení objeví#

Skrytí řádku ve hře neskryje připojení všude.

  • Proxy sítě. Za Velocity nebo BungeeCordem vyvolává každý backend server vlastní eventy připojení a odchodu. Hráč, který přejde z lobby do survivalu, z lobby „odejde“ a do survivalu se „připojí“, takže to oznámí oba servery a hráči vidí spam o připojeních pokaždé, když někdo změní server. Obvyklé řešení je skrýt zprávy o připojení a odchodu na každém backendu (custom-join-message: "" na každém) a pro zprávy o připojení a odchodu v celé síti použít plugin na straně proxy. Uspořádání popisuje síť s proxy Velocity.
  • Propojení s Discordem. DiscordSRV posílá do propojeného kanálu vlastní zprávy o připojení a odchodu, nastavené ve svých souborech. Jejich skrytí ve hře tam nic nezmění - viz DiscordSRV a integrace s Discordem a pokud se staff připojuje potichu, zkontroluj jeho integraci s vanishem.
  • Tab list a `/list`. Skrytá zpráva o připojení nechá hráče viditelného v obou, pokud není ve vanishi.
  • Konzole. Vymazání zprávy v eventu ji odstraní i z logu. Pokud moderace závisí na logu, pošli ji znovu do konzole jako v listeneru výše.

Řešení potíží#

`custom-join-message: "none"` pořád zobrazuje zprávu. To je správné chování - "none" znamená vanilla. Na skrytí použij "".

Po reloadu se nic nezmění. YAML se nenačetlo (obvyklou příčinou je neuvozené & na začátku hodnoty), nebo jsi upravil kopii souboru. Sleduj konzoli při /essentials reload; chyba parsování pojmenuje řádek.

Objeví se dvě zprávy o připojení. Zprávu nastavují dva pluginy - Essentials a chatový plugin nebo plugin pro zprávy o připojení, případně Essentials a SuperVanish. Jeden z nich nech na výchozím nastavení. Pokud je jednou z těch dvou announce-format pro první připojení, je to očekávané, ale jen při prvním připojení.

Staff s tichým připojením je pořád ohlášen. allow-silent-join-quit je pořád false, nebo je oprávnění nastaveno na skupině, kterou hráč nedědí. lp user <name> permission check essentials.silentjoin ukáže, co Essentials vidí.

Admini se připojují potichu, i když by neměli. Wildcard jako essentials.* zahrnuje i tichá oprávnění. Nastav je na této skupině na false.

Zprávy po instalaci pluginu úplně zmizely. Něco vymazalo zprávu eventu s vyšší prioritou. Odebírej pluginy po jednom, nebo spusť /plugins a hledej cokoli se slovem „join“ nebo „chat“ v názvu. Proč právě tohle způsobují dva pluginy, které dělají jednu práci, vysvětluje článek Pluginy, které stojí za instalaci.

FAQ#

Existuje gamerule na vypnutí zpráv o připojení?

Ne. Gamerules existují pro zprávy o smrti a oznámení o advancementech, ale zprávy o připojení a odchodu je v Java Edition nikdy neměly. Potřebuješ plugin nebo mod.

Skryje "none" zprávu o připojení v EssentialsX?

Ne, dělá pravý opak: "none" říká Essentials, aby vanilla zprávu nechal být. Prázdný řetězec "" ji skryje.

Můžu skrýt zprávu o připojení jen pro hráče, který se připojil?

Konfigurací ne. Zpráva o připojení je jedno hlášení pro všechny. Vymaž ji a pošli znovu každému hráči kromě toho, kdo se připojil, pomocí Skriptu nebo malého listeneru.

Mohou se hráči s rankem připojit bez ohlášení?

Ano. Nastav v Essentials allow-silent-join-quit: true a jejich skupině přiděl essentials.silentjoin a essentials.silentquit. Přidej essentials.silentjoin.vanish, pokud mají být při příchodu navíc neviditelní.

Zastaví skrytí zpráv o připojení zobrazování připojení na Discordu?

Ne. Propojení s Discordem jako DiscordSRV posílají vlastní oznámení o připojení a odchodu, nastavená odděleně v souborech propojení.