✯ Epic Mobs Rework ✯ [1.16+]

MC Plugin ✯ Epic Mobs Rework ✯ [1.16+] 1.1.0
Epic Mobs, Custom Spawners, Custom Bosses, Raids! Pre-Made mobs and more! Free Trial!

The MythicMobs update. A premium buyer running raids and arenas for 90 to 140 players asked for it so their ModelEngine models could go in, and it is here. Two arena sidebar changes ride along, one of them a bug fix from a report on 1.0.1. Swap the jar and start the server: config.yml gains two blocks (your existing file is kept beside it as config.yml.old), nothing else under plugins/EpicMobsRework is touched, and nothing you built changes behaviour.

A MythicMobs mob can be the body of an Epic Mob. One new key on a mob file, mythic-mob:, next to entity::
Code:
name: "Bone Knight"
entity: SKELETON
mythic-mob: SkeletalKnight
With MythicMobs 5.x installed and that name in its files, the spawn goes through MythicMobs and Epic Mobs adopts what comes back, so that Epic Mob can go in a raid wave, an arena wave, a pack, a spawner block, a summon list or a companion slot like any other. The rule is one sentence: MythicMobs owns the mob, Epic Mobs owns what surrounds it. MythicMobs keeps the name plate, health, damage, gear, effects, AI, glow, scale, skills, model, drops and despawn its own file gave the mob, and Epic Mobs never writes to any of it. Epic Mobs runs the raids, arenas, packs, spawns, kill rewards, kill tracking, the codex, the boss bar and the placeholders around it. Kill it and the MythicMobs Drops: fall and the Epic rewards: pay. Since a MythicMobs mob carries its Model: line with it, this is also how ModelEngine models get into Epic Mobs content. An optional mythic-level: passes a level to MythicMobs for its own level modifiers.

upload_2026-9-22_13-26-28.jpeg

A MythicMobs Reaper as the body of an Epic Mob, fighting an Epic companion. Screenshot by dinoboss2001.

The Epic keys a MythicMobs body will not use (stats.health, equipment, loot and the rest) are listed once per file in the console at boot and on /ep reload, and only the ones the file really sets. entity: stays required, because with MythicMobs absent, switched off in config.yml, or a 4.x build (reported as too old, not crashed into), every such mob spawns as its entity: and is dressed the normal way, with one warning per file saying so. /ep info lists MythicMobs with the other integrations, /ep info <mob> prints the body, the editor cycles through the names MythicMobs knows, and the chat wizard asks for the body when MythicMobs is hooked and skips the questions MythicMobs would own. The switch is integrations.mythicmobs.enabled, on by default.

MythicMobs is optional, like every other integration: nothing is required, nothing is bundled, and a server without it loses nothing. It works in both editions. MythicMobs 5.x runs on servers 1.19 and newer, so that is the floor for this one feature; the plugin itself still runs from 1.16.5 up. Tested with MythicMobs 5.13.0 on 26.2. The full setup and the list of ignored keys are on the wiki under MythicMobs.

The arena sidebar is yours to write. Its title and lines were hard-coded, so a server whose sidebar is part of its look had the choice of the plugin's three lines or no sidebar at all. New arenas.sidebar block in config.yml with title: and lines:, & colour codes, and eight placeholders: {arena}, {name}, {wave}, {waves}, {alive}, {standing}, {time} and {players}. The shipped values are the sidebar 1.0.1 drew, word for word, so nothing changes on screen until you edit them. Repeated lines are drawn instead of collapsing into one, a sidebar shortened on a reload drops the lines it no longer has from anybody mid-run, and lines: [] is a real answer: a titled sidebar with nothing under it. The limits the oldest supported server enforces are written next to the keys: 32 characters for the title, 40 per line, colour codes included, and 15 lines. arenas.scoreboard is still the on and off switch.

The arena sidebar goes away when you leave the room. It was only cleared when the run ended, so a player who stepped out of the region kept a frozen sidebar, on top of whatever their tab plugin wanted to show, until the run was called off. Reported on 1.0.1 by a server running TAB. The sidebar now follows the region: step out and your main scoreboard is back on the next pass, step back in and the sidebar is drawn again. Turning arenas.scoreboard off on a reload also takes it away from a party mid-run.

For plugin developers: EpicMobDefinitionView.mythicMob() is new and API_VERSION is 2. Nothing moved and nothing was removed.

Tested on Minecraft 26.2 and 1.16.5. Back up plugins/EpicMobsRework before updating, as always.

Setup guide, FAQ and support: https://jhprojects.vercel.app/epic-mobs-rework
Update 1.0.1

A small one, for the arena reports that came in after 1.0.0. Nothing changes in your files; Lang.yml gains one key and keeps your other entries.

How to set up an arena, start to finish, in two minutes:

The arena counts you as inside when you are. Two of you reported an arena that said nobody was in it while you stood in the middle. pos1 and pos2 mark the block you are standing on, and you stand a block inside the wall, so the box was always a block smaller than the room: standing at the edge of the floor put you outside it, and if you marked both corners on the floor the box was one block tall and a jump took you out of it. A player one block outside the box, on any side, now counts as inside. Mobs are still only placed inside the box itself. /ep arena create also gives the room at least ten blocks of height above its lowest corner and tells you when it did, and the console warns on load about a region under three blocks tall. An arena you already made with corners on the floor: give region.to a higher Y, or make it again.

/ep arena stop stays stopped. The run put you back at the entry point, which is inside the room, and half a second later the arena saw a party standing in it and started again. That also meant /ep arena delete never got its turn. After a run ends you have to step out and back in before it starts on its own; /ep arena start starts it regardless.

Cleared means cleared. Killing every mob a wave placed used to end the run even if those mobs had left something behind: a magma cube splits when it dies, and the small cubes were vanilla mobs wearing the Epic name, so the arena paid out over a room still full of them. Epic slimes and magma cubes no longer split; give the mob a summons: entry on ON_DEATH if it should leave something behind, and those are Epic Mobs the arena knows about. Anything a wave's mob summons, by a summons: entry or a SUMMON ability, now belongs to the run: the wave waits for it, killing it counts, and it goes when the run ends. A run that ends also removes any other Epic Mob standing in the region, except player companions.

Tested on Minecraft 26.2. Back up plugins/EpicMobsRework before updating, as always.

Setup guide, FAQ and support: https://jhprojects.vercel.app/epic-mobs-rework
Update 1.0.0

Hi guys. Epic Mobs stopped getting updates in 2023 on Minecraft 1.19, and a lot of you kept running it anyway. This is that plugin rebuilt: same ideas, same mobs, same configs, running on Minecraft 26.2 and on servers back to 1.16.5 from one jar.

This is the release. Two release candidates went out before it, and what they found is folded in below: if you are on RC1 or RC2, the section right after this one is the part that is new to you, and the update check will tell you about the next one from now on.

Forty numbered bugs are fixed, plus four more found while it was being built and run. Your data comes across on the first start with nothing lost.

Raids are a real event now in both builds: they happen somewhere, you write the waves, there is a way to lose one, and finishing one pays.

Premium gets everything that was on the roadmap: bosses that change how they fight as they die, mobs that are not automatically hostile, companions and mounts, packs with a leader worth killing first, arenas, scaling with how many players actually turn up, a mob codex for your players, a proper admin editor instead of fourteen chat prompts, and a boss at the end of a raid. PlaceholderAPI and a developer API are in both builds.

Tested on Minecraft 26.2 and on 1.16.5. Please back up your plugins/EpicMobs folder before updating, and let me know if anything acts up in the discussions page.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Since the release candidates

It tells you when there is an update.
The two release candidates could not: the check was in the jar but the resource id was not, so it stayed silent. It is on now, one request on start, nothing downloaded, nothing replaced. You decide when to restart.

Raids put more than one mob on the field. They never had. A raid file with no max-concurrent: line, which is every raid the plugin ships, was being read as a cap of one rather than "use the server-wide cap", so every raid on every server ran one raid mob at a time however big its goal. If a raid felt like a trickle, that was why. A raid that sets its own max-concurrent: was always honoured; the rest now take raids.waves.max-concurrent from config.yml, 40 by default.

Mob sizes. A mob file can say how big the mob is: size: 1.5 under stats:, or a range like size: 0.7-0.9 rolled per spawn so a wave is not twenty identical silhouettes. It scales the model and the hitbox with it, so a small mob is genuinely harder to hit and a big one genuinely easier: a balance knob, not a costume. The editor has a Size button, the codex and /ep info <mob> say it, and six of the shipped mobs use it so the raids read as a mixed force. It needs Minecraft 1.20.5 or later for the attribute; an older server loads the same file, spawns the mob at its normal size and says so in /ep info.

The jar loads on a 1.16.5 server now. It never had. The release candidates were compiled for Java 21, and a 1.16.5 server refuses to start on anything newer than Java 16, so "back to 1.16.5" was true of the code and untrue of the jar. It is compiled for Java 16 now and boots on 1.16.5 with the Java that server already needs. Nothing changes on 1.17 or later.

/ep info ends with the link to the guide, printed plain so your client makes it clickable. A player with epicmobs.info can find the documentation without asking you.

The Void Mite is a silverfish. It was an endermite, and endermen attack endermites on sight, so the End raid's chaff was being killed by the locals before you got to it. A server that already has the file keeps its endermite; change the entity: line, or delete the file and let the plugin write the new one.

Lite has /ep plugins, a one-row menu of my other plugins with a link to each, and shows the same three lines once per session to a player who has been on for a while. The full version has neither.

One update-check key. config.yml carried it twice, once under general: and once at the root, and only the root one did anything. The shipped file keeps general.update-check; an old config still loads, and either copy saying false keeps the check off.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

What the release candidates added

RC1 was the whole plugin going out for testing. RC2 was raids learning about time and place, all of it still in 1.0.0:

- A raid can wait for dark. time-of-day: NIGHT in a raid file, read against the world clock. The World Infestation ships with it, because a raid of spiders at noon is a hundred and twenty mobs that will not fight anybody.
- Raids in the Nether and the End. dimension: NETHER or END. Only players in that dimension are in it, each dimension raids on its own clock (raids.nether and raids.end in config.yml), and the raid clock pauses while nobody is there, so ducking back through the portal for supplies never costs anybody the raid.
- Twenty new mobs and two new raids, Premium: The Nether Legion and The End Incursion, on the same iron-armour baseline as the twenty already there.
- New built-in content reaches an existing install. Each shipped file is written once, ever, and installed-content.yml records which have had their turn, so an upgrade gets what it has never been offered and a mob you deleted stays deleted.
- Lite ships the World Infestation as its one raid, the global one, instead of a raid anchored at a point it could never reach.
- general.worlds lists the Nether and the End on a fresh install. An existing config.yml is never overwritten, so add world_nether and world_the_end by hand if you want the dimensional raids; the boot summary says which line.
- Five bugs from playing the Nether raid, all fixed: a Nether raid that could not place a mob for three unrelated reasons that printed the same message, a raid that logged twice a second when it could place nothing, and /ep raid start telling somebody standing in the game that nobody was online.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Read this first

Your mobs come with you.
On the first start the plugin reads your old plugins/EpicMobs/Data folder and writes one readable file per mob under plugins/EpicMobsRework/mobs/. Stats, gear, drops, extended loot, abilities, particles, buffs, summons, raids and spawners all come across. Your original files are kept, renamed to *.migrated, so nothing is deleted and you can go back.

The trial timer is gone. The old build wrote a timestamp about six days into the future and disabled itself when it passed, on paying customers' servers, while the licence check it was supposed to be guarding was hard-coded to always pass. There is no licence check, no timer and no phone-home of any kind in 1.0. Premium and Lite are two separate jars built from one source tree, so there is nothing to expire.

There are two builds now. EpicMobsRework.jar is the full plugin. EpicMobsRework-lite.jar is free, complete, and limited on how much of each thing you can have rather than on which things exist. The limits are at the bottom of this post and /ep info prints them.

Your extended loot comes across too, and it nearly did not. The items in Data/ExtendedLoot.yml store their enchantments under the names Minecraft used before 1.13, and the ones your Custom Enchantments 3 items carry are stored the same way. A modern server cannot read either, and it throws the whole item away rather than the name. The plugin now repairs those names before reading the file: an old vanilla name is translated so the item keeps the enchantment, and a name from an older CE3 is dropped from the item and listed in the console so you know which ones to re-apply. The item, its name and its lore always survive.

One thing to know if you run bosses with very large health. Minecraft itself caps a mob's maximum health at 2048. A mob file asking for more than that has always quietly got 2048, on every version, and the plugin used to track the larger number anyway, which is why a freshly spawned boss could show a part-full health bar before anybody hit it. It now tells you on the first spawn of each mob, naming the number your file asked for and the number the server gave it, and offers damage-model: POOL if you want the bigger pool back at the cost of the damage numbers other plugins read.

Your bosses stop fighting their own minions. The Crypt Warden calls in servants and then, in its later phases, throws lightning at everything nearby. That included the servants, and because the boss dealt the damage, the servants spent the rest of the fight attacking their own master. Two Epic Mobs on the same side now leave each other alone: area abilities skip them, hits between them are refused, and neither will target the other. If you actually want two of your mobs fighting, combat.friendly-fire: true in config.yml puts it back.

You still do not need any other plugin. Custom Enchantments 3, Kumandra's Economy, Vault, WorldGuard and PlaceholderAPI are all optional and the plugin runs correctly with all five absent. Nothing from any of them is bundled into the jar.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

The four things you will notice on day one

Your server stops getting slower.
The old build never removed a dead mob from its list. Every mob that had ever died stayed there, every sword swing on the server scanned the whole list, and the healing task kept reviving the corpses back towards full health. On a server that had been up a week that list was the single biggest thing the plugin did. It is a keyed lookup now and dead mobs leave it immediately.

Spawning is cheap. Finding a place to put a mob used to walk 316,131 points and dig down through 256 blocks of world, on the main thread, for every online player, every 90 seconds. It now picks a direction and a distance and checks one column, and there is a millisecond budget in config.yml so it can never run away from you. It also only ever looked between Y 0 and Y 255, so on any world made since 1.18 it could not see a cave or a mountain.

Other combat plugins can finally see your mobs. The old damage model set the damage to zero after doing its own arithmetic, so Custom Enchantments 3, damage indicator plugins, anti-cheat and logging plugins all saw a hit that did nothing. Now the mob's health pool goes on the entity itself and normal damage flows, which means every CE3 enchantment your players own works against Epic Mobs with no setup at all. If you liked the old behaviour, damage-model: POOL brings it back.

Mobs warn you before they hit you. Every hostile ability can play a particle and a sound a second before it lands. Nothing in the old build told a player anything was coming, and this one change does more for how a boss fight feels than anything else in the release.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Your mobs are files now

One file per mob, in plugins/EpicMobsRework/mobs/. You can read them, edit them, keep them in a git repository, or send one to somebody else:
YAML:
name: "Frost Wolf"
entity: WOLF
tier: TIER_3

stats:
  health: 750
  damage: 45
  resistance: 20

abilities: [ frostbite_players, poison_players ]

spawn:
  environment: NORMAL_NIGHT
  biomes: [ SNOWY_TAIGA, GROVE, FROZEN_PEAKS ]
  chance: 0.2
  group: 2-4

loot:
  guaranteed:
    - { item: BONE, amount: 2-5 }
  rolls: 2
  table:
    - { weight: 60, item: IRON_INGOT, amount: 1-3 }
    - { weight: 25, item: PACKED_ICE, amount: 4-8 }
    - { weight: 10, item: DIAMOND }
The old format was one big machine-written blob you could not touch without the server off. The chat wizard still works, /ep create mob, and so does everything else you were using.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Abilities

The 16 area-of-effect pulses are still there and still do what they did, so an upgraded mob behaves the way it always has. What is new is that they are now definitions you can change instead of things baked into the code:

- Triggers: on hit, on being hurt, on spawn, on death, on dropping below a health threshold, on picking a target, on getting a kill. Everything used to be "every N seconds".
- Per ability radius, cooldown, chance and targets. All four used to be constants, which is why every mob with the same ability felt identical.
- Telegraphs. A particle and a sound before the hit lands.
- Several effects in one ability, so an ability can damage, slow and knock back at once.
- Numbers that scale with the mob: amount: "0.4 * mob.damage", and conditions like if: "mob.health < 0.3 * mob.maxHealth".
- Seven new effect types: knockback, pull, lifesteal, shield, dispel, disarm and summon.

One small deliberate change: the ability that used to delete a random item out of a player's inventory now knocks the item out of their hand into their bag instead. Same panic, no support ticket.

Premium adds abilities.yml, where you write your own.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Bosses that change as they die (Premium)

A boss used to fight exactly the same way at full health and at two percent, which is why boss fights read as a long slog. Give a mob a phases: block and it does not:
YAML:
phases:
  - at: 1.0
    abilities: [ cleave, last_stand ]
    bar-colour: RED

  - at: 0.6
    abilities: [ cleave, root_players, lightning_players ]
    bar-colour: PURPLE
    on-enter:
      broadcast: "&5{mob} sheds its armour and the crypt goes cold."
      ability: knockback_burst
      immune-for: 2s

  - at: 0.25
    abilities: [ cleave, lightning_all, disarm_players ]
    bar-colour: WHITE
    on-enter:
      broadcast: "&f{mob} has nothing left to lose."
      immune-for: 2s
      speed-multiplier: 1.35
Each phase can swap the boss's abilities, change the boss bar colour so the whole fight can see what happened, announce itself, fire one ability as it starts, hold the boss untouchable for a moment while it transitions, and speed it up.

A phase happens once, on the way down only, so a boss that heals does not replay its entrance. The Crypt Warden that ships with the plugin already has three phases, so you can see it working before you write anything.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Mobs that are not automatically hostile (Premium)

Every mob file has a state.faction. Three of the four values now do something:

- NEUTRAL fights back and never starts it. It remembers whoever hit it, only that person, and forgets after a while.
- FRIENDLY will not target a player and cannot hurt one even by accident.
- GUARDIAN ignores players entirely and hunts hostile mobs near it, yours and vanilla's alike. Post a few around a town or a build and you have real defenders, with nothing else to set up.

Companions and mounts are still on the list for the next release. This is the half of that feature that needed nothing new to work.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Packs (Premium)

A pack is a group that spawns together, in plugins/EpicMobsRework/packs/:
YAML:
name: "Frost Wolf Pack"
leader: "Alpha Frost Wolf"
members:
  - { mob: "Frost Wolf", count: 3-5 }
formation: CIRCLE
spread: 4
leader-buff:
  speed: 1.15
  damage: 1.2
  health: 1.4
on-leader-death: FLEE

on-leader-death is the point of the whole thing. Kill the alpha and the rest FLEE, scattering with a burst of speed and no interest in fighting, or ENRAGE and pick up the buff the leader was carrying, or DISBAND and leave, or PROMOTE the nearest survivor into the leader's place. Killing the alpha and watching the pack break is a story. Killing six identical wolves is not.

Formations are SCATTER, CIRCLE, LINE and GUARD. Add a spawn: block, using exactly the conditions a mob file takes, and the pack turns up on its own; leave it out and it only spawns when you ask for it with /ep pack spawn.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Scaling with how many players turn up (Premium)

A Tier 6 boss tuned for a party of five is unkillable on your own and a pushover for twenty.
YAML:
scaling:
  enabled: true
  count-radius: 48
  health-per-extra-player: 0.35
  damage-per-extra-player: 0.08
  max-multiplier: 4.0
  ce3-level-factor: 0.0
One player always gets exactly the numbers in your mob file, which is what you tuned it at. Spectators and creative-mode players are not counted, so flying over an arena to watch does not make it harder for the people in it. Ordinary mobs are set at spawn and never change again. A boss recalculates once when it changes phase, keeping the health fraction it was on, so the bar does not jump and nobody loses progress.

If you run Custom Enchantments 3, ce3-level-factor adds a little more for the average CE3 level of the people in range, because five level 60 players are not the same fight as five fresh ones. It is off by default.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Companions and mounts (Premium)

The most asked-for thing this plugin did not have. A companion is one of your Epic Mobs, bound to one player, that follows them, fights with them and gets stronger.

Mark a mob claimable in its own file:
YAML:
companion:
  allowed: true
  rideable: false
  max-level: 10
  health-per-level: 0.12
  damage-per-level: 0.10
  abilities:
   - frostbite_players
Then a player stands next to one and runs /ep companion claim. Or you hand out a token with /ep companion token <mob>, which is an item, so it can be a quest reward, a shop line or a crate prize without any of those knowing companions exist.

What it does:

- Follows you, and catches up when it falls behind. It despawns when you log out and is waiting at your feet when you log back in.
- Fights what you fight. It will never hit you, and it will never hit anybody Custom Enchantments 3 has on your ally list. That last one matters more than it sounds: a pet that attacks the person you are playing with is worse than no pet.
- Levels up when you kill things near it, and a boss is worth more than a zombie. Each level gives it more health, more damage, and one new ability from the list in its file.
- Comes back when it dies. Five minutes by default, keeping every level. There is a permanent-death switch for hardcore servers and it is off unless you turn it on.
- /ep companion opens a small menu: follow, stay, passive, aggressive, call, ride, rename, dismiss.

Set rideable: true and give it a saddle in its equipment and you have a mount. Its speed comes from the mob file, so a mount is just a mob you can sit on.

Everything a player has earned is in data/players.yml and survives a restart.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Arenas (Premium)

Pick a room, write the waves, and it runs itself. Nobody has to type a command: the arena starts when enough people are standing in it.
YAML:
name: "Frozen Crypt"
region:
  world: world
  from: "100,40,200"
  to: "160,70,260"
entry: "world,130,41,205"
players: 1-4
waves:
  - mobs:
      - { mob: "Crypt Servant", count: 4-6 }
    delay: 5s
  - pack: "Frost Wolf Pack"
    delay: after_previous_cleared
  - boss: "Crypt Warden"
    delay: 5s
cooldown-per-player: 6h
broadcast: "&b{players} cleared the Frozen Crypt."
after_previous_cleared is the one worth knowing: that wave waits until the room is empty rather than landing on a clock. There is a sidebar showing the wave, what is left of it and how long you have been in. Clearing it pays top damage, most kills and everybody who took part, the same three prizes a raid pays. The lockout stops the same party running it every five minutes, and if everybody dies or leaves, the room resets and the mobs go with it.

A wave here is exactly a raid wave, which means the two new lines, delay: and boss:, work in your raid files too.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

The mob codex (Premium)

/ep codex is a book of every Epic Mob a player has personally killed, and it fills in as they play. First kill unlocks the entry and whatever flavour text you wrote for it. Ten kills show what it can do. Fifty show what it drops. Bosses also carry their fastest fight.

A mob they have never killed is a greyed-out row rather than a missing one, so they can see there is something out there they have not found yet.

Write the flavour in the mob's own file:
YAML:
codex:
  flavour:
   - "Hunts in threes, and never at noon."
/ep info <mob> is unchanged, and the exact numbers and the full loot table are still admin-only. That was the point: the only thing 1.4.13 showed a player was an admin stat dump, which spoils the mob rather than selling it.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

An editor instead of fourteen chat prompts (Premium)

/ep editor opens your mob list. Click one and you get pages for stats, state, equipment, abilities, loot and spawn rules, a test button that spawns the draft next to you, a duplicate button, and save.

- Clicks adjust a number, shift-clicks adjust it further.
- The equipment page is a real inventory. Drop a sword in it and that is the mob's sword, enchantments and all.
- The loot page draws each entry's weight as a bar, because a weight of 3 next to a weight of 30 is a ten percent chance and does not look like one.
- Anything wrong with the mob is shown while you are looking at it, not after you save.
- Anything the editor has no page for, phases, summons, rewards, is left exactly as you wrote it.

The chat wizard and every command still work, in both editions, because scripts need them and some people prefer typing.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

For plugin developers

There is an API now, published as its own small jar so you are not compiling against the whole plugin.
Java:
EpicMobsAPI api = EpicMobsProvider.get();

if (api.isEpicMob(entity)) {
    EpicMobHandle mob = api.getEpicMob(entity).orElseThrow();
    getLogger().info(mob.displayName() + " at " + mob.health());
}
Eleven events, including cancellable ones for spawning, damage, abilities and loot. Every query and every event works on Lite too, so you can build and test against the free build; only spawning and starting raids through the API need Premium.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Loot and rewards

- Weighted tables, with drops that are guaranteed and a roll count. Before, every item in a list had the same odds and nothing could be guaranteed.
- Everyone who fought gets paid. Loot and rewards go by share of damage dealt, with a minimum share you set. Set it to 0 and only the killer is paid, the way it used to work.
- Rewards actually pay. If you had Vault installed with no economy plugin behind it, the old build quietly paid nobody at all, even with Kumandra's Economy running. You now set the order in config.yml and the first provider that can actually pay does.
- A mob can pay in more than one currency: Vault, Kumandra's Economy or Custom Enchantments 3 RACO. Premium adds paying all of them, and letting a player choose with /ep wallet.
- The XP reward used to be handed out twice. Level: 5 gave ten levels. It gives five.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Spawning and protection

New spawn conditions on top of world, biome, time and chance: Y band, light level, weather, moon phase, distance from spawn, how many of that mob are already nearby, a per-player cooldown, whether it needs open sky, and replace_vanilla, which turns a naturally spawning vanilla mob into an Epic Mob instead of searching for a spot. Those are Premium.

In both editions there is a real spawn budget: mobs per world, mobs per chunk, mobs near one player, and a time limit on the search. Protecting your server from the plugin is not something you should have to pay for.

Epic Mobs will not spawn in:

- any cuboid you list in regions.yml, which needs no other plugin installed
- a WorldGuard region, if you run WorldGuard
- a Custom Enchantments 3 protected boundary, if you run CE3
- within a distance you set of world spawn or of any player's bed

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Raids are an event now

A raid used to be a number going up. Mobs appeared around every player wherever they were, so two people mining a thousand blocks apart were each in their own private copy of the same raid, you could not travel to it, you could not lose it, and finishing it was worth exactly the mobs you killed on the way.

Every part below is optional. A raid file you already have keeps working unchanged.

A raid happens somewhere. An anchor: block puts it at your world spawn or at a fixed point, with a radius the mobs appear in and a radius you have to be inside to be in the raid at all. Stand outside it and you get no bar, no credit and no prize, which is what makes a raid something your players travel to and defend.

You write the waves. A waves: list, one per interval, each naming mobs and how many of each, with a line it announces when it lands. Run out of waves and it goes back to drawing from the mob pool, so a raid never runs out of enemies before its goal.

There is a way to lose. time-limit: 15m on the raid, and a raid whose defenders all log off gets called off rather than sitting there forever.

Finishing pays. A rewards: block with three prizes: top damage, most kills, and everyone who took part. Top damage and most kills are separate on purpose, because the player who tanks a raid and the player who lands the last hit are almost never the same person, and paying only one of them tells the other not to bother next time.

A raid knows which mobs are its own. Any mob marked as a summon used to count towards a raid's kill goal, so a boss on the other side of the map calling in its servants fed the raid, and the raid then deleted those servants when it ended.

The fixes are all still in there too:

- The old raid tried five spawns per raid mob per online player every 30 seconds with no cap at all. With 20 players and 6 raid mobs that was 600 attempts a cycle. There is one budget for the whole server now, and a cap on how many raid mobs can be alive.
- The tier gate was written wrong and every tier above the first spawned at about a fifth of the rate its own comment claimed. Those rates are in config.yml now and they mean what they say.
- AllowRaids: false now switches raids off. It used to be read, printed by /ep info, and never actually checked.
- /ep raid start <name> and /ep raid list. And the results screen no longer numbers every player "1.".

Premium adds three more: a boss as the real final wave, so hitting the kill goal summons it and the raid is not won until it dies; a wave that spawns a whole pack, leader and formation and all; and scheduling windows so raids happen at your peak hours instead of at 4am.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

config.yml

Everything is in it now. The 20 block ability radius, the 40 mob crowd limit, the 15 minute cleanup timer, the 100 block respawn distance, the raid rates and the extended loot chance were all numbers buried in the code.

- Times are written the way you say them: 90s, 5m, 2h, 20d.
- Everything is checked when it loads. A value that is out of range tells you the key, what you wrote and what it used instead. It never quietly becomes zero.
- A misspelled key gets a warning instead of doing nothing forever.
- /ep reload reloads everything: settings, language, abilities, regions, mobs, raids and spawners, and tells you what it found. The old one reloaded mob definitions and nothing else, so changing a spawn rate meant restarting the server.
- Updating keeps your values, adds the new keys and saves your previous file as config.yml.old.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Integrations

/ep info tells you the state of each one, which is the first thing to paste if you open a support thread.

- Custom Enchantments 3. Your Epic Mobs now trigger the CE3 enchantments on their own weapons, with an allow-list and a level cap in config.yml so nothing turns up carrying Soul Eater at level 50001. CE3 protected areas block spawns, and RACO can be a mob reward, paid through CE3's own supply so it can never mint currency out of nothing.
- Kumandra's Economy 2.1. Payouts are tagged, so "Epic Mobs: Frost Wolf" shows up in a player's transaction history. 2.0 works without the tags.
- Vault and WorldGuard, both fixed. WorldGuard also gets an epicmobs-spawn region flag: /rg flag <region> epicmobs-spawn allow lets Epic Mobs into a region that keeps every other protection it has, deny keeps them out explicitly, and a region that sets neither behaves exactly as it did before.
- PlaceholderAPI. 22 placeholders for your scoreboards and holograms: how many Epic Mobs are alive, the boss you are standing next to and which phase it is in, the running raid's name, progress, location and time left, how many Epic Mobs a player has killed and how many different kinds, and the current scaling multiplier. /ep info says whether the expansion registered.

None of them is required, none of them is bundled, and the plugin does not care if you have none of them.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Console and admin

- Every command that does not need you standing somewhere now works from the console and from RCON, so /ep reload can go in a scheduler. /ep summon <mob> <world> <x> <y> <z> covers the one that did need a player.
- Mob names longer than three words can be typed at last.
- Two admins can edit two different mobs at the same time without overwriting each other.
- /ep arena list and /ep arena info <name> show a room's waves, prizes and lockout without opening the file.
- /ep timings shows you where the plugin's tick time is going.
- /ep debug spawn and friends replace Debug: true, which used to mean "log everything forever".
- On boot the plugin tells you about any mob that refers to an ability, biome, entity or summon that does not exist. All of those used to fail silently at spawn time, which is why some mobs just never appeared.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Lite edition

Lite is a complete monster plugin, not a demo. Every headline system is in it: you define mobs, they spawn, they fight, they use abilities, they drop loot, they pay rewards, bosses get boss bars, raids happen, and every integration works, including all of Custom Enchantments 3 and Kumandra's Economy.

What Lite limits is how much of each thing you can have:

LitePremium
Mob definitionsthe built-in set, plus 10 of your ownunlimited
Abilities per mob2, built-in onlyunlimited, plus your own
Loot entries per mob5unlimited
Raid definitions1unlimited
Raid location, waves, timer, prizesyesyes
Raid boss wave, or a wave that spawns a packnoyes
Triggers3unlimited
Reward currencies per mob1several
Custom ability authoringnoyes
Boss phases, companions, mountsnoyes
Packs and arenasnoyes
Advanced spawn conditionsnoyes
Player-count scaling, codex, admin editornoyes
Developer API: events and queriesyesyes
Developer API: spawning and controlnoyes
/ep plugins and a once-a-session popupyesno


Lite never refuses to load a file you wrote. If you come down from Premium, everything over the limit is skipped with a message naming it, your files are untouched, and putting Premium back gives you all of it again.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Two things that are not in 1.0.0 yet

An Epic Mob carrying a CE3 enchanted weapon does trigger its enchantments, but they all feel the same, because until recently CE3 had no way for another plugin to say "run Bleed, for this attacker, against this victim". Custom Enchantments 3 1.7.0 added exactly that, and a catalogue for ce3_treasure and ce3_book loot entries with it. The Epic Mobs side of that is the next piece of work, not part of this release: today those loot entries read your file correctly and produce nothing, and a mob's Bleed is a scaled hit rather than a bleed. Nothing breaks in the meantime, on any CE3 version.

The other is Spigot's rather than anybody's plugin: spawn.biomes accepts a biome tag like #is_cold, but Spigot exposes no way to ask whether a biome is in a tag, so the condition is ignored. /ep info says so on your server.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

If something goes wrong

Run /ep info and paste what it prints. It reports the version, the edition, your server version, every limit, every integration and everything the plugin detected about your server, which is usually enough to answer the question straight away.

Setup guide, FAQ and support: https://jhprojects.vercel.app/epic-mobs-rework
Release candidate 1.0-RC2

Second release candidate. If you are on RC1, this is the one to run.

Raids can now happen at a time of day and in a dimension. That is the headline, but the honest headline is that playing the new Nether raid found four bugs in an evening, and one of them had been quietly making a whole feature impossible.

Tested on Minecraft 26.2 and checked against the 1.16.5 API. Please back up your plugins/EpicMobsRework folder before updating.

Raids can wait for dark
Put one line in a raid file:
Code:
time-of-day: NIGHT     # or DAY, or ANY, which is the default
It reads the world clock, not your server's. That matters most for a raid built out of spiders, which are hostile at night and passive by day, so the World Infestation ships with it set: a hundred and twenty mobs that will not fight anybody is not a raid.

It gates the start and nothing else. A night raid that runs past sunrise keeps running, because a raid you could win by waiting for morning is not a raid.

This is a different setting from raids.schedule, which reads the wall clock on the machine and is the one for "raids happen in the evening, when my players are online". A raid can reasonably want a weekday evening and a dark sky, so the two are independent.

Raids can happen in the Nether and the End
Code:
dimension: NETHER      # or END, OVERWORLD, or ANY, the default
Three things follow from that line.

Only players in that dimension are in the raid. Somebody mining in the overworld gets no bar, no kill count and no payout, however close to the portal they are standing.

Each dimension raids on its own clock. raids.nether and raids.end carry their own interval, chance, min-players, abandon-after and enabled, each falling back to the server-wide setting. The Nether tries every 10 Minecraft days and the End every 15, against the overworld's 20, because a dimension people visit for twenty minutes at a time has to try more often to happen at all. The three schedulers are independent, so the Nether being under siege never stops the overworld starting a raid.

The raid clock pauses while the dimension is empty. Going back through the portal for blocks or food is part of fighting in the Nether and must not cost you the raid, so the time limit stops running whenever nobody is in it. /ep info says clock paused while it is stopped, and abandon-after (20 minutes) still ends a raid nobody ever comes back to.

Two new raids and twenty new mobs come with it, Premium: The Nether Legion, 70 kills from the Ashvein Skulker up to the Gloomforge Tyrant, and The End Incursion, 100 kills from the Void Mite up to the Voidmaw Sovereign.

Read this before you update
Add your Nether and End worlds to general.worlds. Nothing spawns and no raid runs in a world that is not on that list, and your config.yml is never overwritten, so an upgrading server keeps whatever it has. A dimension: NETHER raid on a server that lists only world can never start. The boot summary now says so by name, and names the line to edit.

general:
worlds: [ world, world_nether, world_the_end ]
Your existing raid files are not overwritten either, so the World Infestation on a server that already has it will not become a night raid on its own. Add time-of-day: NIGHT to raids/world-infestation.yml by hand, or delete the file and let the plugin write the new one.

New built-in content now reaches an existing install. Until this build the shipped set was only ever written on a genuinely fresh start, so an RC1 server would have kept its twenty mobs and never seen these twenty. Each built-in file is now written once, ever, recorded in installed-content.yml. That is what lets new content arrive on an upgrade while a mob you deleted stays deleted.

Lite
Lite ships one raid now, and it is the World Infestation. It loads one raid definition, so being sent two meant carrying a raid it could never run and naming it in the limit summary on every start: content you can see, can edit, and cannot use.

The World Infestation is the one because at: GLOBAL has no world name and no radius to get wrong, where the Hollow Siege anchors at world: world and quietly degrades on any server that renamed its overworld. All the commentary moved into it, so the raid format is still documented on disk.

An existing Lite install is untouched and keeps the Hollow Siege. Changing the raid a running server fights is not worth a tidier boot summary.

dimension: and time-of-day: themselves work in Lite. What Lite does not get is the two new raids and the twenty mobs in them.

What playing it found
Four bugs, and the reason they are worth writing down is that three of them printed the same message: placed 0 of 1 wanted, with no reason attached. Each one looked exactly like the last, which is why it took three passes to get to the bottom of it.

  • A mob with no environments: list is overworld only. Correct for natural spawning, wrong for a summoned one, and this was the fault actually stopping the Nether raid. The raid file said the Nether, the raid ran in the Nether, the search found good ground, and every candidate was refused because the mob had not separately been told the Nether exists.
  • The Nether has no surface. The location finder reads the heightmap, which in a roofed world answers with the bedrock roof for every column. A roofed world is searched in a band around your own height now.
  • The search geometry was wrong for the terrain. A 90 degree wedge 17 to 35 blocks out is solid rock in a Nether cavern. raids.nether has its own tighter ring and no compass arc.
  • A raid that could place nothing retried forever. The throttle that exists to prevent exactly that measured from the last successful placement, and a raid placing nothing never has one.
Also fixed: /ep raid start said "0 players online" to somebody standing in the game, because a player in an unlisted world is counted as nobody. It now says which worlds Epic Mobs acts in and what to edit. And opening a GLOBAL raid in /ep editor raid and pressing save quietly turned it into an ordinary local one.
Release candidate 1.0-RC1

Hi guys. This is Epic Mobs Rework going out for real testing before the 1.0 release.

Everything on the 1.0 feature list is finished and in this build. What it has not had is servers other than mine, and that is exactly the part I cannot do on my own. Both editions are up: the Lite build is free and complete within its limits, and if you can only test one of them, test that one.

Please run it, break it, and tell me what happened. The discussions page is the right place.

Tested on Minecraft 26.2 and 1.21.5, and checked against the 1.16.5 API. Please back up your plugins/EpicMobs folder before updating.

Why a release candidate rather than 1.0
Because two rounds of actually playing it found bugs that nothing else was ever going to, and I would rather a third round happened before the version number stops moving.

Both rounds found the same kind of fault: a subsystem that reported progress it was not making. A raid drew its boss bar, counted its waves up and ran its timer while spawning nothing. An arena did the same. Neither threw an error, neither logged a word, and both looked like they were working right up until you counted the mobs. Those are fixed, and the plugin now says so in the console when a raid or an arena places nothing three times in a row, because the fix for the next one of these is being told about it.

What changed since the internal 1.0 build
Raids are paced by their kill goal. The shipped raid used to reach "wave 4 of 4" about two minutes in with seven of its eighty kills done, because waves ran on a clock and the kill goal was a separate counter. The goal is split across the waves now: eighty kills over four waves is twenty each, and wave two does not start until the first twenty are dead.

Raid mobs come to you. They used to arrive one at a time, hundreds of blocks apart, so defending your base meant leaving it. They arrive in groups now, a kill brings the next one to where the last one died, and a raid without a fixed location follows each player's own position rather than scattering across everywhere they have walked. If you cannot find something, a trail of particles points at the raid mobs you have not fought yet, drawn for you alone, and it stops pointing at anything you have already hit.

A new kind of raid: World Infestation. It happens everywhere at once. There is no defender and no radius, everybody on the server is in it wherever they are standing, and the waves are dealt out around all of you.

Arenas work. They did not before, at all, in any room with a roof on it, and I am sorry about that one. There is also now a way to build one without typing coordinates: stand in one corner, /ep arena pos1, stand in the opposite corner, /ep arena pos2, then /ep arena create <name>.

Twenty mobs ship instead of seven, and everything is rebalanced. The old numbers were brutal: a Frost Wolf had 750 health and hit for 45, which two-shots a player in iron. Everything is tuned so that a player in full iron with an iron sword can beat a low-tier mob one on one with effort, and anything above that wants diamond, potions or friends.

On Lite, those twenty are built in. They do not count against the ten mob definitions Lite lets you write, so you get a working server out of the box and still have all ten to spend on your own ideas. The trade is that Lite cannot delete them. You can edit them all you like, and an edited one is never overwritten.

A raid editor, /ep editor raid, the same GUI the mob editor is.

Tab completion finally handles names with spaces. Type /ep modify delete Crypt, press tab, and you get Warden, Servant and Archer.

The plugin now tells you when there is a new version. It only ever checks. Nothing downloads and nothing replaces the jar; you decide when to restart.

A full command reference ships in the documents folder and is going up on the wiki.

What I would most like tested
In order, these are the three things that need somebody who is not me:

  1. A raid with more than one person in it. The call for help, somebody running in from outside and finding they are in the raid, their kills counting, and the payout at the end. All of that needs two players and has never had them.
  2. An arena, finished. Build a room, pos1, pos2, /ep arena create Test, stand in it with a friend, and see it through to the prizes.
  3. A companion claimed, levelled up, and killed. Riding one works. The rest is untested.
And generally: an older Minecraft version. It is built for 1.16.5 upward and checked against the 1.16.5 API, but 26.2 and 1.21.5 are the only two it has actually run on.

If something breaks
/ep info first: it prints the version, the edition, what loaded and which integrations hooked. Then /ep debug spawn if things are not spawning, which prints the reason for every refusal.

Paste both into the discussions page along with what you were doing. That is genuinely more useful than a description, and it is usually the whole answer.

Known gaps
  • Pack membership, a running raid and a running arena do not survive a server restart
  • Custom Enchantments 3 enchantments on a mob deal damage but do not each behave individually yet; that needs a change on the CE3 side, which is written up and coming
  • Biome #tag spawn conditions parse but cannot work, because Spigot exposes no way to read biome tags. /ep info says so
Update 1.4.13

Modification:
- Spawn restricted areas will now spawn epic mobs
- Removed Epic Mob boss chat spam on restricted areas
- Added compatibility to CE3's [1.0.17c] Protected Boundary
- Added Triggers, it spawns epic mobs at a coordinate with a given time and distance.

command:
delay -> a counter which triggers at time interval
radius -> distance required to trigger from between the player and the trigger location
mob -> epic mob name

/ep create trigger <delay> <radius> <mob> | creates a trigger at player's location (who executes the command)
/ep create remove_trigger <mob>
Note: Triggers won't work if the location is spawn restricted
Update 1.4.12

Modification:

- '/ep reload' will now reload the data contained inside EpicMob.yml
- '/ep clear' will kill all epic mobs in game, except for epic mobs with 'DESPAWN: false' in PersistentData.yml
- Modified chat support to CE3
BugFix:
  • Creeper Keep Spawning after explosion
Modification:
  • Modified all Epic Mobs entities, old data is removed
  • Tier 1 now accepts 5-199 hp
  • Removed all Epic Wolf Entities
Tested on MC 1.19.3 -> (Also tested on 1.16.5 but there might be any issue)
[IMG]
  • Fixed Boss Kill crash/bug
  • Fixed Vault null on creating epic mobs
  • Love
Reactions: SuperTesla
  • Added Epic mob spawn limiter on config.yml
EpicMobSpawnLimiter overrides the NormalMobChances and BossSpawnRate, you can set your own epic mob spawn rates.

(If you cannot find the EpicMobSpawnLimiter in the config.yml, you can manually type it or make a backup of your config.yml and delete the old one, the plugin will generate a new config.yml)
upload_2022-6-30_22-51-55.png
Top Bottom