RE:NODE

Vlastní sada módů pro Valheim na Thunderstore: tvorba a aktualizace

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


Modpack na Thunderstore je malý zip se čtyřmi soubory a žádnými módy: manifest.json, jehož seznam dependencies jmenuje každý mód a verzi, kterou tvůj server používá, ikona icon.png o rozměrech 256 na 256, soubor README.md a volitelně složka config. Nahraješ ho pod názvem týmu a od té chvíle si každý hráč nainstaluje přesně tvoji sestavu jedním kliknutím v r2modman, Gale nebo Thunderstore Mod Manageru. Háček je ve slově „soukromý“: Thunderstore nemá žádné soukromé ani neveřejné balíčky, takže modpack je veřejný ve chvíli, kdy ho nahraješ. Pokud na tom záleží, sdílej raději exportovaný soubor profilu. Pokud ne, je publikovaný balíček nejčistší způsob, jak udržet partu měsíce na stejných verzích - za předpokladu, že ho aktualizuješ záměrně, a ne pokaždé, když vydá novou verzi autor nějakého módu.

Modpack, kód profilu, nebo soubor profilu#

Existují tři způsoby, jak dát skupině stejnou sadu módů, a každý řeší trochu jiný problém.

MetodaKde je uloženaŽivotnostKdo ji uvidí
Kód profiluSdílecí služba profilů na ThunderstoreDočasná, kódy vypršíKaždý, kdo má kód
Soubor profilu (.r2z)Soubor, který posíláš dálTrvaláTen, komu ho pošleš
Modpack na ThunderstoreBalíček na thunderstore.ioTrvalá, verzovanáVšichni

Kód profilu je nejrychlejší a pro první večer je to správný nástroj. Exportovaný .r2z je trvalý a nese i složku config, takže je nejlepší soukromou variantou - obojí popisuje článek profily r2modman pro skupinu. Modpack se vyplatí, když platí cokoli z tohoto:

  • Skupina se mění. Noví hráči přijdou za několik týdnů a neměli by hledat soubor připnutý v kanálu na Discordu.
  • Provozuješ veřejný nebo poloveřejný server a chceš v jeho popisu odkaz, který vždy ukazuje na aktuální sestavu.
  • Chceš historii verzí. Každý upload je číslovaná verze a manager každému hráči řekne, že vyšla nová.
  • Hráči používají různé managery. Balíčky Thunderstore jsou společný formát, který čtou všechny.

Čím modpack není: způsobem, jak redistribuovat cizí módy. Balíček na módech závisí, ale neobsahuje jejich soubory .dll. Pravidla Thunderstore zakazují znovu nahrávat cizí práci a balíček s kopiemi bude odstraněn. Mechanismus závislostí existuje právě proto, abys to dělat nemusel.

Struktura zipu#

Upload je jeden zip archiv a soubory musí ležet v jeho kořeni - ne uvnitř složky. Zazipovat složku místo jejího obsahu je nejčastější důvod, proč je upload odmítnut.

code
LongshipCrew_Modpack-1.0.0.zip    manifest.json    icon.png    README.md    CHANGELOG.md        optional, shown on its own tab    config/             optional, mod settings for clients        com.example.somemod.cfg

Na názvu zipu Thunderstore nezáleží, ale když ho pojmenuješ podle balíčku a verze, zůstane tvoje vlastní složka přehledná, i když jich máš dvanáct.

Požadavky, které Thunderstore při uploadu vynucuje:

  • `manifest.json` - platný JSON s poli popsanými v další části.
  • `icon.png` - PNG přesně 256 na 256 pixelů. Ne 512, ne přejmenovaný JPEG. Obyčejný barevný čtverec s iniciálami serveru stačí; modpacky nikdo neprochází kvůli obrázkům.
  • `README.md` - vykreslí se jako stránka balíčku. Může být krátký, ale musí existovat.

CHANGELOG.md je volitelný. Pokud existuje, stránka balíčku ho zobrazí na záložce Changelog, což je to nejužitečnější, co můžeš dát hráčům, kteří chtějí vědět, proč jim manager nabízí aktualizaci.

manifest.json pole po poli#

Takhle vypadá celý soubor pro malý balíček pro partu:

manifest.json
{  "name": "LongshipCrew_Modpack",  "version_number": "1.0.0",  "website_url": "",  "description": "Mods for the Longship Crew server. Install this, then join.",  "dependencies": [    "denikson-BepInExPack_Valheim-5.4.2202",    "ValheimModding-Jotunn-2.20.1",    "ValheimModding-HookGenPatcher-0.0.4",    "RandyKnapp-EpicLoot-0.10.3",    "Advize-PlantEverything-1.18.2"  ]}

Čísla verzí výše jsou příklady formátu, ne doporučení - skutečná zkopíruj ze stránky každého balíčku, jak je popsáno níže.

PolePravidloPoznámky
namePouze písmena, číslice a podtržítkoŽádné mezery ani pomlčky. Stane se součástí URL a nelze ho později přejmenovat
version_numberMajor.Minor.PatchTři čísla. Každý upload potřebuje verzi, která ještě nebyla použita
website_urlURL nebo prázdný řetězecPole musí být přítomno; "" je přijato
descriptionNejvýše 250 znakůZobrazuje se ve výsledcích vyhledávání v každém manageru
dependenciesPole řetězců závislostíSamotný seznam módů

Omezení u name lidi zaskočí, protože pomlčky jsou zakázané z dobrého důvodu: pomlčka je oddělovač v řetězcích závislostí. Longship-Crew by bylo nejednoznačné, Longship_Crew ne.

Thunderstore na svém webu v sekci Tools nabízí také validátor manifestu. Vlož do něj soubor ještě před zipováním a chybějící čárku najdeš dřív než upload formulář.

Řetězce závislostí

Každá položka má tvar Namespace-PackageName-Version, kde namespace je nahrávající tým, ne nutně zobrazované jméno autora. Žádnou část nemusíš hádat: stránka každého balíčku na Thunderstore ukazuje řetězec závislosti pro verzi, kterou si prohlížíš, připravený ke zkopírování. Chceš-li starší verzi, otevři na stránce seznam verzí.

Tři věci, které je třeba udělat správně:

  1. Přidej loader a knihovny. BepInExPack_Valheim od denikson je build BepInEx pro Valheim a měl by být v každém balíčku. Knihovny jako Jotunn a HookGenPatcher se stáhnou jako závislosti módů, které je potřebují, ale když je uvedeš výslovně, připneš i jejich verzi, a právě to brání tomu, aby aktualizace knihovny tiše rozbila celou sestavu.
  2. Jedna položka na balíček. Dvě verze stejného módu v seznamu jsou chyba čekající na své uplatnění a některé managery nainstalují tu, na kterou narazí naposledy.
  3. Vynech, co server zakazuje. Pokud server nepoužívá klientský mód měnící pravidla - úpravu nosnosti nebo velikosti stacků - nedávej ho do balíčku. Hráč, který ho má a připojí se k serveru bez něj, je rozdílný oproti všem ostatním.

Publikace na thunderstore.io#

Potřebuješ účet a tým. Přihlas se na thunderstore.io (nabízí přihlášení přes Discord, GitHub a Overwolf), otevři nastavení a vytvoř tým. Název týmu je namespace, který předchází tvůj balíček v každém řetězci závislosti, a stejně jako název balíčku je prakticky trvalý, takže zvol něco, za co se za rok nebudeš stydět - obvyklé je jméno serveru.

Potom:

  1. V menu webu otevři stránku pro upload a vyber zip.
  2. Vyber komunitu Valheim. Nahrát do špatné je snazší, než to zní, protože formulář si pamatuje poslední volbu.
  3. Vyber kategorii Modpacks a případně další, které obsah poctivě popisují.
  4. Zaškrtni NSFW jen tehdy, když se to týká obsahu, a odešli.

Pokud formulář upload odmítne, zpráva pojmenuje problém: rozměry ikony, pole manifestu, verze, která už existuje. Oprav to a nahraj znovu. Po přijetí se balíček objeví ve výpisu Valheimu i ve vyhledávání každého manageru, obvykle do několika minut.

Každou publikovanou verzi ber jako trvalou. Nahranou verzi nelze potichu upravit a s mazáním nepočítej; oprava rozbitého vydání je nová verze s vyšším číslem. To je stejně tak výhoda jako omezení: hráč, který v březnu importoval 1.2.0, může stále najít přesně to, co obsahovala.

Pro ty, kdo publikují často, Thunderstore udržuje nástroj pro příkazovou řádku tcli, který sestaví zip ze složky projektu a nahraje ho s tokenem vytvořeným v nastavení týmu. Pro balíček aktualizovaný jednou měsíčně je to zbytečné a formát jeho konfigurace se mezi vydáními změnil, takže pokud tudy půjdeš, čti jeho vlastní README, ne zkopírovaný příklad.

Konfigurační soubory v balíčku#

Modpack může nést nejen módy, ale i nastavení. Soubory v kořenové složce config zipu zkopíruje r2modman a managery na něm postavené do BepInEx/config profilu při instalaci balíčku. Tak získáš na všech klientech od prvního spuštění stejné módy rozhraní, výchozí hodnoty bez vlastních kláves a klientské hodnoty.

Co tam patří a co ne:

  • Klientská nastavení, která chceš sdílet. Výchozí značky na mapě, dohodnuté rozložení klávesových zkratek, mód pro pohodlí nastavený tak, jak se skupina rozhodla.
  • Ne nastavení synchronizovaná ze serveru. Pokud mód posílá konfiguraci ze serveru - to dělá většina módů postavených na ServerSync nebo na admin-only synchronizaci v Jotunn - klientská kopie se při připojení přepíše. Přibalit ji není na škodu, ale je to zbytečné a mate každého, kdo ji upraví v domnění, že se něco změní. Jak fungují ServerSync a vynucení konfigurace vysvětluje, která strana vyhrává.
  • Ne BepInEx.cfg, pokud k tomu nemáš konkrétní důvod. Vlastní nastavení loaderu je nejlepší nechat na klientech ve výchozích hodnotách balíčku.

Vyzkoušej, co tvůj manager dělá při aktualizaci. Některé verze při každé aktualizaci nahradí konfigurační soubory těmi z balíčku, což smaže osobní změny hráče; jiné existující soubory nechají být. Nainstaluj balíček do čistého profilu, změň nastavení, aktualizuj balíček a podívej se. Pokud hráči o svá osobní nastavení přicházejí, omez přibalenou konfiguraci na těch pár souborů, které se opravdu musí shodovat.

Stejná sestava na dedikovaném serveru#

Žádný manager nenainstaluje modpack na server. Server potřebuje stejné pluginy v BepInEx/plugins a dostaneš je tam ručně. Spolehlivá metoda používá profil jako zdroj:

  1. Importuj vlastní modpack do čistého profilu na svém PC. Tím ověříš, že se publikovaný balíček správně vyřeší, a získáš přesné soubory.
  2. V nastavení manageru použij možnost procházet složku profilu. V r2modman je na Windows pod %AppData%\r2modmanPlus-local\Valheim\profiles\<profile name>.
  3. Zkopíruj BepInEx/plugins z profilu do BepInEx/plugins na serveru a vynech módy, které jsou jen klientské.
  4. Zkopíruj i obsah BepInEx/patchers. HookGenPatcher leží tam, ne v plugins.
  5. Spusť server jednou, zastav ho a pak uprav vygenerované konfigurace v BepInEx/config na serveru.
  6. Spusť znovu a porovnej řádky s pluginy v logu se svým manifestem.
bash
$ grep -o 'Loading \[[^]]*\]' BepInEx/LogOutput.log | sortLoading [EpicLoot 0.10.3]Loading [Jotunn 2.20.1]Loading [PlantEverything 1.18.2]

Samotný BepInExPack jde na server také, ale z vlastního stažení, rozbalený do kořene serveru, jak popisuje Valheim módy s BepInEx na serveru, a ne po kouscích vykopírovaný z klientského profilu. Na Valheim serveru RE:NODE se nahrává přes správce souborů nebo SFTP - přetáhni složku plugins dovnitř nebo nahraj zip a rozbal ho na místě - a konzole při startu serveru živě ukazuje banner BepInEx i jednotlivé řádky Loading.

Čistě klientské módy se vyplatí na serveru nenechávat, i když by se načetly. Většina je na bezhlavém procesu neškodná, několik se při startu dotkne rozhraní a vyhodí výjimky a každý další plugin je jeden řádek navíc, který musíš číst, když se opravdu něco rozbije. Pokud nevíš, na které straně mód patří, řekne ti to stránka autora a průvodce logem BepInEx ukazuje, jak vypadá klientský mód, který na serveru selhává.

Aktualizace balíčku při změnách módů#

Balíček je užitečný, jen když odpovídá serveru, a přestane odpovídat ve chvíli, kdy se aktualizuje jedna strana a druhá ne. Postup, který vydrží:

  1. Rozhodni se aktualizovat, místo abys následoval autory. Nové vydání Epic Loot není důvod měnit balíček v úterý večer. Změny seskup a dělej je před hrou, ne uprostřed ní.
  2. Zálohuj složku `BepInEx` serveru a svět. Zamčená záloha posledního funkčního stavu je to, co obnovíš, když se nová sestava chová špatně. Zálohy, které se opravdu obnoví je argument pro to, abys obnovu zkoušel.
  3. Nejdřív aktualizuj testovací profil. Změň verze v kopii profilu, spusť hru, u větší změny načti lokálně kopii světa a ověř, že se vše spustí čistě.
  4. Zvyš číslo verze. Patch pro změnu verze jednoho módu, minor pro přidání nebo odebrání módu, major pro změnu, která vyžaduje nový svět nebo rozbije uložené hry.
  5. Napiš řádek do changelogu. Jeden řádek na změnu, s důvodem.
  6. Nahraj, pak aktualizuj server, pak řekni skupině. V tomto pořadí a do jedné hodiny. Okno mezi změnou serveru a aktualizací hráčů je doba, kdy lidé dostávají kick kvůli neshodě.
CHANGELOG.md
## 1.3.0- Added PlantEverything (agreed in Discord, 12 Oct)- Jotunn 2.20.1, required by the new Epic Loot## 1.2.1- Epic Loot 0.10.3 - fixes the enchanting table crash

Po patchi Valheimu je pořadí jiné: aktualizace hry módy rozbije, dokud je autoři nedoženou, takže balíček čeká na ně a server čeká na balíček. Co dělat, když aktualizace módu něco rozbije obsahuje obecný postup a kick kvůli neshodě verzí módů popisuje zprávy, které hráči vidí, když se strany rozejdou.

Řešení potíží s uploadem a instalací#

„Manifest is invalid“ nebo chyba pole při uploadu. Obvykle pomlčka nebo mezera v name, dvoučásťová verze jako 1.0, chybějící website_url nebo čárka za poslední závislostí. Pošli soubor přes validátor.

„Icon must be 256x256“. Přesně tato velikost, formát PNG. Exportuj znovu, nepřejmenovávej jiný formát.

Upload hlásí, že balíček nemá manifest. Soubory jsou v zipu uvnitř složky. Otevři archiv; manifest.json bys měl vidět hned, ne adresář.

„Version already exists“. Nahrál jsi znovu bez zvýšení version_number. Zvyš ho, i kdyby šlo o opravu jednoho znaku v README.

Hráči balíček naimportují a nějaký mód chybí. Řetězec závislosti má překlep v namespace nebo verzi, která nikdy nebyla publikována. Každý řetězec by měl být zkopírovaný ze stránky balíčku, ne ručně napsaný.

Balíček se nainstaluje, ale hráči pořád dostávají kick při připojení. Server neodpovídá balíčku. Porovnej řádky Loading na serveru s manifestem; rozdíl je odpověď. Obvyklý viník je knihovna, kterou jsi na serveru aktualizoval ručně.

Nastavení hráčů se po každé aktualizaci balíčku resetuje. Balíček nese konfigurační soubory, které manager přepisuje. Omez složku config na soubory, které se musí shodovat.

FAQ#

Můžu udělat modpack na Thunderstore soukromý?

Ne. Thunderstore nemá soukromé ani neveřejné balíčky; cokoli nahraješ, vidí všichni. Pro soukromou skupinu exportuj profil r2modman jako soubor .r2z a sdílej ho přímo. Nese stejný seznam módů i konfigurace.

Potřebuju svolení, abych cizí mód dal do modpacku?

Na závislost ne. Modpack uvádí módy řetězcem závislosti a každý hráč si je stáhne z autorova vlastního balíčku, což je přesně způsob, jak to Thunderstore zamýšlí. Kopírovat autorovy soubory do vlastního zipu je něco jiného a není to dovoleno.

Dostanou hráči moje aktualizace automaticky?

Manager ukáže, že existuje novější verze balíčku, a nabídne aktualizaci. Většina ji neprovede bez kliknutí hráče, a proto krátké oznámení v chatu skupiny v den aktualizace ušetří kolo kicků.

Nainstaluje modpack BepInEx na server?

Ne. Modpacky instalují mod managery do klientských profilů. Server potřebuje BepInExPack rozbalený do kořene a stejné pluginy zkopírované do BepInEx/plugins, což se dělá ručně přes SFTP nebo správce souborů.

Můžu na server s mým balíčkem pustit hráče z Xboxu?

Jen pokud je každý mód v balíčku pro klienty nepovinný. Konzoloví hráči nemohou instalovat módy, takže balíček s módy pro klienta i server udělá ze serveru PC-only bez ohledu na nastavení crossplay.

Co když je mód v mém balíčku zastaralý nebo odstraněný?

Starší verze obvykle zůstávají ke stažení, takže stávající instalace fungují dál, ale nestav na něm. Najdi náhradu, vyzkoušej ji na kopii světa a publikuj novou verzi balíčku, která ji vymění.