RE:NODE

Valheim ServerSync: jak se konfigurace módů synchronizují

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


Na Valheim serveru s módy patří nastavení označené jako synchronizované serveru. Když se hráč připojí, mód pošle hodnoty ze serveru a klient je po zbytek relace používá, ať říká jeho vlastní konfigurační soubor cokoli. Téměř všechno obstarávají dvě knihovny: ServerSync, kterou mnoho módů kompiluje přímo do svého .dll, a Jotunn, který synchronizuje nastavení, jež jeho módy označí jako admin-only. Obě normálně přicházejí se zámkem. S Lock Configuration = On smí synchronizované hodnoty měnit jen soubor na serveru a hráči na seznamu adminů; s vypnutým zámkem se chování liší podle módu a hráči mohou měnit věci, které by neměli. Pokud si zapamatuješ jediné pravidlo: synchronizovaná nastavení upravuj na serveru, nikdy na klientovi, a nečekej, že soubor klienta řekne cokoli o tom, co server doopravdy vynucuje.

Proč Valheim módy vůbec potřebují synchronizaci konfigurace#

Multiplayer ve Valheimu není autoritativní na straně serveru. Server ukládá svět a přeposílá stav, ale každou zónu simuluje klient hráče, který ji vlastní. Mód, který mění pravidlo - velikost stacků, nosnost, dobu růstu plodin, zdraví nepřátel - proto běží na každém počítači a každý počítač čte svůj vlastní konfigurační soubor.

Bez synchronizace to skončí předvídatelně špatně. Majitel serveru nastaví nosnost na 600, jeden hráč má ve svém souboru pořád výchozích 300 a oba se rozcházejí. Podle módu hráč buď vidí staré pravidlo, nebo nové nekonzistentně, nebo rozsynchronizuje věci všem, kdo stojí v zóně, kterou vlastní. Hůř, hráč si může zvýšit hodnotu ve vlastním souboru a získat výhodu, s níž server nikdy nesouhlasil.

Synchronizace konfigurace řeší obojí. Server je jediným zdrojem pravdy pro nastavení, která se musí shodovat, a klienti se hodnoty dozvědí při připojení. Nastavení, která jsou opravdu osobní - pozice rozhraní, klávesy, barvy - zůstávají nesynchronizovaná, aby si je každý hráč mohl nechat po svém.

Dva systémy: ServerSync a Jotunn#

Většina módů, které synchronizují konfiguraci, používá jeden z těchto dvou a na jednom serveru potkáš oba.

ServerSyncSynchronizace konfigurace v Jotunn
Co to jeMalá knihovna od blaxxun, vložená do každého móduSoučást modovací knihovny Jotunn
Instaluje se jakoNic samostatného; žije uvnitř .dll móduJotunn nainstalovaný jako vlastní plugin
Co se synchronizujeNastavení, která mód zaregistruje v ServerSyncNastavení, která mód označí jako admin-only
ZámekObvykle nastavení Lock Configuration pro každý módAdmin-only nastavení vždy řídí server
Kontrola verzePro každý mód: aktuální a minimální verzeKontrola síťové kompatibility v Jotunn
Typické módyMnoho módů od Smoothbrain, Azumatt a blaxxunObsahové módy postavené na Jotunn

Protože je ServerSync vložená, nikdy se neobjeví jako samostatný řádek v logu BepInEx a není co aktualizovat zvlášť. Každý mód nese kopii, se kterou byl sestaven. Proto jsou potíže se synchronizací přes ServerSync vždy záležitostí jednoho módu: špatně synchronizující mód nic neříká o ostatních.

Jotunn je sdílená knihovna, takže jeho synchronizace se chová stejně u všech módů, které ji používají. Jotunn vysvětlen popisuje knihovnu jako celek; tady je podstatné, že autor módu označí jednotlivá nastavení jako admin-only a Jotunn je posílá ze serveru a brání ne-adminům je měnit.

Stránka módu obvykle říká, který z nich používá, a obvykle to ukáže i konfigurační soubor.

Jak číst synchronizovaný konfigurační soubor#

První start módu vygeneruje jeho soubor v BepInEx/config, pojmenovaný podle GUID pluginu. Módy postavené na běžné šabloně ServerSync popisují každé nastavení v jeho komentáři:

BepInEx/config/com.example.examplemod.cfg
## Settings file was created by plugin ExampleMod v1.2.3## Plugin GUID: com.example.examplemod[1 - General]## If on, the configuration is locked and can be changed by server admins only. [Synced with Server]# Setting type: Toggle# Default value: On# Acceptable values: Off, OnLock Configuration = On[2 - Limits]## Maximum carry weight. [Synced with Server]# Setting type: Single# Default value: 300Max Carry Weight = 600## Show the weight bar on the HUD. [Not Synced with Server]# Setting type: Toggle# Default value: On# Acceptable values: Off, OnShow Weight Bar = On

Přípony [Synced with Server] a [Not Synced with Server] jsou konvence, ne něco, co přidává BepInEx, takže je nemá každý mód. Když chybí, jediným vodítkem je stránka módu nebo jeho vlastní popis každého nastavení. Módy na Jotunn nemusejí nastavení v souboru označovat vůbec; ve hře v editoru jsou admin-only položky ty, které ne-admin nemůže změnit.

Soubor je obyčejné INI jako každá konfigurace BepInEx a platí stejná pravidla: mód ho při startu přepíše, neznámé klíče zahodí a hodnota ve špatné sekci se ignoruje. Valheim módy s BepInEx na serveru popisuje formát souboru obecně.

Co dělá Lock Configuration#

Lock Configuration je přepínač, který určuje, zda se synchronizovaná nastavení vynucují, nebo jsou jen doporučením. Sám se synchronizuje, takže rozhoduje hodnota ze serveru.

  • On (obvyklá výchozí hodnota). Hodnoty serveru pro každé synchronizované nastavení se při připojení aplikují na každého klienta a zůstanou. Ne-admin je během relace nemůže změnit, ani v souboru, ani v editoru ve hře. Hráči na seznamu adminů serveru je mohou ve hře měnit a změna jde na server.
  • Off. Server stále posílá své hodnoty, ale hráči smějí synchronizovaná nastavení lokálně měnit. Co přesně to znamená, závisí na módu: některé použijí klientovu hodnotu jen pro daného hráče, jiné nechají změnu z libovolného klienta rozšířit dál. Nenechávej zámek vypnutý na serveru, kterému plně nedůvěřuješ, a nenechávej ho vypnutý omylem po testování.

Užitečný zvyk: po instalaci módu s ServerSync prohledej celou konfigurační složku serveru kvůli zámku a ověř každý výskyt.

bash
$ grep -H "^Lock Configuration" BepInEx/config/*.cfgBepInEx/config/com.example.examplemod.cfg:Lock Configuration = OnBepInEx/config/com.example.othermod.cfg:Lock Configuration = Off

Každé Off v tom výpisu by mělo být rozhodnutí, ne nehoda.

Kdo se počítá jako admin#

Práva admina pro synchronizaci konfigurace pocházejí z vlastního souboru Valheimu adminlist.txt v adresáři s uloženými daty serveru, tedy ze stejného souboru, který řídí kick a ban. ServerSync ani Jotunn nemají vlastní seznam. Z toho plynou dva důsledky.

Za prvé, formát ID musí být správný. Na serveru jen pro Steam je na řádku SteamID64 hráče; na crossplay serveru je to tvar s prefixem platformy, například Steam_76561198012345678. Hráč uvedený ve špatném formátu není adminem ani pro synchronizaci konfigurace, což se projeví jako zašedlá nastavení v editoru ve hře. Tři seznamové soubory obsahuje formáty celé a spolehlivý způsob, jak ID získat, je z řádku o připojení v logu serveru.

Za druhé, být adminem znamená, že hráč může měnit synchronizované hodnoty serveru přímo ve hře v editoru konfigurace. Nová hodnota se pošle na server, aplikuje se tam, zapíše se do konfiguračního souboru serveru a rozešle všem připojeným. To je pohodlné pro ladění vyváženosti během relace a z přesně stejného důvodu nebezpečné. Seznam adminů drž krátký. Samotný editor popisuje ConfigurationManager na serverech.

Úprava synchronizovaných nastavení: na serveru, pak reload#

Čistý způsob, jak synchronizované nastavení změnit, je upravit soubor na serveru. Zda se změna projeví hned, záleží na módu.

  1. Módy, které sledují svůj soubor. Mnoho módů s ServerSync, včetně většiny postavených na běžné šabloně, sleduje změny vlastního .cfg a po uložení ho znovu načte. Uprav soubor na serveru, ulož a nová hodnota se během chvíle použije na serveru a rozešle připojeným klientům. Pokud mód vypisuje řádek o reloadu, hledej ho v konzoli serveru.
  2. Módy, které čtou při startu. Jiné čtou konfiguraci jen jednou. Uprav soubor, když je server zastavený, a pak ho spusť.

Když nevíš, který druh máš, metoda se zastaveným serverem funguje vždy:

  1. Čistě zastav server a počkej, až se svět uloží.
  2. Uprav soubor v BepInEx/config. Kopii svých úprav si ponech mimo server.
  3. Spusť server a sleduj řádek Loading daného módu.
  4. Připoj se a ověř hodnotu ve hře.

Úpravy souboru klienta problém na serveru nikdy nevyřeší. Po dobu připojení klient používá hodnoty serveru; po odpojení ServerSync obvykle vrátí klientovy vlastní hodnoty. Někteří hráči předpokládají, že soubor na jejich PC musí odrážet server, a jsou zmatení, když to tak není. Nic není špatně - soubor je jejich lokální výchozí stav, ne záznam toho, co server vynucuje.

Na RE:NODE je BepInEx/config serveru otevřený ve správci souborů v panelu se zvýrazněním syntaxe, takže cyklus úprava-uložení-reload nepotřebuje žádné stahování a konzole živě ukazuje výstup reloadu nebo restartu.

Mimo .cfg: YAML a další synchronizované soubory#

Několik velkých módů drží skutečnou konfiguraci v samostatných souborech, často YAML - vlastní tabulky spawnů, seznamy receptů, definice předmětů. ServerSync umí synchronizovat i ty, jako vlastní synchronizované hodnoty, a módy, které ho používají, posílají každému klientovi při připojení celý obsah souboru.

V praxi to znamená:

  • Rozhodující je kopie na serveru, stejně jako u .cfg. Klienti ji dostanou při připojení.
  • Velké soubory zpomalují připojení. Klient musí přijmout každý synchronizovaný soubor, než je plně uvnitř, takže velmi velká sada YAML napříč několika módy prodlužuje připojování. Pokud hráči po přidání módu čekají na načítací obrazovce déle, je to pravděpodobná příčina - jiné příčiny pokrývá zaseknutí při připojování a načítání.
  • Syntaktická chyba zastaví synchronizaci daného módu nebo způsobí návrat k výchozím hodnotám, podle módu. YAML je háklivé na odsazení; stačí tabulátor tam, kde se čekaly mezery. Po úpravě hned zkontroluj log serveru.

Přečti si dokumentaci každého takového módu, kde soubory leží a zda je sleduje kvůli změnám. Cesty nejsou standardizované.

Kontrola verzí jede na stejném spojení#

Handshake, který posílá konfiguraci, také porovnává verze. Odtud pochází většina hlášení „vyhozen při připojení“ na serverech s módy.

ServerSync umožňuje každému módu deklarovat jeho aktuální verzi, minimální verzi, kterou přijme od druhé strany, a zda druhá strana musí mód mít vůbec. Pokud je verze klienta pod minimem nebo je mód povinný a chybí, připojení se odmítne a zpráva o odpojení jmenuje mód a obě verze. Každý mód kontroluje sám sebe, takže hráči se třemi zastaralými módy se to může říct po jednom.

Jotunn dělá stejnou práci centrálně. Každý mód deklaruje úroveň síťové kompatibility (například všichni musí mít mód) a přísnost verze (major, minor nebo patch) a Jotunn při připojení porovná celý seznam a zobrazí okno s neshodami.

code
DisconnectedExampleMod: Server has version 1.2.3, you have 1.2.1.Minimum required version is 1.2.3.

Znění výše je ilustrativní; každý mód a verze ServerSync ho formuluje trochu jinak, ale obsah je vždy název módu a dvě verze. Řešením je srovnat sady, ne zeslabit kontrolu. Kick kvůli neshodě verzí módů obsahuje postup, jak přesně porovnat seznamy klienta a serveru.

Běžná selhání synchronizace a jejich opravy#

PříznakObvyklá příčinaOprava
Nastavení hráče se při připojení vrátí zpětFunguje to, jak má: nastavení je synchronizovanéZměň ho na serveru
Admin nemůže ve hře změnit synchronizované nastaveníNení v adminlist.txt nebo má špatný formát IDPřidej správné ID; seznam se za běhu znovu čte
Úprava souboru na serveru nemá efektMód čte konfiguraci jen při startuZastav, uprav, spusť
Úprava po restartu zmizelaUpravil jsi soubor běžícího serveru, který mód přepsalUpravuj za zastaveného serveru nebo použij mód, který soubor sleduje
Hráči mohou měnit hodnoty vyváženíLock Configuration = Off na serveruZapni ho v souboru toho módu na serveru
Dlouhé načítání při připojeníVelké synchronizované YAML nebo mnoho synchronizovaných módůSoubory zeštíhli nebo přijmi pomalejší připojení
Jeden hráč má jiná pravidlaMód na jeho klientovi chybí a není označen jako povinnýSrovnej sady módů

Dvě selhání si zaslouží víc než řádek v tabulce.

Nastavení, které se vůbec nesynchronizuje. Pokud mód nastavení vyvážení neoznačí jako synchronizované, server ho nemůže vynutit. Rozhoduje soubor každého hráče. Jediné opravy jsou rozdat stejnou konfiguraci spolu se sadou módů - modpack se složkou config nebo exportovaný profil - nebo zvolit mód, který ho synchronizuje. Nepředpokládej, že nastavení je synchronizované jen proto, že jsou ostatní ve stejném souboru.

Svět se změní po problému se synchronizací. Pokud se obsahový mód na serveru nenačte, zatímco klienti ho stále mají, server objekty z toho módu nepozná a ty mohou být ze světa odstraněny, když se jejich zóny příště načtou a uloží. Zastav server ve chvíli, kdy v řádcích Loading některý obsahový mód chybí, a pokud už něco zmizelo, obnov poslední zálohu. Zamčená záloha pořízená před každou změnou módů je nejlevnější ochrana, jaká existuje.

FAQ#

Musím ServerSync instalovat zvlášť?

Téměř nikdy. Většina módů, které ji používají, ji kompiluje do vlastního .dll, takže přijde s módem a neobjeví se jako samostatný plugin. Několik starších sestav ji dodávalo jako vlastní balíček; pokud ji stránka módu uvádí jako závislost, řiď se jí.

Proč můj konfigurační soubor ukazuje jednu hodnotu, ale hra používá jinou?

Protože nastavení je synchronizované a ty jsi připojený k serveru. Hodnota serveru na dobu relace nahradí tvoji. Tvůj soubor je tvůj lokální výchozí stav, používaný v singleplayeru a na serverech, které mód nemají.

Vidí hráči synchronizované hodnoty serveru?

Ano, v editoru konfigurace ve hře po připojení, kde synchronizovaná nastavení ukazují aktuální hodnoty serveru. Nemohou je měnit, pokud není zámek vypnutý nebo nejsou na seznamu adminů.

Ovlivňuje Lock Configuration nastavení, která se nesynchronizují?

Ne. Nesynchronizovaná nastavení jsou vždy na hráči, se zámkem i bez něj. Zámek řídí jen to, zda mohou synchronizované hodnoty serveru měnit ne-admini.

Je synchronizace konfigurace spolehlivý anti-cheat?

Vynucuje hodnoty, které mód zvolí k synchronizaci, což zastaví běžné úpravy nastavení vyvážení. Není to ochrana proti hráči, který upraví samotný mód nebo použije jiné nástroje. Ber ji jako způsob, jak udržet poctivé hráče konzistentní, a na vše ostatní měj zálohy.

Ovlivňují crossplay hráči synchronizaci konfigurace?

Konzoloví hráči nemohou instalovat módy, takže se vůbec nemohou připojit k serveru, jehož módy jsou na klientech povinné. Na serveru s módy jen na straně serveru se synchronizace jich netýká, protože na jejich straně není co synchronizovat.