Six permission nodes, and every one defaults to the op level the command always needed. With no
permissions mod installed nothing changes: op your staff and the whole tree follows. With one, you can
hand a single branch to somebody who is not an op - a storyteller who can call a horde without also
being handed /stop.
The nodes
Six rather than one per command, because the useful split is by what you hand over, not by what a
command is called. Spawning things and running hordes are what a game master does; the corpse ledger
and observer mode are staff tools; config changes what the server does for
everyone.
| Node | Default | Grants |
|---|---|---|
| zombiemod.spawn | op level 2 | /zombiemod spawn |
| zombiemod.horde | op level 2 | /zombiemod horde list, start and stop |
| zombiemod.corpse | op level 2 | The whole corpse ledger - list, give, respawn, forget |
| zombiemod.observe | op level 2 | Turning observer mode on, for yourself or anyone, and off for someone else |
| zombiemod.status | op level 2 | /zombiemod status |
| zombiemod.config | op level 3 | /zombiemod config |
All six are booleans - nothing here takes a number. zombiemod.* is your
permissions mod's wildcard rather than a node of ZombieMod's; LuckPerms and SableCraft Standards both
expand it.
How the defaults behave
A node's default answer is "does this player hold op level 2" (3 for config),
which is exactly what NeoForge's own handler returns when no permissions mod is installed. So:
The case this was built for
A storyteller running sessions with
LegendQuest StoryTeller
should be able to call hordes and spawn genera into the story - and should not be an op, because op
brings /stop, /ban and every block on the server with it.
With SableCraft Standards' handler selected:
/rank group storyteller create
/rank group storyteller set zombiemod.spawn true
/rank group storyteller set zombiemod.horde true
/rank group storyteller set zombiemod.observe true
/rank user <player> group add storyteller
/rank check <player> zombiemod.horde tells you which rule answered. LuckPerms is the
same shape with its own commands. For all of it in one line, set zombiemod.* true -
but that includes config and the corpse ledger, so decide whether you mean it.
A storyteller with these runs the encounter from inside it.
/zombiemod horde start directs a horde at whoever typed it, and
spawn with no position spawns where they are looking - which is the point.
Every command, and what it needs
/zm is an alias for /zombiemod and carries exactly the same
gates - a redirect onto the same command tree, not a second registration, so the two cannot drift apart.
| Command | What it does |
|---|---|
| /zombiemod list | Every genus loaded. |
| /zombiemod bestiary | Your ZombieDex, in chat. |
| /zombiemod bestiary book | The same dex as a written book - works on a vanilla client. |
| /zombiemod bestiary info <genus> | One genus's entry. |
| /zombiemod observe off | Turns your own observer mode off. Always available. |
zombiemod.spawn - op level 2| Command | What it does |
|---|---|
| /zombiemod spawn <genus> [pos] | Spawns one where you are looking, or at a position. |
zombiemod.horde - op level 2| Command | What it does |
|---|---|
| /zombiemod horde list | The defined hordes. |
| /zombiemod horde start <horde> | Calls a horde in. |
| /zombiemod horde stop | Stops the running horde. |
zombiemod.corpse - op level 2| Command | What it does |
|---|---|
| /zombiemod corpse list [player] | The corpse ledger. |
| /zombiemod corpse give <player> [index] | Hands a corpse's contents back. |
| /zombiemod corpse respawn <player> [index] [here] | Rebuilds the corpse, optionally where you are looking. |
| /zombiemod corpse forget <player> | Drops a corpse from the ledger. |
zombiemod.observe - op level 2| Command | What it does |
|---|---|
| /zombiemod observe | Toggles your own observer mode - the node is only checked when turning it on. |
| /zombiemod observe on [player] | Observer mode on, for you or someone else. |
| /zombiemod observe off <player> | Turns someone else's off. |
zombiemod.status and zombiemod.config| Command | What it does |
|---|---|
| /zombiemod status | What the mod believes its settings are. Op level 2 by default. |
| /zombiemod config | Lists the runtime toggles. Op level 3 by default. |
| /zombiemod config <toggle> [on|off] | Sets one; with no on/off, flips it. Op level 3 by default. |
Two deliberate holes
/zombiemod observe off is open to everybody,
permanently. Turning your own invulnerability off is not a power, and gating it caused a real
incident: observer mode was switched on for a player who was later deopped, and the only command that
could switch it off needed the permission they had just lost. They were invulnerable, could not fix it,
and could not ask an op to fix it either, because the command only ever acted on whoever typed it.
| Command | Needs |
|---|---|
| observe (toggle your own) | zombiemod.observe - but only when turning on. The off direction is checked in code, because one node cannot bar a single direction. |
| observe on · observe on <player> | zombiemod.observe |
| observe off | Nothing - anyone, always. |
| observe off <player> | zombiemod.observe |
Neither /zombiemod nor /zm carries a bar at its root. A child command's requirement is combined with its parent's, so a
restrictive root could not be relaxed by a permissive child - a gated root would put the bestiary
permanently out of a normal player's reach. Every subcommand carries its own gate instead.
Console and command blocks
A node is a question about a player. The console, a command block and an /execute with no player behind it have no identity a permissions mod could grant to, so they pass on op level
exactly as before: level 2 for everything, level 3 for config. A command block
runs at level 2 and always could.
Permission is not the whole story, though. Several commands act on whoever typed them, so they need a player and fail from the console with "a player is required to run this command", however high the permission.
| Runs from the console | Needs a player |
|---|---|
| /zombiemod list | /zombiemod bestiary, bestiary book, bestiary info - it is your dex |
| /zombiemod status | /zombiemod spawn <genus> with no position - it spawns where you are looking |
| /zombiemod config ... | /zombiemod horde start, horde stop - a horde is directed at a player |
| /zombiemod corpse list · corpse forget | /zombiemod observe, observe on, observe off with no player named |
| /zombiemod spawn <genus> <pos> | /zombiemod corpse respawn ... here - "here" is where you are looking |
| /zombiemod observe on|off <player> | /zombiemod corpse give, only when the owner is offline, since the items then drop at the admin's feet |
/zombiemod spawn is the one worth knowing:
give it an explicit position and it works from a command block or the console, and both
~ ~ ~ and ^ ^ ^5 work.
Client commands
These run entirely on the player's own machine, so they change nothing on the server and are only there for players who installed the mod client-side.
| Command | What it does |
|---|---|
| /zmdex render [size] | One PNG per genus under screenshots/zombiemod/ - 64 to 1024px, default 256. |
| /zmdex cancel | Stops a render in progress. |
There is also a keybind, Z by default, that opens the ZombieDex screen - rebindable under Controls.
What is not permission-gated
/zombiemod reload - genera are datapack data, so vanilla's own /reload picks up changes, and its permission is vanilla's business.