Everything else in this mod is an encounter - one monster, met on its own terms. These are the layer above: a director that decides when several arrive together, and a boss with a bar, phases, loot and a summon you have to build.
Horde events
Twenty at once is a wall; six, then ten, then sixteen is a story with a middle. Hordes are a
datapack registry like genera, at
data/<pack>/zombiemod/horde/<name>.json. A wave can name specific
genera or leave it out and draw from the weighted table as usual, and
conditions are the same ones that gate spawning.
delay is ticks after the previous wave landed.
on_clear makes a wave arrive the moment the
previous one is dead, so clearing the field fast earns the next wave rather than
standing about waiting for a timer - which is what turns three waves into one escalating
fight. The delay stays on as a ceiling, so a player who hides or runs still gets the wave
eventually instead of a horde that quietly stalls forever with nothing left to kill.
Hordes are off by default. Start one by hand with
/zombiemod horde start regardless.
{
"name": "&cThe Horde",
"weight": 10,
"radius": 40.0, "min_radius": 22.0,
"bar_color": "red",
"announce": "&4You hear them coming.",
"victory": "&aThe horde is broken. The night is yours.",
"xp": 100,
"sound": "minecraft:entity.wither.spawn",
"conditions": [ { "type": "zombiemod:time", "phase": "night" } ],
"waves": [
{ "count": 6, "delay": 0 },
{ "count": 10, "delay": 500, "on_clear": true },
{ "count": 16, "delay": 700, "on_clear": true }
]
}
Four ship with the mod
Red bar, 100 xp
The general build. Chains on clear, so a night that goes well escalates rather than idles. "You hear them coming."
Waves: 6, then 10, then 16 - all drawn from the ordinary weighted table
Yellow bar, 80 xp
Many weak things, which is a different problem to solve. Deliberately the one that does not chain: its second wave lands while you are still busy with the first, because it is meant to be one overwhelming press.
Waves: 12 Swarmlings and Runners, then 18 with Crawlers added
Purple bar, 150 xp
Breakers first, so the way is open when the rest arrive. Full moon only, and only if you are sheltered - there has to be something to break. "The walls held."
Waves: 4 Breakers, then 8 Breakers, Rioters and Juggernauts, then 3 Big Breakers and Tanks
Purple bar, 250 xp
Rare on purpose. Two waves that each teach the hive what you fight with, and then the one mind that keeps the lesson. "You are heard. You will be catalogued."
Waves: 5 Zomborgs, then 7 Zomborgs, then the Borg Queen
The Siege
A low weight and a moon phase both make a thing rare. Only one of them lets a player see it coming - you look up, and you know tonight is the night to check the walls. So the moon does the limiting and the weight is high, rather than the other way around.
The other two conditions are what make "The walls held" true rather than a slogan.
see_sky: false means the Siege finds you sheltered, so there is something
for breakers to break. But sheltered alone is also true at the bottom of a ravine, so
depth bounds how far below the local surface you are.
depth exists because of a bug it exposed.
Hordes place their mobs at surface height in a ring around the player, so a horde starting
while you were deep in a cave would spawn its whole wave on the roof of the world and never
reach you - the bar would appear and nothing would arrive. All the shipped hordes now carry a
depth ceiling of 12, which is deep enough for a basement and not deep enough for that.
"conditions": [
{ "type": "zombiemod:time", "phase": "night" },
{ "type": "zombiemod:moon", "phases": ["full_moon"] },
{ "type": "zombiemod:see_sky", "value": false },
{ "type": "zombiemod:depth", "max": 12 }
]
moon takes any of vanilla's eight phases, and reads the game's own moon
phase rather than deriving it from the day count, so a dimension that disagrees about the moon
is handled for free. depth is measured against the column's heightmap
rather than an absolute Y, so it means the same thing on a mountain as at sea level.
Finding the last one
The problem every wave-defence has, and that Minecraft itself has never solved. Two answers, both borrowed from vanilla's instincts rather than invented.
Exactly what vanilla does for a raid, so the gesture is already learned. Any bell within 48 blocks - vanilla's own number - makes the horde's survivors glow. It is hooked on the ring itself, so an arrow or a redstone pulse works as well as your hand.
Once the last wave is out, a horde that has gone a minute without a kill lights its own survivors up. Measured from the last kill rather than from the start, deliberately: a long fight you are winning is not the problem, and should not be treated as one.
Not what has been spawned, because "twelve still out there" is the number a player actually wants. A horde ends when its last one falls rather than on a timer, and it ends with a line, a sound and the xp the horde is worth. A bar that simply vanishes reads as the feature stopping rather than as you winning.
Bosses
Add a boss block and the genus gets a bar. There is no separate flag - presence
of the block is what makes it a boss. Pair it with "weight": 0 so it never turns
up in the wild.
"boss": {
"color": "red",
"overlay": "notched_10",
"range": 64.0,
"darken_sky": true,
"boss_music": true,
"title": "Patient Zero"
}
color takes any vanilla bar colour, overlay is
progress or notched 6, 10, 12 or 20, and darken_sky,
boss_music and fog are the Wither's and Dragon's own
effects. The bar appears for players within range and follows them in and out of it.
"phases": [
{ "below_health": 0.33,
"title": "&4Patient Zero comes apart.",
"sound": "minecraft:entity.wither.spawn",
"announce": "title_and_chat",
"attributes": { "minecraft:attack_damage": 16.0 },
"abilities": [ { "type": "zombiemod:summon", "count": 3, "max_nearby": 14 } ] }
]
Abilities and attributes behave differently on purpose. Abilities are gated on the threshold, so they switch off again if the mob heals - a boss with a regeneration ability should not keep its enrage after clawing back to full. Attributes apply once and stay, because stats that yo-yo as health crosses a line read as broken rather than escalating.
| Mode | What it does |
|---|---|
| action_bar | Above the hotbar. Brief, and easy to miss mid-fight. The default. |
| chat | Stays put, so nobody misses it. |
| title | Big text across the screen, like the Wither arriving. |
| title_and_chat | Both. What Patient Zero uses. |
| none | Silent. |
title is announced once on entry and supports colour codes;
announce_radius defaults to 64 blocks, and sound plays
once on entry regardless. The Butcher uses action_bar where Patient Zero uses
title_and_chat, and has no darkened sky and no boss music, because a mid-boss
should not announce itself like the end of the world.
Loot: { "table": "<id>", "replace": false }.
replace defaults to false, so genus drops are added to whatever the
base mob gives. A horde that stops dropping rotten flesh is a surprising thing to inflict on a
server just by adding a mob type. Set it true for a boss whose drops should be exactly its own.
Summoning
Three ways in.
It takes an explicit position and needs no player, so it works from command blocks, from the console, and from other mods.
/zombiemod spawn zombiemod:patient_zero ~ ~ ~
Use an item on a block. Rituals are their own datapack registry at
data/<pack>/zombiemod/ritual/<name>.json rather than living on the
genus, so one boss can have several summons and a pack can add a ritual for someone else's
genus without overriding their file. Both block and
item accept a tag as well as a list, and a ritual can demand a built
structure with offsets relative to the block you activate.
Run the command, or spawn the mob and hand it to the genus applier directly.
{
"block": ["minecraft:wither_skeleton_skull", "minecraft:zombie_head"],
"item": ["minecraft:rotten_flesh"],
"genus": "zombiemod:patient_zero",
"consume": true,
"replace_block": true,
"count": 1,
"pattern": [
{ "offset": [ 0, -1, 0], "block": ["minecraft:soul_sand"] },
{ "offset": [ 1, -1, 0], "block": ["minecraft:soul_sand"] },
{ "offset": [-1, -1, 0], "block": ["minecraft:soul_sand"] },
{ "offset": [ 0, -1, 1], "block": ["minecraft:soul_sand"] },
{ "offset": [ 0, -1, -1], "block": ["minecraft:soul_sand"] }
]
}
Build a soul sand cross, put a wither skeleton skull, zombie head or skeleton skull on the centre, then right-click the skull holding rotten flesh. 250 HP, 2x scale, netherite sword, two phases and its own loot table.
Sit a zombie head on an iron block and right-click the head with a bone. 120 HP, 1.5x scale, Sharpness II iron axe and chainmail: it leaps at 60%, then shockwaves and inflicts Weakness at 30%.
Anchor on a block the player can actually reach. Offsets are relative to the block you right-click, so it must have an exposed face. The obvious first draft of the Patient Zero ritual anchored on the centre soul sand - which has neighbours on four sides and a skull on top, leaving no clickable face and a ritual that could never be performed. Anchoring on the skull and describing the soul sand below it fixes that, and matches how the Wither reads: you place the last skull.
All four horizontal rotations are tried, so the shape can be built facing any way. With
replace_block: true the structure is consumed along with the activated block -
otherwise one build summons bosses forever.