You wrote both lines into the ini, restarted, the console says
*** SERVER STARTED **** — and the game is vanilla. Or it works for you
and a friend gets thrown out on join. Same problem, five different
causes, and the annoying part is that Zomboid tells you almost nothing
about which one you hit.
We broke a Build 42 server on purpose, four ways, and did it again a month later to be sure, to see what each mistake looks like in the log. This is what we found, in the order you should check:
- Commas instead of semicolons
- The mod id is not what you think
- A Build 41 mod on a Build 42 server
- A workshop id that does not exist
- It works for you, not for a friend
Not sure where the mods even go? Start here.
Where the mods are set, and the two ids
Your server's settings are one file:
%USERPROFILE%\Zomboid\Server\<servername>.iniTwo lines in it are the whole modpack:
WorkshopItems=3750253491;2875848298
Mods=\VB_CommonSense;\AnotherModWorkshopItems= is what Steam downloads when the server starts.
Mods= is what the game actually activates, and the order of that
line is the load order.
Those are two different kinds of id, and mixing them up is the first
thing to rule out. The workshop item id is the number in the item's
URL (?id=3750253491). The mod id is a name the author chose, and
the truth about it lives inside the downloaded item:
<server>\steamapps\workshop\content\108600\<item-id>\mods\<Name>\common\mod.infoThe id= line in that file is the mod id. Most authors also paste a
Mod ID: line into the workshop description. That is a hint, not the
truth — authors update the mod and forget the description.
One item can hold several mods, each with its own id. On Build 42 you
will see mod references written with a backslash in front
(Mods=\VB_CommonSense) — that is the game's own spelling, and it loads
with or without it. We tried both, on the same server, in the same line.
Cause 1: commas instead of semicolons
Every guide says "semicolons, not commas", nobody says what a comma actually does. We measured it:
- A comma in
Mods=turns the whole line into one mod id. The log shows exactly one line,required mod "VB_CommonSense,tsarslib" not found, and the server boots happily with no mods at all. - A comma in
WorkshopItems=leaves no trace whatsoever. Not oneWorkshop:line in the entire log. Nothing is downloaded and nothing says so.
Fix: semicolons, no spaces around them, no trailing junk.
Cause 2: the mod id is not what you think
A mistyped mod id produces the same one line as the comma:
required mod "<what you wrote>" not found. Open the item's mod.info
(path above) and copy the id= value. Check the case, too. Don't trust
the workshop description if the two disagree.
Cause 3: a Build 41 mod on a Build 42 server
This is the one that wastes evenings, because it looks like it worked.
The item downloads fine — the log even says installed to <path> — and
then the server says required mod "<id>" not found, the exact same
line as a typo, and boots without it.
In the log the two cases are identical. On disk they are not:
- A Build 42 mod has
mods\<Name>\common\and/or a version folder such as42\or42.0\— we have seen all three shapes. - A Build 41-only mod has
mods\<Name>\media\directly, nothing else.
The Build 41 / Build 42 tags on the workshop page are what the
author claimed, in both directions. We have seen an item tagged for
both, its Build 42 successor tagged for 42 only, and a library tagged
for 41 only — and the tags were right in those three cases, but they
are a claim, not a test.
Fix: find the mod's Build 42 version (often a separate workshop item),
or drop it. The legacy41 beta branch runs Build 41 if the whole group
would rather go back — with the warning that Build 41 and Build 42
saves are not compatible with each other.
Cause 4: a workshop id that does not exist
The loud one, and the one that hides all the others. A wrong item id — a typo, a deleted item, a private one — gives you:
Workshop: onItemNotDownloaded itemID=999999999999 result=9
… DownloadPending -> Fail
and the server kills its own boot, exit code 1, before it ever gets
to loading mods. result=9 is Steam's "file not found". So if the
server dies before SERVER STARTED, check the workshop stage first;
mod errors never get a chance to show up behind it.
Cause 5: it works for you, not for a friend
The server does the downloading; joining players are asked by the game to fetch the server's items before they get in. Two things go wrong with that regularly:
- The friend's list is not the server's list. They subscribed to the mods themselves weeks ago and still have an older copy, or they said no to the download prompt. Unsubscribe, let the prompt download, join again.
- Load order.
Mods=is the order things load in. A library has to come before the mods that need it. If the server boots with a mod "not found" that is definitely there, look at what it requires and move that in front.
How to read the log without going mad
The console output is also written to
%USERPROFILE%\Zomboid\server-console.txt, so you can read it after
the fact. Do not look for ERROR. A perfectly healthy modded boot
spews ERROR lines — missing optional folders like media/AnimSets,
world-gen noise. The lines that mean something:
| Stage | The line that says it worked |
|---|---|
| Download | … -> Ready ID=<item-id> per item |
| Activation | > loading <mod-id> per mod |
| Up | *** SERVER STARTED **** |
A mod without its own loading <id> line did not load, even if nothing
complained. Absence is the failure.
The checklist
- Semicolons in both lines.
- Mod ids from
mod.info, not from memory. - Every mod has a
common\or42.x\folder (Build 42) — or you are onlegacy41. - No
result=9in the log. - Libraries before the mods that need them.
- Friends: unsubscribe locally, take the server's download prompt.
Or let the app do it
Everything above is the part Game Hangout takes off your hands. The mod list sits on the server card in the app and is shared with everyone in the session — nobody copies ids, nobody opens an ini, and a comma cannot get in. Before the server goes live, the app starts a throwaway copy of it with your list and puts the result on the card in plain words: which mods loaded, which item does not exist, which one is a Build 41 mod on a Build 42 server. You press one button and read one sentence instead of a log.
Then somebody hosts, friends join from the app with the same list, no port forwarding, and the world follows whoever starts next. Windows only, and the host downloads the 6.7 GB of server files once.