ZombieRounds Documentation
ZombieRounds is a round-based Minecraft zombies plugin with configurable maps, enemy rotations, doors, zones, one-way barriers, power-ups, special rounds, breakable floors, a Mystery Box, a cross-server shared bank and an event-driven /zr execute DSL for map logic.
Reference version: 2.1.21.11.31
Configuration files
ZombieRounds uses a small set of YAML files, with most map behaviour living in a per-map configuration file.
| File | Purpose |
|---|---|
lobbies.yml | Lists selectable maps and points each map at a source config file. |
config.yml / config_*.yml | The actual map/game configuration loaded for a selected lobby. |
achievements.yml | Achievement/reward configuration. The bundled file currently contains kill and points milestones. |
lobbies.yml
The lobby selector reads lobbies.yml. Each entry requires a human-readable display_name and a source_config pointing to a map configuration file in the plugin data folder. Entries whose source config does not exist are skipped.
lobbies: - display_name: "Metro" source_config: "config.yml" - display_name: "Amsterdam" source_config: "config_amsterdam.yml" The selector generates an internal slug from the display name, with duplicate IDs receiving a numeric suffix.
Map config.yml
Each map config can define its lobby position, round rules, enemy selection, spawn zones, power-ups, special rounds, doors, breakable floors and Mystery Box. The examples below show the structures currently understood by the plugin source.
Lobby and game settings
| Key | Type/default | Description |
|---|---|---|
cod_zombies_gun_mode | Boolean, default false | Enables COD Zombies-specific weapon/ammo behaviour used by several power-ups and EconomyFrame integration. |
lobby.maxPlayers | Integer, default 5 | Maximum number of players allowed in the ZombieRounds lobby. |
lobby.teleportLocation | Location | Main game/lobby spawn used when players join and as world context for parts of the DSL. |
lobby.hubLocation | Location, optional | Location used when returning players to the hub after a game or when leaving spectator mode. |
lobby.powerupProbability | Number, default 5.0 | Configured power-up drop probability used by the power-up manager. |
lobby.enabledPowerups | List, optional | Restricts the random power-up pool. If absent/empty, all globally allowed power-ups are eligible. |
lobby.promptOnJoin | Boolean | Controls whether the player receives the ZombieRounds join prompt. |
lobby.enableDiscovery | Boolean | Controls lobby/server discovery behaviour. |
lobby.joinServerURL | String | Server/API URL used by the lobby join/discovery flow. |
cod_zombies_gun_mode: true lobby: maxPlayers: 4 teleportLocation: world: world x: 100.5 y: 64 z: -20.5 yaw: 90 pitch: 0 hubLocation: world: world x: 0.5 y: 80 z: 0.5 yaw: 0 pitch: 0 powerupProbability: 5.0 Characters and character voices
ZombieRounds has an optional per-map character system. At the beginning of a game it can assign each lobby player a unique configured character, temporarily apply that character's skin, and play character-specific dialogue in response to game events such as taking damage, killing a zombie, buying a door, starting a round or being downed.
Enabling characters for a map
Character support is deliberately opt-in. It is enabled for the active map only when both of the following are true:
plugins/ZombieRounds/characters.ymlexists.- The active map config contains a non-empty
lobby.characterslist.
If either part is missing, ZombieRounds simply runs without character assignment, temporary skins or character dialogue.
lobby:
maxPlayers: 4
characters:
- arnold
- attenborough
- bob
- queen
The list is map-specific, so different maps may use different casts. The actual character definitions
remain global in characters.yml. Character IDs are matched case-insensitively.
Unknown IDs in lobby.characters are skipped and logged.
Character assignment
At game start the characters supported by the active map are shuffled and assigned uniquely to online lobby players. A character is therefore not permanently tied to a particular player. If there are more players than configured characters, the extra players keep their normal skin and receive no character voice.
Character assignments, voice cooldowns and temporary skins are cleared when the game ends. A player's original skin is also restored when they leave.
characters.yml
Each entry beneath characters defines an ID, display name, optional skin and any number
of voice-event rules.
characters:
arnold:
displayName: "Arnold Schwarzenegger"
skin:
value: "<base64 texture property>"
signature: "<texture signature>"
# Alternatively:
# url: "https://textures.minecraft.net/texture/..."
voices:
onDamage:
chance: 0.25
cooldown: 4
volume: 1.0
pitch: 1.0
duration: 2.0
sounds:
- "minecraft:zombierounds.character.arnold.on_dmg"
onKill:
chance: 0.10
cooldown: 8
volume: 1.0
pitch: 1.0
duration: 2.5
sounds:
- "minecraft:zombierounds.character.arnold.on_kill"
onDoorPurchased:
chance: 0.5
cooldown: 5
sounds:
- "minecraft:zombierounds.character.arnold.on_door_purchase"
onNotEnoughMoneyForDoor:
chance: 1.0
cooldown: 3
sounds:
- "minecraft:zombierounds.character.arnold.on_no_money"
Skin configuration
| Property | Required | Description |
|---|---|---|
displayName | No | Human-readable character name. Defaults to the character ID. |
skin.value | No | Mojang/Paper base64 textures property. Preferred when a texture property is available. |
skin.signature | No | Signature associated with the texture property. |
skin.url | No | Alternative textures.minecraft.net skin URL. |
Skins are applied temporarily using the Paper/Bukkit player-profile API. A character may contain voices without a skin; failure to apply a skin does not disable character voice support.
Voice rule properties
| Property | Default | Description |
|---|---|---|
sounds | Required | One or more resource-pack sound event IDs. One entry is chosen randomly when the rule fires. |
chance | 1.0 | Probability from 0.0 to 1.0 that the line plays after the other rule checks pass. |
cooldown | 0 | Per-player, per-event cooldown in seconds. |
volume | 1.0 | Sound volume passed to Minecraft. |
pitch | 1.0 | Sound pitch passed to Minecraft. |
duration | Event-specific | Seconds for which the player's character voice channel is considered occupied. |
If no settings are required, an event may also be expressed directly as a list of sounds:
voices:
onKill:
- "minecraft:zombierounds.character.arnold.on_kill"
- "minecraft:zombierounds.character.arnold.on_kill_2"
Currently wired character events
| Event | When it is triggered | Default voice duration |
|---|---|---|
onDamage | The character takes qualifying damage. | 2.0 seconds |
onKill | The player kills an active ZombieRounds mob, including supported WeaponMechanics and Gravity Gun kill paths. | 2.5 seconds |
onNotEnoughMoneyForDoor | A door purchase is attempted without enough money. | 3.5 seconds |
onDoorPurchased | The player successfully purchases/unlocks a door through the supported door paths. | 3.5 seconds |
onRoundStart | A new round starts. | 4.0 seconds |
onRoundEnd | A round ends. | 4.0 seconds |
onDowned | The player dies/is downed in the current round implementation. | 4.5 seconds |
onRevived | The player returns through the current respawn/revive path. | 4.5 seconds |
Reserved voice events
The character file format also recognises the following event names. They are reserved in the character event enum for additional hooks, but are not all currently wired into gameplay:
onHeadshotKill
onMeleeKill
onWeaponPurchased
onNotEnoughMoneyForWeapon
onMysteryBoxUsed
onMysteryBoxWeaponReceived
onPowerOn
onPowerupPickup
onPlayerRevived
onOutOfAmmo
onLowAmmo
Voice playback and overlap prevention
Character dialogue uses Minecraft's VOICE sound category and is played directly against
the player rather than at a world location. This keeps the dialogue attached to that player instead
of fading as they move away from the position where the line started.
Only one character line may occupy a player's voice channel at once. Lower or equal priority events
are ignored until the current line's configured duration expires. A higher-priority event
can stop and replace the current line. This prevents combinations such as a damage quote and a death
quote playing over one another.
| Priority group | Events |
|---|---|
| Highest | onDowned |
| Very high | onRevived, onPlayerRevived |
| High | onRoundStart, onRoundEnd |
| Medium-high | onDoorPurchased, onPowerOn |
| Medium | purchase, Mystery Box and power-up related events |
| Low | onOutOfAmmo, onLowAmmo, kill events |
| Lowest | onDamage |
Resource-pack sound entries
The strings in sounds refer to sound event IDs defined by the server resource pack's
sounds.json. Multiple sounds can be configured for one event and ZombieRounds chooses
one randomly when that voice rule fires.
{
"zombierounds.character.arnold.on_kill": {
"sounds": [
"zombierounds/characters/arnold/on_kill"
]
},
"zombierounds.character.arnold.on_dmg": {
"sounds": [
"zombierounds/characters/arnold/on_dmg"
]
}
}
Example map-specific cast
# config_kino.yml
lobby:
characters:
- arnold
- queen
- attenborough
- bob
# config_metro.yml
lobby:
characters:
- bob
- arnold
Both maps use the same global characters.yml, but each map chooses which characters
are eligible for assignment.
Rounds and mob scaling
| Key | Default | Description |
|---|---|---|
round.introTitle | None | Subtitle/title text displayed when round 1 begins. |
round.mobStats.baseHealth | 20.0 | Base mob health used by round stat scaling. |
round.mobStats.baseSpeed | 0.25 | Base movement speed. |
round.mobStats.baseAttack | 3.0 | Base attack damage. |
round.aliveMobCap.base | 24 | Base number of active mobs permitted. |
round.aliveMobCap.perPlayer | 0 | Additional active-mob allowance per player. |
round.aliveMobCap.max | 24 | Absolute cap after per-player additions. |
round.mobProportions | Built-in fallback rotation | Weighted list of Bukkit entity types. Entries may be gated by unlocked zones. |
round.startItems.steak | Not supplied unless configured | Number of steaks given when a player starts/respawns into the game. |
round.startItems.throwing_knife | Not supplied unless configured | Number of throwing knives given at game start. |
round.startItems.combat_knife | Presence-based | If present, enables the configured combat-knife starting equipment path. |
round.startItems.diamond_sword | Presence-based | If present, supplies the corresponding starting sword path. |
round.progressItems.steak | Optional | Steak granted by progression logic between rounds. |
round.progressItems.throwing_knife | Optional | Throwing knives granted by progression logic between rounds. |
Weighted enemy rotation
probability acts as a weight; the values do not need to add to exactly 100. An entry with includeInRotationAfterZones becomes eligible when any listed zone is unlocked.
round: introTitle: "West Berlin - October 28 1963" mobStats: baseHealth: 12 baseSpeed: 0.25 baseAttack: 3.0 aliveMobCap: base: 24 perPlayer: 4 max: 36 mobProportions: - mob: HUSK probability: 39 - mob: PILLAGER probability: 39 - mob: ZOMBIE_PIGLIN probability: 22 includeInRotationAfterZones: [4, 5] startItems: steak: 0 throwing_knife: 0 progressItems: steak: 0 throwing_knife: 2 Zombie spawns and zones
zombieSpawnLocations is a list of locations. A spawn without a zone is global and can always be selected. A spawn with a zone only joins the valid spawn pool after that zone is unlocked.
zombieSpawnLocations: - world: world x: 100.5 y: 64.0 z: 20.5 - world: world x: 120.5 y: 64.0 z: 18.5 zone: 2 - world: world x: 145.5 y: 63.0 z: 10.5 zone: 4 Zones are runtime state. They can be unlocked by doors, the /unlockzombiezone <id> admin command, or map logic that ultimately calls the zone manager. The DSL can test them with zone[unlocked=ID].
Power-ups
Known power-up IDs in this version:
DOUBLE_POINTS, INSTA_KILL, DEATH_MACHINE, MINIFY, KABOOM, MAX_AMMO, BARBEQUE, IRON_UP, HONEY_RUSH, DREADNOUGHT, MULE_KICK, RAPID_FIRE, FAST_RELOAD, FIRE_SALE, WAJOO.
lobby.enabledPowerups accepts either plain names:
lobby: enabledPowerups: - MAX_AMMO - INSTA_KILL - DOUBLE_POINTS or richer map entries. The power-up name may be supplied as type, powerup or name:
lobby: enabledPowerups: - type: MAX_AMMO - type: FIRE_SALE includeInRotationAfterZones: [2] - type: DEATH_MACHINE includeInRotationAfterZones: [4, 5] As with mob gating, matching any listed unlocked zone is sufficient.
Special rounds
If a specialRounds section exists, the config-driven resolver overlays your settings onto built-in defaults. Omitting a property keeps that special round's default. If the entire section is absent, the legacy hard-coded special-round path is used.
| Type | Enabled | Frequency | Money | Reward | Boss jingle |
|---|---|---|---|---|---|
WOLF | Yes | 5 | 2000 | MAX_AMMO | No |
SKELETON | Yes | 5 | 2000 | MAX_AMMO | No |
ELITE_PIGLIN | Yes | 15 | 3500 | DEATH_MACHINE | No |
BREEZE | Yes | 15 | 4500 | DEATH_MACHINE | No |
WARDEN | Yes | 25 | 5000 | INSTA_KILL | Yes |
BEE_SWARM | Yes | 25 | 5000 | HONEY_RUSH | No |
specialRounds: WOLF: Enabled: true Frequency: 5 Money_On_Completion: 3000 Reward: MAX_AMMO Play_Boss_Round_Jingle: false WARDEN: Enabled: true Frequency: 25 Money_On_Completion: 5000 Reward: INSTA_KILL Play_Boss_Round_Jingle: true Doors
Doors are named configuration objects. Each door contains one or more cuboid regions and may optionally unlock a zombie zone. DSL rules can detect interaction within a configured door and call unlockDoor by ID.
| Property | Default | Description |
|---|---|---|
cost | 0 | Economy cost used when the door is unlocked through the door purchase action. |
zone | None | Zone to unlock alongside the door. |
material | CUT_COPPER | Material representing the locked door region. |
regions | Required | One or more cuboids making up the door. A door with no valid regions is skipped. |
afterUnlocking | Empty | Optional extra cuboids used after the door unlocks. |
afterUnlockingMaterial | GLASS | Material used by the after-unlock regions. |
afterUnlockingMode | ADD | After-unlock behaviour mode supported by DoorDefinition.AfterUnlockingMode. |
doors: station_gate: cost: 750 zone: 2 material: CUT_COPPER regions: - from: { world: world, x: 10, y: 64, z: 20 } to: { world: world, x: 12, y: 66, z: 20 } afterUnlocking: - from: { world: world, x: 10, y: 64, z: 20 } to: { world: world, x: 12, y: 66, z: 20 } afterUnlockingMaterial: GLASS afterUnlockingMode: ADD Typical DSL door hook
/zr execute if block.interact within door[id=station_gate] run unlockDoor[door=station_gate] One-way barriers
One-way barriers are virtual cuboids. They can independently block players and active ZombieRounds mobs according to direction of travel.
| Property | Default | Description |
|---|---|---|
from | Required | First cuboid corner including world/x/y/z. |
to | Required | Opposite cuboid corner; coordinate order does not matter. |
playerCannotPassThru | DISABLED | NORTH, EAST, SOUTH, WEST or DISABLED. |
mobsCannotPassThru | DISABLED | Blocked travel direction for active mobs. Omitted/disabled means mobs pass freely. |
barriers:
kino_stage_drop:
from: { world: kino, x: 12, y: 64, z: 20 }
to: { world: kino, x: 17, y: 67, z: 20 }
playerCannotPassThru: NORTH
mobsCannotPassThru: DISABLED
The value is the prohibited direction of travel. For example, NORTH blocks northbound crossing but permits southbound crossing.
Breakable floors
Breakable floors are disabled unless breakableFloors.enabled is true.
| Property | Default | Description |
|---|---|---|
enabled | false | Master switch for the feature. |
defaultBreakDelayTicks | 10 | Default delay before queued floor blocks break. |
defaultBreakRadius | 4 | Default connected break radius. |
regions.<id>.material | Required | Only this material is treated as part of the breakable floor definition. |
regions.<id>.breakDelayTicks | Global default | Per-definition delay override. |
regions.<id>.breakRadius | Global default | Per-definition radius override. |
regions.<id>.regions | Required | List of cuboids. Coordinates are block coordinates; world is supplied by the region definition's source context in the manager. |
breakableFloors: enabled: true defaultBreakDelayTicks: 10 defaultBreakRadius: 4 regions: metro_platform: material: STONE_BRICKS breakDelayTicks: 8 breakRadius: 5 regions: - from: { x: 20, y: 60, z: -4 } to: { x: 40, y: 60, z: 6 } Mystery Box
The active Mystery Box implementation uses the lowercase mysterybox section. It supports multiple locations, zone-gated locations, a spinning/reveal period, a player accept period, visual beam settings and a whitelist of rewards.
| Property | Default | Description |
|---|---|---|
mysterybox.enabled | false | Enables the active Mystery Box system. |
mysterybox.cost | 950 | Cost per roll. |
mysterybox.spinSeconds | 5 | Spin/reveal duration, minimum one second internally. |
mysterybox.acceptSeconds | 10 | Time the winning player has to accept the reward. |
mysterybox.displayOffset.x/y/z | 0 / 1.2 / 0 | Offset for the displayed rolling/reward item; horizontal offsets rotate with the box facing. |
mysterybox.beam.enabled | true | Enables the active-box particle beam. |
mysterybox.beam.height | 20 | Beam height. |
mysterybox.beam.points | 40 | Particle point count. |
mysterybox.beam.particle | END_ROD | Bukkit particle enum. |
mysterybox.locations | Required | Candidate box locations. |
locations[].facing | NORTH | NORTH, SOUTH, EAST or WEST. |
locations[].includeInRotationAfterZones | None | Location only becomes eligible once a listed zone is unlocked. |
mysterybox.whitelist | Required | Reward definitions. An empty reward list prevents the box loading. |
Reward types
Reward entries use type: WEAPON_MECHANICS or type: VANILLA. WeaponMechanics rewards require weaponTitle. Vanilla rewards require a Bukkit material and can also set amount, display name, unbreakable state and enchantments. Either type can be marked wonderWeapon: true.
mysterybox: enabled: true cost: 950 spinSeconds: 5 acceptSeconds: 10 displayOffset: x: 0.0 y: 1.2 z: 0.0 beam: enabled: true height: 20 points: 40 particle: END_ROD locations: - world: world x: 100 y: 64 z: 20 facing: NORTH - world: world x: 200 y: 65 z: 10 facing: EAST includeInRotationAfterZones: [3] whitelist: - id: mp40 type: WEAPON_MECHANICS weaponTitle: MP40 wonderWeapon: false - id: wonder_gun type: WEAPON_MECHANICS weaponTitle: ThunderGun wonderWeapon: true - id: sword type: VANILLA material: DIAMOND_SWORD amount: 1 name: "&bMystery Sword" unbreakable: true enchants: sharpness: 5 ZR DSL
The ZR DSL is executed with /zr execute <statement>. It is designed for command blocks and map logic. Command blocks and console execute quietly; players receive a result/error message. DSL commands return the resulting boolean to Bukkit, allowing command-block conditional chains to branch on the result.
The parser is case-insensitive for keywords/action names. The current predicate grammar supports chaining with and only; there is no or operator in this version.
/zr execute if <predicate> run <action> /zr execute nif <predicate> run <action> /zr execute while <number> <ticks|seconds|minutes> [if <predicate>] run <action> /zr execute every <number> <ticks|seconds|minutes> [if <predicate>] run <action> DSL statements
| Statement | Meaning | Example |
|---|---|---|
if | Runs the action when the predicate succeeds. | if zone[unlocked=2] run true |
nif | Negated-if: runs the action when the predicate fails. | nif zone[unlocked=2] run true |
while | Registers/runs an action for the supplied duration, optionally conditioned by a predicate. | while 30 seconds if lobby[round>=5] run true |
every | Registers a repeating action at the supplied interval, optionally conditioned by a predicate. | every 5 seconds if zone[unlocked=3] run spawnRandomPowerup at \~ \~1 \~ |
Timed units supported by the parser are exactly ticks, seconds and minutes.
DSL predicates
Zone state
zone[unlocked=2] True if the given Zombie Zone is currently unlocked.
Round comparisons
lobby[round<5] lobby[round<=5] lobby[round=5] lobby[round!=5] lobby[round>=5] lobby[round>5] Compares the current round. Supported comparators are <, <=, =, !=, >= and >.
Executing player's movement flags
player.isSneaking player.isSprinting These require the DSL command sender to be a player.
Executing player's position
player.position at 100 64 20 with radius 3 player.position at \~ \~ \~5 with radius 2 Requires a player sender. Absolute and Minecraft-style tilde-relative coordinates are supported.
Any lobby player's position
anyPlayer.position at 100 64 20 with radius 3 anyPlayer.position at \~ \~ \~ with radius 5 Selects lobby players inside the radius. World/origin context comes from the executing player, command block, or the configured lobby teleport location. Successful selection can then be consumed by player-targeting actions.
Selected player balance
player[balance>=750] Tests the currently selected player's Vault/Economy balance.
Any player's balance
anyPlayer[balance>=750] Finds/selects a lobby player whose balance satisfies the comparison.
Specific button interaction
anyPlayer.interact button at 100 64 20 Matches the last captured player block interaction at exactly that block location, selects that player, then consumes the interaction so the same click cannot be reused by a later predicate.
Interaction within a configured door
block.interact within door[id=station_gate] Matches a click anywhere inside any configured region belonging to the named door, selects the interacting player, and consumes the interaction.
Combining predicates
if zone[unlocked=2] and lobby[round>=5] run true Current DSL v1 supports and between predicate atoms.
DSL actions
| Action | Syntax | Description |
|---|---|---|
true | true | No-op action that returns true; useful for command-block branching/testing. |
unlockDoor | unlockDoor[door=ID]unlockDoor[door=ID,cost=750] | Unlocks a configured door. If a cost is supplied it overrides the door's configured cost. The selected player is charged; if unlocking fails after withdrawal, the player is refunded. |
deductPlayerBalance | deductPlayerBalance[cost=750] | Withdraws the supplied amount from the selected player. |
teleportTo | teleportTo[x=100,y=64,z=20] | Teleports the selected player. Optional world, yaw and pitch arguments are supported. |
teleportToLobbySpawn | teleportToLobbySpawn | Teleports the selected player to the configured lobby/game teleport location. |
addToActiveMobs | addToActiveMobs[mob=HUSK,count=1] | Adds extra mobs of the supplied Bukkit entity type into the active mob system. count defaults to 1. |
removeAllExtraActiveMobs | removeAllExtraActiveMobs | Removes the extra active mobs added through the corresponding DSL/runtime mechanism. |
spawnRandomPowerup | spawnRandomPowerup at X Y Z | Spawns a random eligible power-up at a location. The action also supports restricting the possible types. |
spawnRandomPowerup type restriction
The action factory accepts a types=[...] argument and validates values against the ZombieRounds power-up enum.
spawnRandomPowerup[types=[MAX_AMMO,INSTA_KILL]] at 100 65 20 teleportTo full form
teleportTo[x=100.5,y=64,z=20.5,world=world,yaw=90,pitch=0] DSL examples
Buy a configured door when it is clicked
/zr execute if block.interact within door[id=station_gate] run unlockDoor[door=station_gate] The door's own configured cost is used unless the DSL action supplies a cost override.
Override the price for a particular interaction
/zr execute if block.interact within door[id=station_gate] run unlockDoor[door=station_gate,cost=500] Button-controlled teleporter
/zr execute if anyPlayer.interact button at 50 65 -10 run teleportTo[x=200,y=70,z=40,world=world,yaw=180,pitch=0] Require both progression and money
/zr execute if anyPlayer[balance>=1500] and zone[unlocked=2] run deductPlayerBalance[cost=1500] Spawn a restricted random power-up after a zone opens
/zr execute if zone[unlocked=4] run spawnRandomPowerup[types=[MAX_AMMO,INSTA_KILL,DEATH_MACHINE]] at 100 65 20 Repeating map effect
/zr execute every 10 seconds if lobby[round>=10] run addToActiveMobs[mob=HUSK,count=1] Simple command-block branch
/zr execute if lobby[round>=20] run true A conditional chain command block after this can use the boolean command result.
How config and DSL fit together
The YAML config defines persistent map objects and rules; the DSL reacts to runtime state and player interactions. The strongest examples are zones and doors:
# config.yml doors: platform_gate: cost: 1000 zone: 3 regions: - from: { world: world, x: 10, y: 64, z: 20 } to: { world: world, x: 12, y: 66, z: 20 } zombieSpawnLocations: - { world: world, x: 50.5, y: 64, z: 50.5 } - { world: world, x: 80.5, y: 64, z: 50.5, zone: 3 } round: mobProportions: - { mob: HUSK, probability: 70 } - mob: ZOMBIE_PIGLIN probability: 30 includeInRotationAfterZones: [3] lobby: enabledPowerups: - MAX_AMMO - type: FIRE_SALE includeInRotationAfterZones: [3] # command block / map logic /zr execute if block.interact within door[id=platform_gate] run unlockDoor[door=platform_gate] Once the door is successfully unlocked, its configured zone can be opened. That same zone then affects which zombie spawn locations are valid, which configured mob types may enter the weighted rotation, and which zone-gated power-ups can enter their pool. This is the core pattern for building progressive ZombieRounds maps.
Commands
| Command | Purpose |
|---|---|
/setround <round> | Set the current round. |
/setzombiespawn | Add/set a zombie spawn location. |
/removespawn | Remove the nearest zombie spawn location. |
/joinlobby | Join the ZombieRounds lobby. |
/chooselobby | Choose the map for the next game. |
/joinlobbyqueue [seconds] | Join the lobby queue. |
/startzombies | Start the game. |
/stopzombies | Stop the game. |
/killleftovers | Remove leftover ZombieRounds mobs. |
/unlockzombiezone <id> | Unlock a zone manually. |
/addmysterybox | Add a Mystery Box location via the legacy/admin utility command path. |
/zombiereload / /zrreload | Reload the active ZombieRounds config. |
/zombiespawnpowerup <type> | Spawn a named power-up at the player's location. |
/zr execute <statement> | Execute a ZR DSL statement. |
/zrquitspectator | Leave spectator mode and return to spawn. |
Reference notes
This page documents the configuration and DSL surface visible in ZombieRounds 2.1.21.11.31 source. Where a setting is omitted, Bukkit's configured default or the plugin's fallback behaviour applies. Enum values such as Bukkit materials, entity types and particles must be valid for the Minecraft/Paper version being used.