🎃 SpookySeason
SpookySeason turns your server into Halloween for a few weeks a year – and then turns it into a
siege. Knock on doors for treats, survive the blood moon, outrun the Headless Horseman, and when the
big night comes, hold the line while waves of undead march on something you cannot afford to lose.
⚔️ The Undead Raid
The centrepiece. Waves of undead walk at a target your players defend. Hold every wave and you win;
let the target fall and the raid is lost.
- One or several targets. Place them anywhere with
/spookyraid target add. Each target carries its own floating health readout.
- Or defend an area. Instead of an object, mark out a zone in game with
/spookyraid zone pos1 / pos2 / save – no other plugin required. Every attacker that gets inside
counts as a breach, and too many breaches lose the raid. Servers that already keep their areas in
WorldGuard can point the raid at a named region instead.
- Attackers are archetypes, not a flat mob list. Give each one equipment it actually fights with,
a size, its own stats, the wave it first appears in, upper and lower bounds per wave, and even its
own spawn distance. Archers shoot the target from range instead of walking up to it.
- Separate damage against players and against the target – player damage has to stay survivable,
target damage does not. One knob for each.
- They go for the objective, not for a chase. A defender in the way gets fought; a defender
across the map does not pull the whole wave along.
- No friendly fire, no craters, no bossbar flood. Attackers do not hurt each other, nothing they
do breaks blocks – withers included – and only the wave leader gets a bar.
- The Headless Horseman leads a wave of your choosing and brings his own health pool.
- Starts by command or on its own calendar window, independent of the season window.
- Separate rewards for holding the line and for losing it.
🍬 The Rest of the Season
Trick-or-Treat
- Right-click doors and villagers for treats or a nasty surprise
- Per-door and global per-player cooldowns so nobody farms the leaderboard
- Sneaking always opens the trade instead
Nights
- Blood moon with its own bossbar, ambient sound, soul particles and drifting ghosts
- Fog: a short darkness pulse at a configurable interval
- Bat swarms and jumpscares when you break blocks in the dark
- Naturally spawning zombies and skeletons wear carved pumpkins, creepers drop them
The Headless Horseman
- Skeleton horse and wither skeleton share one health pool – hitting the mount hurts the rider
- Armour, weapon, abilities and loot table are all editable live via
/spookyboss
- Wither on hit, fire resistance and a periodic charge, each toggleable
Pumpkin Rain
/pumpkinrain start – runs independently of the season, for when you just want the sky to rain gourds
Season End
- Treat leaderboard and configurable reward commands for the top collectors
- Distributed automatically when the calendar window closes, or by hand
- Winners who were offline get their rewards on next join; nothing is lost if the server was down
Quality of Life
- Per-player opt-out and individual sound volumes, plus a GUI for both
- English and German included; drop in your own language file
- Config merger: updates add new options without touching your settings
- Folia-native: no global-tick entity access, region-correct spawns, clean task cancellation
- Update checker (toggleable) and bStats metrics
🚀 Quickstart
/spooky menu Status, opt-out, volumes, leaderboard
/pumpkinrain start Make it rain pumpkins
/spookyraid target set Set the objective where you stand
/spookyraid target add ... or add several
/spookyraid start Launch the raid
/spookyraid status Waves, attackers, target integrity
/spookyraid zone pos1 ... or mark out an area to defend instead
/spookyraid zone pos2
/spookyraid zone save village
Before a real event: put your event world into enabledWorlds, set the objective, and size
maxAlive and the target health to your player count. The config ships rough starting points.
📋 Commands
| Command |
Description |
/spooky menu |
GUI: status, opt-out, volumes, leaderboard |
/spooky optout |
Opt out of all player-facing effects |
/spooky top |
Treat leaderboard |
/spooky on\|off\|status\|reload |
Toggle features, reload config and language |
/spooky rewards |
Hand out the season-end rewards now |
/spooky spawn boss |
Spawn the Headless Horseman |
/spookyvolume <ambient\|ghost\|rain> <0.0-1.0> |
Personal volume per sound type |
/spookyvolume reset |
Reset all your own settings, opt-out included |
/pumpkinrain <start\|stop> |
Start/stop the pumpkin rain |
/spookyboss <spawn\|remove\|info> |
Control the boss, see its live health pool |
/spookyboss set\|armor\|ability\|loot |
Edit every boss value without a restart |
/spookyraid <start\|stop\|status> |
Control a raid |
/spookyraid target <info\|mode\|set\|add\|list\|remove\|clear\|region> |
Place and manage the objectives |
/spookyraid zone <pos1\|pos2\|save\|list\|remove> |
Mark out your own zone to defend |
🔑 Permissions
| Permission |
Purpose |
Default |
spooky.admin |
All admin subcommands of /spooky, plus /spookyboss and /spookyraid |
op |
spooky.pumpkinrain |
/pumpkinrain |
op |
/spookyvolume and the player subcommands of /spooky (optout, top, menu) need no permission.
🔌 Integrations
All optional – the plugin runs without any of them.
| Plugin |
What it adds |
| WorldGuard |
Keeps spawns out of protected regions, and lets a raid defend a named region. Not needed for the built-in zones. |
| GriefPrevention |
Keeps spawns out of claims |
| PlaceholderAPI |
Placeholders for season state and treat counts |
| CustomJukebox |
Your own music during haunted nights and raids |
⚙️ Requirements
- Paper 1.21.x or 26.x, or a fork like Purpur. Folia is fully supported.
- Java 21
📊 Telemetry
SpookySeason uses bStats (opt out in plugins/bStats/config.yml) and can check Modrinth for updates
on startup (disable with updateChecker: false).