-
Notifications
You must be signed in to change notification settings - Fork 0
Modding Workflow
← Home
Der prozedurale Ablauf rund um die Mod-Liste: eine Mod sauber hinzufügen,
verstehen, wie Load-Order und Generator zusammenarbeiten, typische Fehler
vermeiden und eigene Mods im servermods/-Format anlegen. Die reine
Feld-Referenz von mods.yaml und alle Mods des Repos stehen auf
Mods-Referenz.
Vertieft in Repo: docs/04-modding-workflow.md
Die komplette Schrittfolge von der Workshop-Seite bis zur Verifikation (Grundgerüst Repo-Default aus docs/04, um Render-/Restart- und Log-Schritte erweitert):
-
Workshop-Seite öffnen und die
workshop_idaus der URL kopieren (...filedetails/?id=<Zahl>). -
mod_idheraussuchen — aus der Workshop-Beschreibung oder dermod.infoder Mod. Beide IDs notieren; sie sind grundverschieden (Zahl = Download, Text = Laden). -
mods.yamlpflegen: neuen Eintrag anlegen, Kategorie wählen (siehe unten),enabled: true, bei Karten zusätzlichmap_name:mit dem internen Map-Ordnernamen, bei Abhängigkeitenrequires:. B42-Mods only — B41-Mods sind inkompatibel (Repo-Regel aus mods.yaml-Kopf). -
Generieren und validieren:
make mods # mods-validate.sh && mods-generate.sh (Repo-Default)Bei Validierungsfehlern bricht das Target vor der Generierung ab (Exit 1, Repo-Default aus dem Makefile).
-
Manuell in die Ini übernehmen und dann rendern/restarten: die
WorkshopItems=/Mods=/Map=-Zeilen ausconfig/generated/workshop-items.txtper Hand in${PZ_DATA_DIR}/Server/servertest.inikopieren (mit dem Repo-DefaultSERVER_NAME=servertest; siehe Architektur „Datenfluss (a)") — erst danach rendern und restarten, weilmake renderallein die drei Zeilen nicht in die Ini schreibt (Repo-Stand, render-config.sh):make render && make restartDirekt auf dem Server bearbeitet man so; alternativ der Repo-Weg aus docs/04: Commit + Push (CI prüft mit shellcheck + mods-validate mit) und auf dem Server
make update. -
Im Log verifizieren (
make logs): Die ZeileWorkshop: Download item <workshop_id>zeigt, dass die Mod gezogen wird; danach darf keinERROR, keineExceptionund kein Lua-Fehler auftauchen (Log-Kriterien Repo-Default aus docs/10). Fehlt die Mod später im Spiel, zuerst dieMods=-Zeile prüfen — siehe Mods-Referenz.
Die Ladereihenfolge wird nicht von Hand gepflegt — sie ergibt sich aus der Kategorie jedes Eintrags (Repo-Default, fest im Generator verdrahtet):
library -> framework -> map -> gameplay -> qol
Innerhalb einer Kategorie zählt die Eintragsreihenfolge in mods.yaml
(Repo-Default).
Warum Frameworks zuerst: Die Eintragsreihenfolge in der Mods=-Zeile ist
die Ladereihenfolge; Libraries und Frameworks müssen geladen sein, bevor
Content- und QoL-Mods sie nutzen, und bei Konflikten gewinnt die spätere Mod
(Community-Quelle: PZ-Community-Doku, dokumentiert in docs/10). Die
Kategorie-Sortierung des Generators setzt genau das automatisch um —
WorkshopItems=-Reihenfolge ist dagegen egal, sie steuert nur den Download
(Repo-Default).
requires: deklariert Abhängigkeiten als Liste von mod_ids. Der
Validator prüft beim make mods-Lauf, dass jede Abhängigkeit einer aktiven
Mod existiert — sonst ERROR und Abbruch (Repo-Default aus
mods-validate.sh). Das ersetzt kein Nachdenken: Eine Mod, die eine
deaktivierte Framework benötigt, läuft nicht, nur weil der Eintrag noch in
der YAML steht.
scripts/mods-generate.sh (Repo-Default, 1:1 aus dem Skript):
-
Filter: nur Einträge mit
enabled: truewerden berücksichtigt (mods = [m for m in data.get("mods", []) if m.get("enabled")]). -
Sortierung: aktive Mods werden nach der festen Kategorie-Reihenfolge
library, framework, map, gameplay, qolsortiert (mods.sort(key=lambda m: ORDER.index(...))). -
B42-Backslash-Pflicht: Build 42 verlangt einen Backslash vor jeder
Mod-ID in der
Mods=-Zeile. Der Generator baut die Zeile als"\\" + mod_idpro Eintrag — heraus kommtMods=\damnlib;\NeatUI_Framework;.... -
Map=-Zeile inkl. Muldraugh-zuletzt-Regel: alle aktiven Karten-Mods mitmap_namewerden semikolongetrennt gesammelt, und"Muldraugh, KY"(Vanilla-Basismap) wird automatisch immer ans Ende gehängt (map_line = ";".join(maps + ["Muldraugh, KY"])) — frühere Maps gewinnen bei Überlappung, deshalb muss Vanilla zuletzt (Community-Quelle: Repo-Changelog 0.3.0; Regeln detailliert auf Mods-Referenz). -
Ausgabe: alles landet in
config/generated/workshop-items.txt(drei Zeilen:WorkshopItems=,Mods=,Map=). Die Übernahme in die Server-ini ist manuell (siehe Schritt 5 oben und Architektur „Datenfluss (a)") —make renderrendert nur die envsubst-Templates und schreibt diese drei Zeilen nicht in dieservertest.ini(Repo-Stand,scripts/render-config.sh+servertest.ini.tmpl).
Die ersten fünf Zeilen sind Repo-Default aus docs/04, die letzten drei Zeilen sind Ergänzungen mit jeweiligem Quellen-Label:
| Symptom | Ursache | Fix |
|---|---|---|
| Mod lädt nicht | workshop_id != mod_id verwechselt | beide Felder prüfen |
| Server startet nicht | fehlende Abhängigkeit | make validate |
| Version mismatch | Client/Server-Build oder Mod-Version differieren | Steam-Dateien prüfen, Mod-Update |
| Doppelte Items | zwei Overhaul-Mods gleichzeitig (z. B. Brita's + Firearms) | nur einen aktivieren |
| Mod „not found" im Log | workshop_id fehlt in WorkshopItems=
|
make mods neu generieren |
| Mod still inaktiv trotz Download | Eintrag fehlt in Mods= — Download ohne Mods=-Eintrag lädt nie (Community-Quelle: PZ-Community-Doku; häufigster Fehler laut docs/10) |
generierte Mods=-Zeile prüfen |
| Karte lädt, Spawns fehlen |
map_name/folder nur geraten statt verifiziert (Heuristik — vor Aktivierung Ordner-Verifikation, siehe Fix) |
Ordner per ls verifizieren (Anleitung: Spawn-System) |
| Validierung warnt bei Platzhalter-ID | workshop_id im TODO-Bereich 3600000000–3600000099 — erzeugt nur eine WARNung, keinen Abbruch (Repo-Default aus mods-validate.sh) | echte ID von der Steam-Seite eintragen |
Eigene Mods leben im Repo unter servermods/ im Workshop-Format. Alles in
diesem Abschnitt: Repo-Default, 1:1 aus servermods/README.md.
servermods/mein-mod/
├── mod.info # name, id, description, author
├── poster.png # 256x256 Vorschaubild
└── Contents/mods/mein-mod/
├── 42/ # Build-42-spezifisch
│ └── media/
│ ├── scripts/ # Items/Rezepte (.txt)
│ └── lua/
│ ├── shared/ # Client+Server
│ ├── client/ # UI, Kontextmenues
│ └── server/ # autoritative Logik
└── common/ # build-uebergreifend (optional)
-
mod_idinmod.infomuss eindeutig sein → inmods.yamleintragen. - Client-Code darf niemals Server-Dateien per
requireladen (und umgekehrt). - Bestehende Funktionen hooken statt überschreiben (Konfliktvermeidung).
- Lokaler Test: Ordner nach
~/Zomboid/mods/kopieren, im Spiel aktivieren.
name=Mein Mod
id=MeinMod
description=Erster eigener Mod
author=Dulocal function onGameStart() print("MeinMod geladen") end
Events.OnGameStart.Add(onGameStart)Für Feldbedeutungen, die komplette Mod-Liste des Repos und die generierten ini-Zeilen siehe Mods-Referenz.
Weiter: Mods-Referenz · Spawn-System · Performance-Guide
Labels: Community-Quelle = extern belegt (Herkunft in Klammern, z. B. pzwiki, Steam-Diskussionen, GCP-Preisliste) · Repo-Default = steht genau so im Repo (Template, Skript oder .env.example) · Heuristik = begründete Empfehlung dieses Projekts, nicht extern verifiziert.
The Indie Stone (TIS) publiziert keine offiziellen Storage-/IOPS-/Performance-Specs — Zahlen in diesem Wiki nie als TIS-Anforderung lesen.
Inhalte zielen auf den B42-Stable-Branch: seit B42.20 der Default-Zweig in Steam, kein -beta-Opt-in nötig (Community-Quelle).
Details zu Labels, Quellen und Redaktionsregeln: Konventionen-und-Quellen.
Einstieg
Referenz
- Makefile-Referenz
- Cheatsheet-Tagesbetrieb
- ENV-Variablen
- Server-Konfiguration
- Admin-Befehle
- Mods-Referenz
- Spawn-System
- Skripte-Referenz
- systemd-Referenz
- Ports-und-Netzwerk
- SteamCMD-Referenz
Betrieb
- Wartung-und-Automatik
- Backup-und-Restore
- Updates-und-Rollback
- Monitoring-und-Alerts
- Sicherheit-und-Hardening
- Docker-Betrieb
- GCP-Failover
Tiefenwissen
- Modding-Workflow
- Performance-Guide
- Storage-und-Map-Streaming
- Hardware-Empfehlungen
- Troubleshooting
- Runbook-Raven-Creek
Meta