← ZombieMod ReForged

Hordes & bosses

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

Waves rather than a number, on purpose.

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

Each one is a different problem to solve.

The Horde

weight 10

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

The Swarm

weight 6

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

The Siege

weight 30

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

The Borg Hive

weight 1

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

Rare, or rare and legible.

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

One survivor, somewhere, in the dark.

The problem every wave-defence has, and that Minecraft itself has never solved. Two answers, both borrowed from vanilla's instincts rather than invented.

Ring a bell

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.

Or wait

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.

The bar counts what is alive

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

A bar at the top of the screen, and stages underneath it.

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.

How a phase announces itself

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

Bosses are meant to be called up.

Three ways in.

1. A command

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 ~ ~ ~

2. A ritual

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.

3. Your own mod or plugin

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"] }
  ]
}

Patient Zero

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.

The Butcher

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.