πŸŒ™

Supernatural

A Minecraft RPG plugin adding nine playable supernatural races, each with unique active abilities, passives, weaknesses, and a skill-point progression of their own. The most ambitious spigot plugin I attempted to develop, and ultimately the one I refactored myself out of.

Private ProtocolLib Vault
About

Supernatural turns survival Minecraft into a class-based RPG. Players choose one of nine supernatural races; each race comes with its own active abilities, passive effects, racial weaknesses, and a separate skill-point progression. Combat, mob behaviour, follower AI, chat, food, light exposure, and water all bend around the player's race.

Built on Spigot 1.16.5 with a soft requirement on Vault (economy/permissions) and packet-level work via ProtocolLib. At its peak the codebase sat at roughly 13,400 lines across 145 source files, last built in August 2021.

The nine races
What it could do, at its peak
  • Action framework. Race-specific actives (HolySmite, VampireBite, BatTeleport, Hellish, Snare, Ghoulish, etc.) sat on top of a generic Action / Target / Damage / Input layer, so adding a new ability was a matter of dropping a class into the right race package and wiring the inputs.
  • Skill-point progression. Each race had its own level/skillpoint pool, spent through a chest-GUI menu (SkillPointMenu) with /sn level, /sn skillpoints, and a respec command for refunding allocations.
  • Spell hotbar. A custom spellbar with rendered spell icons let players swap and fire abilities from a dedicated bar rather than fighting for the vanilla hotbar.
  • Bounty system. Players could place and check bounties on each other through /bounty, with kill rewards routed through Vault.
  • Custom-followers system. A full pet/minion architecture covering eleven mob types, with custom pathfinder goals layered on NMS.
  • Vampire infection. A VampireBite action spread the race virally, bitten players progressed through an infection state and eventually turned, courtesy of a SupernaturalInfectivity system.
  • Race-aware combat. Damage modifiers, attacking restrictions, and entity-hostility tables let races be naturally hostile or peaceful to specific mobs and to each other, independent of the vanilla rules.
  • Passive race effects. Vampires took sun damage with LightSensitivity; ghouls took rain damage; underwater races got UnderwaterMining and breathing perks via custom pathfinder goals; max-hearts pools differed per race (MaxHearts).
  • Custom arrows & infinite quivers. The Witch Hunter line used CustomArrows and InfiniteArrows for race-flavoured ranged combat.
  • Resurrection & recruitment. Race-flavoured respawn handling (RessurectionSpawn), RecruitingItems for converting NPCs/players, and RandomSpawnEntities for biome-tied race-themed mob spawns.
  • Race chat prefixes. Players' race showed up next to their name in chat (RacePrefixes), and a PlayerSetRaceEvent let other plugins react when someone changed race.
  • Packet-level intercepts. ProtocolLib was used for things vanilla events couldn't reach cleanly, most notably UnderwaterMining mining-speed adjustments.
  • Telemetry. bStats integration via the bundled Metrics class.
Scale
145
Source files
13.4k
Lines of Java
9
Playable races
11
Follower types
178
Compiled classes
Aug 2021
Last build
Status: archived, the refactor that ate the project

Supernatural was the project where I learned, the hard way, how a codebase that grows organically can become its own ceiling. By mid-2021 the plugin worked, every race shipped, the followers system was running, vampires could infect, but the code underneath had calcified into a shape I couldn't add new systems to without grinding. So I started refactoring. Three times, across three years. None stuck, and the project's been quietly archived since.

Late 2020 β†’ Feb 2021
0.9.0, the monolith Shipped
Everything in one ~5,800-line Supernatural.java: race logic, listeners, commands, abilities, follower handling, all of it. Worked. Unmaintainable.
Feb 2021
First reorganisation, packages per race Completed
Broke the monolith into Classes/<Race>/ sub-packages, with proper events, listeners, and commands as separate files. Eight indev iterations took it from the 0.9.0 mega-class to a real Java project shape. This is the work I'm proudest of, it actually shipped.
Feb β†’ Aug 2021
Second refactor, Action framework Completed
Renamed Classes/ to Actions/ and slid a generic Action / Target / Damage / Input layer underneath every race's abilities, replacing a tangle of hard-coded ability classes with composable actions. Added the skillpoint menu, the bounty system, the followers expansion, and the vampire updates on top. This is the version preserved as the "greatest state" above.
May 2021
Third refactor, flatten & extract passives Abandoned
A parallel branch trying three things at once: flatten Actions/ back to a single namespace, explode passives out of the catch-all ToggledPassives into one-class-per-effect (Regeneration, Speed, NightVision, WaterBreather, NoConsume, NoFoodRegen, MagicRegen, LavaSwim, etc.), and bolt on a magic-resource system and a proper bounty GUI. Got partway through migrating the Vampire actions and the passive split, then stalled. Some of the better ideas eventually got pulled back into the main branch through July; the rest never landed.
August 2021
Fourth refactor, full rewrite from scratch Abandoned
By August I'd convinced myself the only way forward was to throw the codebase out and start again, proper repository pattern from day one, a centralised GameTickEvent so listeners weren't fighting over the same tick, a clean Commands dispatcher, and a fresh package (I even renamed myself from LoneSurvivor to ModernAdventurer). Got 15 files in: the scaffolding, the data and message repositories, a handful of commands, the race enum. Then I looked at the ~13,400 lines of working gameplay I was about to have to port across, and walked away.
~2022 (1.19.2)
Fifth refactor, "Abilities" reboot, take five Abandoned
A later attempt to come back at it on Spigot 1.19.2 in a new project named Abilities, picking up the same me.ModernAdventurer.Supernaturals package the August 2021 rewrite started. Pushed the race roster to fourteen, added Human as the baseline, plus Shade and Earth/Water/Fire Elementals on top of the original nine, and tagged each race Holy/Unholy/Neutral and Supernatural/non-Supernatural in config. Finally implemented the magic-resource system the May 2021 branch had tried at: a proper 0–100 mana pool with capped writes, per-spell cooldowns persisted to YAML, hotbar-state tracking, and a four-slot config-driven spellbar. Sketched four new Vampire abilities, BloodVial, HighJump, BatFly, VampireBite: each with mana / food / health cost fields. Then stalled at the same wall: no spell handlers, no race-switching commands, no event listeners, and a couple of DataRepository methods left without return statements so the source as-shipped wouldn't even compile. Same pattern as every other reboot.
After
Project shelved Archived
The original 1.16.5 codebase still compiles cleanly into a working jar, it's "archived" rather than "broken", but I haven't touched it since August 2021, and the Abilities reboot stalled before it could replace anything. Two attempts to come back, neither finished.
The lesson, in retrospect: every refactor was after the same goal, looser coupling, separation of concerns, fewer god-classes, and every refactor hit the same wall, which was that doing it properly meant porting ~10K+ lines of working gameplay into a new shape. Two abandoned migrations later, the rewrite-from-scratch approach turned out to be even bigger than the migration would've been. If I were doing it again I'd refactor the existing tree in place, system at a time, behind a working game, and never branch off "the clean version" as a separate folder.