
EliteMobs
Minidungeons, Arenas, Bosses, Custom Loot, Quests, MMORPG progression & more!
EliteMobs 10.5.0:
- [New] Experimental quest dialogue rendered on top-anchored boss bars — toggle with useQuestDialogueBossBars
- [New] Binary single-step quest objectives show a ➤/✔ symbol instead of a "0/1" counter
- [New] Quest progression messages (kill/fetch/talk/arena, chat + scoreboard) are now fully configurable
- [Fix] Lightning enchantment procs now fire correctly
- [Tweak] Nerfed some boss enounter xp multipliers from 100x to 10x
- [Tweak] /em remove now reports clearly when the target isn't an EliteMob, is hijacked, or is a regional boss's spawn location
- [Tweak] Invalid Nightbreak tokens now prompt the player to update them (with an account link) on content commands
- [Tweak] Tuned combat, XP, and reward scaling, with level-reward protection when a player's skill level is far from the mob's
- [Tweak] Updated the bundled MagmaCore library
EliteMobs 10.4.0:
- [New] /em debug info dumps player skill levels and active damage multipliers to chat and console
- [Fix] Melee damage now derives attack charge from tracked swing timing instead of Bukkit's consumed attack cooldown
- [Fix] Arrow damage now uses launch-time velocity so long-range shots no longer under-damage elites
- [Fix] FreeMinecraftModels projectile hits on modeled bosses now route through the normal EliteMobs projectile damage pipeline
- [Fix] Currency and gambling debt now store cent-precise values with migration from legacy decimal columns
- [Fix] Skill level checks no longer read zeroed async login data before the player database load completes
- [Fix] Quest tracking now finds configured NPC, boss, and loot locations even when the target entity is not currently loaded
- [Fix] MagmaCore packet listeners now use per-plugin Netty handler names so EliteMobs and FreeMinecraftModels can both handle modeled entity interactions without colliding
- [Fix] MagmaCore temporary-world cleanup now skips folder deletion when Bukkit cannot unload an instanced dungeon world safely
- [Tweak] Dungeon protections now use MagmaCore's per-world protection rules, adding container allowlists and stronger controls for item frames, armor stands, elytra, flight, redstone, liquids, and environmental damage
- [Tweak] EliteMobs dungeon and protection locations now publish through MagmaCore LocationOwnership and LocationQueryRegistry for FreeMinecraftModels and other integrations
- [Tweak] Setup menu assets moved to MagmaCore shared SetupMenuBuilder and nightbreak:ui icons
- [Tweak] MagmaCore Nightbreak token-change notifications now refresh EliteMobs setup/update access state after login
- [Tweak] FreeMinecraftModels dependency updated to 2.7.0 and Gradle wrapper updated to 9.1.0
EliteMobs 10.3.1:
[New] Bedrock players can now see custom-modeled bosses and NPCs through Geyser (requires latest FreeMinecraftModels and ResourcePackManager) [New] Added a configurable cap on damage indicator particles to prevent client freezes on high-damage hits [Fix] Dungeon boss loot lockout now applies to all premade dungeons (default raised to 72 hours) [Fix] Locked-out players no longer earn skill XP from the boss they're on cooldown for [Fix] Instanced dungeon bosses no longer rescale to player level during phase switches [Fix] Fixed phase bosses sometimes not registering their lockout under the right identifier [Fix] Combat level tag above player names no longer disappears after world change or respawn [Fix] Fixed arenas failing to load on first server start when their worlds load after EliteMobs [Fix] /nightbreaklogin now refreshes content access immediately instead of requiring a restart [Fix] Fixed NPCs going invisible after /freeminecraftmodels reload [Tweak] Various MagmaCore library improvements (Bedrock position sync, MC 26 Spigot compatibility, classloader isolation for shaded copies, etc.) [Tweak] plugin.yml api-version updated to 1.21.4
EliteMobs 10.3.0:
- [New] Cross-plugin LocationOwnership API — EliteMobs now registers itself with MagmaCore's LocationOwnership service, so any plugin shading MagmaCore (FMM, MegaBlockSurvivors, BetterStructures, …) can call em.location.owned_by(loc, "EliteMobs"), .owners(loc), .is_protected(loc), .kinds_at(loc), .has_kind(loc, "open_world_dungeon") from a Lua script and get a correct answer regardless of which classloader hosts the script. Kind tags include "elitemobs", "world_package", "open_world_dungeon" (for WorldDungeonPackage), and the dungeon size category name. Older FMM jars (pre-2.4.0 LocationAPI) still get the legacy direct-registry bridge via NoClassDefFoundError fallback.
- [New] Broken elite weapons now block melee damage too, not just bow shots — an elite spear/sword/axe/scythe at last durability cancels EntityDamageByEntityEvent (ENTITY_ATTACK / ENTITY_SWEEP_ATTACK) the same way bows already cancel EntityShootBowEvent. Players see a configurable subtitle ("brokenItemSubtitleWarning" in ItemSettings.yml, default "&cYour weapon is broken!") so it's clear why their hits stopped landing instead of feeling like a silent bug.
- [New] DROPPABLE item type — adds a third option alongside CUSTOM and UNIQUE for items that should enter the random elite drop pool (like CUSTOM) but never appear in shops (like UNIQUE). Useful for items that should feel earned without being locked to a specific boss's drop table.
- [Fix] Armor attribute per-slot dedup on MC 1.21+ — attribute modifiers dedupe by NamespacedKey alone (slot is not part of the dedup key), so all four armor pieces sharing the keys "elite_armor", "elite_toughness", "elite_knockback_resist" meant only one piece's modifiers actually applied. Each slot now gets a "_head"/"_chest"/"_legs"/"_feet" suffix so all four armor pieces stack their stats correctly.
- [Fix] Loud admin warning when a player takes WORLD_BORDER damage inside an EM dungeon instance — the symptom is "dungeon closes the moment players walk in" because the border tick deals lethal damage which cascades into removePlayer → defeat → removeInstance. Almost always means the dungeon's blueprint world is missing its world-border data, or the border didn't carry over when the world was cloned (on Paper 1.21.6+ the border lives in its own file inside the dimension data folder, easy to miss).
- [Fix] ScriptZone now cancels its listener task when a shape's center loses its world (e.g. a referenced entity got despawned mid-tick) — previously filterByElite/Player/Living would log "World is null" once per shape per tick forever and the script kept ticking with no work to do.
- [Fix] VersionChecker / Nightbreak content access prefetch now bail fast on plugin shutdown — onDisable previously had to wait for in-flight HTTP timeouts (up to 10s each, potentially across many packages) and Bukkit would nag about async tasks not properly shutting down. Every loop iteration and HTTP callback now checks MetadataHandler.shutdownRequested and returns immediately.
- [Fix] Wormholes no longer accumulate orphan line entities across the away-period — when no players are within the 30-block nearby radius the line visuals are now torn down via the new WormholeEntry.onNoNearbyPlayers() hook instead of silently lingering, and a fresh set is recreated when a player walks back.
- [Tweak] EliteItemManager.isOnLastDamage(ItemStack) is now a single public static API, replacing two private duplicates (one in AlternativeDurabilityLoss, one in PlayerItem).
EliteMobs 10.2.0:
- [New] Anti-autoclicker throttle — players who land more than autoclickerThrottleMaxHitsPerSecond (default 5) genuine melee hits on elites within a one-second sliding window are locked out of dealing damage to elites for autoclickerThrottlePenaltySeconds (default 5) and warned in chat. Only ENTITY_ATTACK swings count, so sweep secondaries, thorns, and projectiles don't false-positive. Configurable via autoclickerThrottleEnabled, autoclickerThrottleMaxHitsPerSecond, autoclickerThrottlePenaltySeconds, and autoclickerThrottleMessage in MobCombatSettings.yml.
- [New] Per-skill internal proc cooldowns — ProcSkill now exposes getInternalCooldownMillis() so burst-damage procs can't be spammed by autoclickers faster than their intended cadence. Devastating Blow uses a 1.5s internal cooldown as the first consumer.
- [New] Notification throttler — currency pickups, "no XP" warnings, and quest-progression messages are now batched and flushed once after a quiet period instead of flooding chat. Tunable via the new notificationThrottleSeconds key in DefaultConfig (default 10s, minimum 1s). Currency action-bar feedback still updates live; only the chat summary is debounced.
- [New] Elytra prevention in EliteMobs worlds — players are stopped from gliding inside any EliteMobs content world via EntityToggleGlideEvent, PlayerChangedWorldEvent, and a per-tick PlayerMoveEvent backstop (necessary because cancelling the toggle event no longer reliably stops gliding client-side on 1.21.6+). Per-package opt-out via the new allowElytra config field on ContentPackagesConfigFields.
- [New] EMDungeonLocator API — registered with MagmaCore's LocationQueryRegistry and (when present) bridged into FreeMinecraftModels' LocationAPI under the "EliteMobs" key so cross-plugin scripts can ask "is this location inside EliteMobs content?" with an O(1) world-name lookup. Covers every WorldPackage subclass (open-world, instanced, dynamic, hub).
- [New] Lua entity enricher — every Lua entity table now carries is_elite, is_custom_boss, is_significant_boss flags and an elite sub-table with level, name, health, max_health, health_multiplier, damage_multiplier, and a remove() method; when FreeMinecraftModels is present, is_modeled, is_prop, and a model sub-table (model_id, play_animation, stop_animations, remove, is_dynamic) are also exposed.
- [New] Boss global cooldown store for Lua scripts — ScriptableBoss now exposes a per-EliteEntity cooldown map via getGlobalCooldownStore() so Lua-scripted bosses can share cooldown state across hooks and instances of the same boss.
- [New] Arena quest scoreboard line — new arenaQuestScoreboardProgressionMessage key in Quests.yml and an $arenaName placeholder for arena objectives in CustomQuestMenu summary lines, both resolving the arena's display name from CustomArenasConfig with a filename fallback.
- [New] hideEnchants config option — new key in ItemSettings.yml (default true). When set to false, vanilla enchantment lines are shown on EliteMobs items, setup-menu icons, constructed elite items, and scroll-converted items instead of being hidden by ItemFlag.HIDE_ENCHANTS. (Contributed by Jeric.)
- [New] playersSayMessage config option for the Summon Merchant enchantment — when false, summoning the merchant no longer makes the player /chat the configured message (default true preserves prior behavior).
- [Fix] Quarantined Paper 26.1+ world migration debris before loading dungeon worlds. When a previous Paper migration left both the legacy folder and the modern
/dimensions/minecraft/ folder populated, Bukkit.createWorld would throw "Refusing to overwrite existing migrated file" and the dungeon world would never load. The legacy folder is now renamed aside as .paper-migration-backup- so Paper sees no legacy trigger and loads cleanly from the modern path. - [Fix] Routed all world filesystem access through MagmaCore's new WorldFolderResolver — isDownloaded checks, wormhole-world existence checks, instanced-world cleanup loops, blueprint-clone destination wiping, and unique-world-name picking all now look at both legacy and Paper-26.1+ modern layouts. No-op on Spigot and pre-26.1 Paper.
- [Fix] Fixed The Palace Sanctum's dungeonObjectives default missing the "filename=" prefix — the entry was a bare "the_palace_old_stone_king_p1.yml" instead of "filename=the_palace_old_stone_king_p1.yml", causing DungeonObjective.registerObjective to return null, the null to be added to the dungeon's objective list, and /em quit to NPE inside ArrayList.forEach during instance teardown. Existing servers with the bad value already on disk are auto-corrected at load time.
- [Fix] Fixed /em quit throwing NullPointerException when a dungeon has no objectives configured or has malformed objective entries — DungeonInstance now null-checks rawDungeonObjectives before iterating, logs a warning when registerObjective returns null instead of adding the null to the list, and the unregister forEach skips null entries defensively.
- [Fix] Backward-compat for legacy dungeonObjectives entries — entries that end in ".yml" without a "filename=" prefix are now auto-treated as filename= entries instead of being silently dropped, so existing servers with the old (typo'd) format keep working.
- [Fix] Wormhole line visuals are now torn down when no players are within the wormhole's nearby radius. Previously the line BlockDisplays stayed in the world while the wormhole was idle, and any event during the away period that re-instantiated the WormholeEntry (config reload, content pack install/uninstall, /em setup flow) would create a fresh in-memory line list while the old BlockDisplays remained — producing the "AG wormhole multiplying, only one animated, the rest frozen in place" symptom. Lines now rebuild cleanly on the next tick a player walks back into range.
- [Fix] Fixed runaway "World is null in filterByElite/Player/Living" warnings that fired once per shape per tick when a script zone's shape center lost its world (typically a referenced entity getting despawned mid-tick). The ZoneListenerTask now detects the null-world state and cancels itself with a single warning naming the boss, instead of looping forever doing no work.
- [Fix] Fixed quest-progression chat messages flooding when objectives update in rapid succession — they're routed through MessageThrottler keyed per objective, so concurrent quests don't clobber each other.
- [Fix] Fixed currency-pickup chat messages spamming during loot showers — pickups are summed and emitted as a single chat line after the configured quiet period, while the action bar still ticks live.
- [Fix] Fixed "no XP" level-difference warnings flooding chat when farming low-level mobs — repeated identical warnings now collapse to one message with a "(xN)" suffix, while the capped-XP variant still sends immediately.
- [Fix] Fixed gliding desync in protected EM worlds on 1.21.6+ — added a PlayerMoveEvent backstop that re-asserts setGliding(false) every tick because cancelling EntityToggleGlideEvent does not reliably stop the client.
- [Fix] Fixed dungeonLockoutMinutes config field not being written to disk on first generation — the processInt call now passes write=true so default values persist for editing.
- [Fix] Fixed scripted-item application breaking when FMM was a different version than expected — replaced reflection-based ScriptedItemAPI invocation in ItemConstructor with a direct API call wrapped in NoClassDefFoundError handling, so missing classes degrade gracefully and successful applications skip reflection overhead.
- [Fix] Fixed FreeMinecraftModels dungeon bridging being silently skipped on older FMM jars — the bootstrap now logs a clear warning when LocationAPI is missing (FMM < 2.5.0) so server owners know is_in_dungeon won't see EliteMobs dungeons.
- [Tweak] Temporary block management moved out of EntityTracker into MagmaCore's TemporaryBlockManager so the state is shared across plugins; addTemporaryBlock/isTemporaryBlock/removeTemporaryBlock now delegate, world-unload cleanup is handled by MagmaCore, and the Lua spawn_temporary_block helper goes through TemporaryBlockManager directly with a single requireAir flag.
- [Tweak] FreeMinecraftModels dependency upgraded to 2.5.0 to pick up LocationAPI and the new ScriptedItemAPI signature.
- [Tweak] Removed the silent Math.max(damage, 1) floor on outgoing player-to-elite damage — the multiplier pipeline now respects the real input damage (so true-zero damage hits like sweep secondaries no longer get clamped up to 1) before damageModifier and combatMultiplier are applied.
- [Tweak] Premade dungeon display names prefixed with "&2[Dynamic] &3" — Craftenmines Lab Sanctum, The Bridge Sanctum, The Cave Sanctum, The City Dungeon, The Climb Dungeon, The Deep Mines Dungeon, The Mines Dungeon, The Nether Bell Sanctum, The Nether Wastes Dungeon, The Palace Sanctum, and The Quarry Dungeon now self-identify as dynamic dungeons in setup menus.
- [Tweak] ItemLootShower internal cleanup — dropped the playerCurrencyPickup HashMap, BukkitRunnable poller, sendCurrencyNotification, and sendAdventurersGuildNotification helpers in favor of MessageThrottler.pushCurrency, which now drives both the chat summary and the adventurer's guild action-bar.
- [Tweak] Updated MagmaCore dependency to 2.2.0-SNAPSHOT for the new WorldFolderResolver utility.
EliteMobs 10.1.1:
- [Hotfix] Removed some debug messages left in by mistake
● EliteMobs 10.1.0:
- [New] Updated for Minecraft 26.1.
- [New] Boss XP multiplier — bosses now reward bonus XP based on their health and damage multipliers. A 10x HP boss gives ~14x XP, a 25x HP boss gives ~49x XP. Reinforcement mobs with low multipliers give proportionally less.
- [New] XP progression rebalanced — XP required per level reduced from 20L³ to 8.5L³, bringing the level 1-100 grind from ~1,650 hours of pure mob farming to ~300 hours of dungeon running.
- [New] Peace Banner — craftable item that creates a chunk-based peaceful zone where elite mobs and events don't spawn. Configurable chunk radius (default 4), any player can place or break them, data persists across restarts. Replaces the old guild-based opt-out system.
- [New] Peace Banner admin commands — /em peacebanner give
, /em peacebanner list. - [New] Peace Banner crafting recipe — surround any banner with bones. Recipe is configurable and can be disabled by admins.
- [New] FMM scripted item integration — EliteMobs custom items can now reference FMM scripted items, bridging the two item systems.
- [New] Free Goblins Events Pack content package.
- [New] Lua API: player boss bars, action bars, and titles with tick-based auto-dismiss.
- [New] Lua API: raycast, spawn_firework, get_target_entity, get_eye_location, get_look_direction.
- [New] Lua API: send_block_change and reset_block with optional auto-reset timer.
- [New] Lua API: get_highest_block_y for terrain queries.
- [New] Lua API: player:sleep() and player:wake_up() endpoints.
- [New] Lua entity bridge — scripts can now check is_elite, is_custom_boss, is_significant_boss, health_multiplier, and damage_multiplier on any entity.
- [Fix] Boss bars no longer flicker or disappear when health ratio goes slightly out of bounds from dynamic level scaling.
- [Fix] Fixed Nightbreak token "Invalid token format" errors caused by whitespace in copy-pasted tokens.
- [Fix] Fixed compatibility with Minecraft 26.1 — replaced removed SnakeYAML Base64Coder with java.util.Base64.
- [Fix] Fixed timed events ignoring their configured globalCooldown — the event system was overriding it with a hardcoded 5-minute cooldown after each event spawned, causing events to fire far more frequently than intended.
- [Fix] Fixed content download crashing with "Missing protocol in URI" when a content pack had no download link or Nightbreak slug — now shows a friendly error message instead.
- [Fix] Fixed Free Goblins Events Pack missing its Nightbreak slug, preventing downloads and version checking from the setup menu.
- [Fix] Fixed Free Goblins Events Pack not being recognized as default content, causing version update checks to silently skip it.
- [Fix] Fixed version checker skipping update notifications for content packs that use the simple constructor — packs with a Nightbreak slug are now always version-checked regardless of constructor type.
EliteMobs 10.0.5
- [New] Lua scripting engine for boss powers! All 54 premade boss powers (Arrow Fireworks, Frost Cone, Spirit Walk, Shield Wall, Tracking Fireball, Zombie Bloat, etc.) have been rewritten from Java to Lua. Powers are now defined as .lua scripts, making them fully moddable and extensible by content creators without touching Java.
- [New] Lua boss API with full entity inheritance — bosses, players, and generic entities all share a unified API. Bosses inherit all living entity methods (push, gravity, scale, particle/sound spawning) and add boss-specific methods (health, tags, combat hooks).
- [New] 14 Lua script hooks for bosses — on_spawn, on_game_tick, on_zone_enter, on_zone_leave, on_boss_damaged, on_boss_damaged_by_player, on_boss_damaged_by_elite, on_player_damaged_by_boss, on_enter_combat, on_exit_combat, on_heal, on_death, on_leash_reset, and on_boss_target.
- [New] Lua powers config system — each Lua power gets a YAML config file, allowing server admins to toggle and configure powers the same way as before.
- [New] Special power support classes for complex Lua powers that need Java-side help — ShieldWall, SpiritWalk, TrackingFireball, EnderDragonEmpoweredLightning, ZombieNecronomicon, and NameTagMessage.
- [New] GameClock utility for tick-based timing in Lua scripts.
- [New] /em loot debug
unbreakable command — debug loadout variant that grants items with Unbreaking 99 for extended testing sessions. - [New] ScriptableBoss and EliteMobsScriptProvider for MagmaCore 2.0 scripting integration — bridges EliteMobs boss entities into MagmaCore's unified scripting framework.
- [New] Script system generalized with ScriptExecutable and ScriptRuntimeOwner interfaces, allowing both YAML elite scripts and Lua scripts to share the same action/target/condition pipeline.
- [Fix] Fixed %% literal in ender_dragon_tornado Lua script causing a LuaJ parse error — Java text blocks don't process % like String.format.
- [Fix] Friendly Lua error messages now show file, line number, hook name, and plain-English explanation instead of raw Java stack traces.
- [Tweak] MagmaCore dependency upgraded from 1.28-SNAPSHOT to 2.0.0-SNAPSHOT.
- [Tweak] EasyMinecraftGoals dependency removed — now bundled inside MagmaCore.
- [Tweak] LuaJ dependency removed from EliteMobs — now provided by MagmaCore's shaded jar (com.magmaguy.shaded.luaj).
- [Tweak] EMG package relocation added to avoid classloader conflicts.
- [Tweak] MagmaCore excluded from shadow minimize to keep NMS adapters intact.
- [Tweak] Shape utilities (Cone, Cuboid, Cylinder, Dome, Ray, Sphere) migrated to MagmaCore — EliteMobs only keeps the specialized ray variants (StaticRay, RotatingRay, TranslatingRay).
EliteMobs 10.0.4
- [New] Scaled combat system for natural elite mobs! When enabled (on by default), overworld elites simulate combat at the player's skill level, so gear matters but mob level doesn't. This makes natural elites feel equally fair regardless of player progression. Dungeon bosses using normalized combat are unaffected. Configurable via useScaledCombatForNaturalElites in MobCombatSettings.yml.
- [New] Scaled combat can also be enabled per custom boss via the scaledCombat config field, allowing content creators to opt specific bosses into level-independent combat.
- [New] Scaled combat damage multiplier configs! Separate scaledDamageToEliteMultiplier and scaledDamageToPlayerMultiplier settings allow fine-tuning scaled combat difficulty independently from normalized and standard combat.
- [New] Scaled combat entities display a symbol (⚔ or ☠) instead of a numeric level in their nametag, configurable via scaledStandardLevelSymbol and scaledHighThreatLevelSymbol. High-threat symbols appear when the boss has a health multiplier above 1.
- [New] Scaled combat health displays show percentage-based damage popups and health bars instead of raw numbers, since the actual HP values are meaningless to the player.
- [New] Scaled combat reward resolver! Loot, coins, and skill XP from scaled-combat elites use the player's combat level instead of the mob's internal level, ensuring rewards always match progression.
- [New] Legacy health scaling toggle! useRecommendedHealthScaling (default true) lets servers opt into smaller legacy-style HP values for natural elites, closer to EliteMobs 9 numbers. Not recommended for new servers.
- [New] Strength and Weakness potion effects now affect player damage against elites! Configurable via strengthDamageMultiplierV2 and weaknessDamageMultiplierV2 (default 0.2 per level each). Strength/Weakness are combined linearly so equal levels cancel exactly.
- [New] Potion multiplier added to the damage formula and damage breakdown display — Strength, Weakness, and Resistance are now centralized in PotionCombatModifierCalculator.
- [New] Geyser/Floodgate Bedrock player detection! GeyserDetector now actually detects Bedrock players via reflection-based integration with Floodgate and Geyser APIs, replacing the old placeholder stub.
- [New] Combat level display height adjusted for Bedrock players — the floating combat level text is offset higher for Geyser/Floodgate clients to account for Bedrock rendering differences.
- [New] /em loot reward
command — gives a custom item to a player scaled to their combat level, with overflow items dropped on the ground. - [New] /em loot debug
limited command — equips a limited debug loadout (armor, sword, bow, shield, arrows only) for faster testing without cluttering the inventory with every weapon type. - [New] Boss tracking bars now work for all bosses with announcementPriority >= 1, even without a custom locationMessage — a sensible default message ("$name: $distance blocks away!") is used automatically.
- [New] Boss announcementPriority now defaults to 1 when the boss has any announcement content (spawn/death/escape/location messages), instead of always defaulting to 0.
- [New] Wormhole-aware boss tracking! Boss tracking bars and boss bars now route through wormholes — if a boss is in another world, the tracking bar shows the distance to the nearest wormhole entrance that leads to the boss's world instead of showing "other world."
- [New] Wormhole-aware quest tracking compass! The quest compass now uses centralized wormhole navigation logic to point players toward the nearest wormhole when the objective is in another world.
- [New] Back button in dungeon browser menus! When opening a dungeon teleport from the teleports page (inventory or dialog), the level selection and difficulty selection menus now include a back button to return to the teleport browser.
- [New] PlaceholderAPI placeholders for Maces and Spears skill levels (%elitemobs_player_maces_level%, %elitemobs_player_spears_level%).
- [New] Dynamic quest rewards are now generated at turn-in time using the player's current combat level, not the quest's original level. If the player is in a dynamic dungeon, the dungeon's selected level is used instead. This prevents stale rewards from quests accepted long ago.
- [New] Dynamic quest level scaling reworked — quests now use the player's full combat level (1-100) instead of the old divided quest level (1-20), producing more granular quest difficulty and reward scaling.
- [Fix] Fixed ranged-only weapons (bows, crossbows) used in melee dealing full weapon damage instead of counting as unarmed strikes — melee hits with ranged weapons now use fist attack speed (4.0) and weapon level 0.
- [Fix] Fixed 1-shot protection using base max health instead of total max health (including skill bonuses), allowing players with armor skill health bonuses to still be one-shot in some cases.
- [Fix] Fixed wormhole code crashing on Paper servers when accessing Location.getWorld() for unloaded worlds — Paper throws IllegalArgumentException instead of returning null. All wormhole location access now catches this exception.
- [Fix] Fixed instanced dungeon kill objectives from one instance leaking into and completing objectives in other instances of the same dungeon — objectives now check instance identity before counting kills.
- [Fix] Fixed instanced dungeon kill objectives accumulating in the static listener list across runs, causing stale objectives to remain registered after dungeon completion or closure.
- [Fix] Fixed instanced dungeon completion check running even when the dungeon state isn't ONGOING, potentially triggering completion logic during cleanup.
- [Fix] Fixed players reviving in instanced dungeons teleporting into the banner block instead of on top of it, and not having their health restored.
- [Fix] Fixed quest objective names causing NullPointerException when the objective name is null — both chat progression messages and menu summary lines now safely handle null names.
- [Fix] Fixed quest reward item display name causing NullPointerException when the item has no custom display name — falls back to the material type name.
- [Fix] Fixed quest turn-in objective crashing when the NPC name is null.
- [Fix] Fixed quest dialog and Bedrock quest views showing color code artifacts — dialog text processing now fully strips color codes and collapses multi-line text into single lines for clean rendering.
- [Fix] Fixed quest inventory menu word-wrapping using a hardcoded 30-character width instead of the configured maxCharactersPerLine value.
- [Fix] Fixed quest inventory menu lore applying broken character-level word wrapping with color code tracking — replaced with simple line-per-entry rendering.
- [Fix] Fixed /em skillcheck output showing double plugin prefix by switching from Logger.sendMessage to Logger.sendSimpleMessage.
- [Fix] Fixed script SUMMON_ENTITY action crashing when getEntityClass() returns null for an EntityType, or when the location/world is null.
- [Fix] Fixed script SUMMON_ENTITY scheduling a removal task even when duration is 0, causing unnecessary timer overhead.
- [Fix] Fixed script SUMMON_ENTITY error messages not including the script filename, making debugging harder.
- [Fix] Fixed Welcome Quest referencing "Odigos" instead of the correct NPC names "Casus" and "Dux".
- [Fix] Fixed Invisibility power only applying at amplifier 3 instead of 5.
- [Tweak] Plugin initialization refactored to use MagmaCore's centralized PluginInitializationContext system — the progress bar, async/sync phasing, error handling, and shutdown cancellation are now managed by MagmaCore instead of being hand-rolled in EliteMobs. This prepares for multi-plugin initialization coordination.
- [Tweak] MagmaCore API calls updated to pass plugin instance (this) for multi-plugin support — affects MagmaCore.onEnable(), MagmaCore.shutdown(), MagmaCore.initializeImporter(), NightbreakContentManager.downloadAsync(), NightbreakContentManager.checkAccessAsync(), FirstTimeSetupMenu, and SetupMenu.
- [Tweak] EMPackage now implements NightbreakManagedContent interface for standardized content management.
- [Tweak] Teleport config keys migrated from teleportText/Hover/Command to teleportTextV2/HoverV2/CommandV2 to reset any user customizations that broke with the new dialog-aware teleport system.
- [Tweak] Updated MagmaCore dependency.
EliteMobs 10.0.3
- [Critical Fix] Fixed an error on startup some servers caused by the new translation system
Note: All officially supported languages have been fully translated for this release! To update your translations, set your server to English, delete the existing translation file and then switch to your intended language. EliteMobs 10.0.2
- [New] Admin initialization progress bar! Admins now see a boss bar during plugin startup showing exactly which initialization step is currently running and overall progress. Admins who join mid-initialization are automatically added to the bar.
- [New] Translatable skill type and bonus type display names! Skill names (Swords, Axes, Bows, etc.) and bonus types (Proc, Passive, Conditional, etc.) are now configurable in skill_bonus_menu.yml, enabling full localization of the skills system.
- [New] Translatable dungeon difficulty names! The difficulties list name field in content packages is now run through the translation system.
- [New] Translatable wormhole location text! location1Text and location2Text in wormhole configs are now translatable.
- [New] Translatable quest objective NPC names and locations! The npcName and location fields in custom quest objectives are now run through the translation system.
- [New] Menu item names and lore are now translatable! All ItemStackSerializer-based menu buttons (Buy/Sell, Scroll, Enchantment, Repair, Scrapper, Sell, Unbinder, Loot, Procedural/Custom Shop) now pass display names and lore through the translation system instead of only converting colors.
- [New] Flower pot interaction protection in dungeon worlds — flower pots and potted plants in EliteMobs worlds are now protected from player interaction, preventing decoration griefing.
- [Fix] Fixed translation system storing pre-converted color codes in CSV files — translators now see raw gradient/hex tags (e.g. <g:#FF0000:#00FF00>) instead of expanded control characters, making translations much more readable. The color conversion now happens at lookup time instead of at registration time.
- [Fix] Fixed Soulbind lore and Summon Merchant enchantment reading raw config values instead of using pre-loaded translatable fields — both now use the cached config values (SoulbindConfig.loreStrings, SummonMerchantConfig.message) that have already been through the translation system.
- [Fix] Fixed Soulbind config using duplicate translation key "name" for both loreStrings and hologramString — each now correctly uses its own key.
- [Fix] Fixed Elite Scroll converted items having broken lore — scrolls were appending scroll-specific lore on top of auto-generated elite item lore (which showed level 0 / prestige 0). Converted items now properly register enchantments, item source, and generate lore in the correct order.
- [Fix] Fixed Elite Scroll confirm button allowing players to click confirm when no output item was produced, potentially losing items.
- [Fix] Fixed loot dropped directly into player inventory being silently discarded when the inventory was full — all addItem() calls across loot tables, custom loot entries, repair menu, scrapper menu, and scroll drops now drop overflow items on the ground.
- [Fix] Fixed BossTrackingBar NullPointerException when the boss's world is unloaded or no longer loaded — all location accesses are now null-checked. The boss bar task also now cancels itself when the world is unavailable.
- [Fix] Fixed boss tracking bars leaking scheduler tasks on chunk/world unload — tracking bars are now properly removed when the boss is unloaded, and creating a new tracking bar removes the old one first.
- [Fix] Fixed script action repeating tasks continuing to run after the entity's world is unloaded, causing potential NPEs — tasks now check for null world and cancel gracefully.
- [Fix] Fixed combat level display entity detaching and floating when a player sleeps — the display is now removed on bed enter and re-created after waking up.
- [Fix] Fixed DialogObjective NullPointerException when a quest dialog list is null.
- [Fix] Fixed SpecialItemSystemsConfig attempting to resolve CustomItem references before custom items were loaded — enchantment book special loot entries are now lazily resolved on first access instead of during config initialization.
- [Fix] Fixed custom loot table entries silently dropping themselves from the loot pool when the referenced item wasn't loaded yet during initialization — entries with null items are now kept and resolved at drop time.
- [Fix] Fixed skill XP being granted even when the skill system is disabled — SkillXPHandler, SkillBonusEventHandler, and SkillBonusMenu now check SkillsConfig.isSkillSystemEnabled() before processing.
- [Fix] Fixed custom bosses that disable dropsEliteMobsLoot also preventing skill XP gain — the loot drop check was removed from the XP handler since skill XP and loot drops are independent systems.
- [Tweak] Content importer moved from sync to async initialization phase — heavy ZIP I/O during content import no longer blocks the main server thread.
- [Tweak] All dungeon/content package descriptions rewritten with richer formatting — descriptions now show the content type (Dynamic Lair, Dynamic Dungeon, Sanctum, etc.), boss encounter count via $bossCount placeholder, and a short thematic flavor text instead of the old "Difficulty: &4Dynamic content!" format.
- [Tweak] Updated MagmaCore dependency from 1.26-SNAPSHOT to 1.28-SNAPSHOT.
EliteMobs 10.0.1
- [New] Spanish & French translations have been fully remade and updated for EliteMobs 10! Other languages still processing. Did you know 10 years ago this would've cost €400,000 plus tax to do for all of them? Fun.
- [New] Armor skill health bonus toggle! New armorSkillHealthBonusEnabled option in skills.yml lets server owners disable the extra-hearts-per-armor-level mechanic entirely. A companion forceDefaultHealthWhenArmorSkillHealthBonusDisabled option can hard-reset players to vanilla 20 HP.
- [New] Skills page is now interactive — clicking a skill type on the player status screen opens the skill bonus selection menu for that weapon/armor category directly.
- [New] /em spawn elite command split — the base command now works cleanly as /em spawn elite
, while a separate /em spawn elite <powers...> variant handles power assignment. - [New] Item frame damage protection in dungeon worlds — item frames in EliteMobs worlds are now protected from player and projectile damage, not just interaction.
- [Fix] Resistance damage reduction config migrated to resistanceDamageMultiplierV2 with a new default of 0.2, matching vanilla behavior (Resistance I = 20% reduction, Resistance V = immunity). This should fix a bug where some players would become unkillable.
- [Tweak] Treasure chest loot in dynamic dungeons now scales to the dungeon's selected level instead of using the static chest tier. Outside of instances, scalable loot follows the opening player's gear level.
- [Tweak] Treasure chest mimics with dynamic level (-1) now scale to the dungeon's selected level in instances, or to the opening player's gear level in the overworld, instead of always using the static chest tier.
- [Tweak] Treasure chest restock timers are now pruned on access — expired entries are cleaned up and saved to disk automatically instead of accumulating indefinitely.
- [Tweak] Translation system now strips translatable keys from YAML config files when running a non-English locale, preventing English defaults from overwriting translated values on reload.
- [Tweak] Scroll Applier NPC relocated within the Adventurer's Guild.
- [Tweak] Disguised NPC name tag Y-offset adjusted from 1.55 to 2.30 for proper alignment.
- [Fix] Fixed all EliteMobs menu click handlers ignoring clicks that were pre-cancelled by other plugins — menus (Arena, Scroll, Enchantment, Loot, Scrapper, Skill Bonus) now process clicks regardless of prior cancellation state.
- [Fix] Fixed Elite Scroll menu allowing items to overwrite an already-occupied slot — scroll and non-elite item slots now check for emptiness before accepting a transfer.
- [Fix] Fixed Grim Reach, Long Reach, and Polearm Mastery attribute modifiers (reach range, attack speed) lingering on the player after deactivating the skill or switching weapons.
- [Fix] Fixed Grim Reach applying its reach bonus even when the skill was no longer active for the player.
- [Fix] Fixed skill bonus attribute modifiers persisting through plugin reloads — all online players now have their modifiers cleaned up during shutdown before the registry clears.
- [Fix] Fixed skill selection data being case-sensitive — skill IDs are now normalized to lowercase, and stale/disabled/duplicate entries are automatically sanitized from saved selections.
- [Fix] Fixed quest inventory menu rendering raw component internals instead of readable text in additional locations — switched remaining getText() calls to toPlainText().
- [Fix] Fixed database writes silently failing during plugin shutdown — setDatabaseValue now falls back to synchronous execution when the plugin is disabled and async tasks cannot be scheduled.
- [Fix] Fixed ConcurrentModificationException in wormhole tick loop when wormhole entries were modified during iteration.
- [Fix] Fixed treasure chest cooldown display showing incorrect remaining time — getPlayerCooldown now returns the current epoch when no entry exists instead of 0.
- [Fix] Fixed treasure chest cooldown display potentially showing negative time values.
- [Fix] Fixed mimic spawn silently failing without warning when the configured custom boss was not found.
- [Fix] Fixed armor skill health calculation in elite mob damage formula being duplicated — now uses the centralized getConfiguredMaxHealthForArmorLevel() method that respects the new toggle.
EliteMobs 10.0.0
- [New] Complete combat formula redesign! The entire damage system has been rebuilt from scratch using pure formula-based architecture. Both offensive (player to elite) and defensive (elite to player) damage calculations are now symmetric, level-consistent, and predictable. Players survive ~5 hits from same-level content and kill a standard elite in ~3 sword hits at ALL levels — whether you're level 5 or level 100. The old hybrid vanilla+exponential system is gone.
- [New] Exponential level scaling! Mob HP now scales exponentially with level (+5 levels = exactly 2x HP), and player damage scales to match. This replaces the old damage modifier system and makes combat feel consistent across all level ranges.
- [New] Equal DPS across all weapon types! Swords, axes, hoes, bows, crossbows, tridents, maces, and spears now all have identical time-to-kill (~1.875 sec) at matched combat, regardless of attack speed differences. No more "best weapon type" — play what you enjoy.
- [New] Vanilla armor now actually matters! ArmorDefenseCalculator unifies both elite and vanilla armor into a single gear score. Damage-type-aware enchantments now work properly too — Projectile Protection reduces arrow damage, Blast Protection reduces explosion damage, etc.
- [New] Arrow combat data is now stored in the projectile at launch time, preventing the classic weapon-switch exploit where players fire an arrow with a strong bow then swap weapons before impact.
- [New] Per-weapon skill leveling system! Each weapon type (swords, axes, hoes, bows, crossbows, tridents, maces, spears) and armor now has its own skill level that increases with use. Skills unlock passive and active bonuses as you level them up, adding real RPG progression to combat.
- [New] Passive weapon-switch skill effects! Skills like Swift Strikes (speed), Poise (knockback resist), Flurry (attack speed), Grim Reach (interaction range), Long Reach, and Polearm Mastery now automatically apply/remove their attribute modifiers when you switch weapons, encouraging diverse playstyles.
- [New] Skill action bar notifications! When skills activate, proc, or stack, players see configurable action bar messages so they know what's happening in combat.
- [New] Skills page in the Player Status Screen! The /em status book and Bedrock dialog now include a dedicated Skills page showing all skill types with levels, XP progress bars, and formatted XP counts.
- [New] Armor Skill Health Bonus — players gain +1 heart (2 HP) per Armor skill level above 1, giving tankier players a meaningful health advantage.
- [New] Template-driven skill lore system — skill descriptions now use config-driven templates with placeholder support, enabling full translation of all skill descriptions.
- [New] Maces & Spears added to EliteMobs! Full weapon types with their own skill trees, leveling, procedural drops, and passive bonuses. Includes VortexThrustSkill for spears (pulls enemies toward your target location with Slowness II and visual effects).
- [New] All Lairs, Minidungeons, and Story Mode Dungeons converted to Dynamic Dungeons! Beast's Sanctuary, Fireworks, Hallosseum, Knight's Castle, Catacombs, Colosseum, Dark Spire, Invasion, North Pole, Airship, The Ruins, Yggdrasil, and all 13 Story Mode dungeons now scale to player level.
- [New] 3-difficulty system for all Dynamic Dungeons: Normal (+5 level sync), Hard (+0 level sync), and Mythic (-5 level sync) with 24-hour lockout timers. Pick your challenge.
- [New] NPC Teleporters for Dynamic Dungeons! 18+ new teleporter NPCs replace wormholes in the Adventurer's Guild for cleaner navigation. Just talk to the NPC and pick your difficulty.
- [New] Gambling System! Complete casino experience in the Adventurer's Guild with Blackjack (hit, stand, double down), Coin Flip (50/50 with a rare edge-landing jackpot), Higher/Lower (streak multipliers), and Slot Machine (animated spins with jackpots). Includes a full betting menu, Debt Collector boss that hunts players who owe the casino, and a Gambling Den Owner NPC that displays house earnings.
- [New] Arrow Shop and Fletcher NPC for purchasing arrows with elite currency.
- [New] In-game content management via your Nightbreak account! Link your account with /nightbreaklogin and install or update all your content without ever leaving the game.
- [New] /em downloadall command — bulk-downloads all available content packages you have access to. Downloads sequentially with live progress messages, deduplicates automatically, and gracefully continues even if you disconnect mid-process.
- [New] /em updatecontent command — same as downloadall but only targets outdated packages, making it easy to keep everything current with one command.
- [New] Download All button in /em setup! A dynamic button at the end of the content list that detects your content state — shows exact counts of new and outdated packages, and handles everything in one click.
- [New] Nightbreak API integration for content version checking, enabling accurate update notifications for all content packages.
- [New] Quest Lockout system! Quests can now have a configurable lockout period (in minutes) after completion, preventing players from immediately re-accepting the same quest. Configure per-quest via questLockoutMinutes.
- [New] Interactive language selector on first login! Players see 20 supported languages as clickable buttons in chat. The player's client locale is auto-detected and the matching language is highlighted, making localization setup effortless.
- [New] Massive localization push — virtually every hardcoded string in the plugin has been externalized to config files. CommandMessagesConfig (100+ command messages), InitializeConfig (setup/login flow), GamblingConfig (all casino text), DungeonsConfig (content package messages), PlayerStatusMenuConfig (status screen text), StaticItemNamesConfig (~400 item names), and more. EliteMobs is now fully translatable.
- [New] Packet-based FakeText and FakeItem systems! Boss health displays, combat level indicators, NPC chat bubbles, wormhole labels, dialog text, loot shower coins, and more now use lightweight packet-based entities instead of real TextDisplay/Item entities, significantly improving performance.
- [New] Three-phase async-safe plugin initialization! Config file I/O now happens off the main thread, with entity spawning and Bukkit API calls on the sync thread. This significantly reduces server startup blocking.
- [New] EliteMobsInitializedEvent and PluginState enum allow external plugins to check EliteMobs readiness and hook into the initialization lifecycle.
- [New] K/M/B/T number formatting for boss health displays and damage popups — large numbers now show as "1.5M" instead of "1500000".
- [New] Color gradients for pretty much all EliteMobs text! A lot of default content has been restyled to use the expanded color palette with gradient support.
- [New] Script placeholder support! MESSAGE, TITLE_MESSAGE, ACTION_BAR_MESSAGE, and BOSS_BAR_MESSAGE script actions now support $playerName, $playerX/Y/Z, $bossName, $bossX/Y/Z, $bossLevel, and $bossWorldName placeholders.
- [New] Wormholes can now use custom models instead of particles/wireframe. Added models for Primis, Oasis, and the Adventurer's Guild spawn portal.
- [New] Wormhole setup hints for OPs — when a destination isn't configured, OPs see a helpful message with the exact command to run.
- [New] Configurable flight toggle prevention in dungeons (preventFlyToggleInDungeons in CombatTag.yml).
- [New] DungeonProtector now prevents container access, fence gate interaction, dragon egg interaction, and armor stand/item frame manipulation in protected EliteMobs worlds.
- [New] Farming Protection toggle — server owners can now disable the farming protection system entirely via enableFarmingProtection in AntiExploit.yml.
- [New] PlaceholderAPI placeholders for all skill levels and combat level in Roman numerals.
- [New] NPC custom model click handlers — NPCs with FreeMinecraftModels now properly respond to click interactions.
- [New] EXP popup text to make XP gains nicer and easier to track.
- [New] Potion effect protection — if a potion effect is already active on a player, item-based effects will no longer override it and potentially shorten the duration.
- [Tweak] Item name generation completely redesigned — the old procedural system (noun+adjective+verb templates) has been replaced by ~400 curated static names per weapon/armor type, producing more thematic and higher-quality item names.
- [Tweak] Gear reduction curve: 0-50% damage reduction below matching gear, 50-75% above matching (capped at +10 levels above mob). Naked players take 2x damage, peak gear players take 0.5x.
- [Tweak] Weapon adjustment curve: 50% damage with no weapon, 100% at matching level, up to 125% at +10 levels above mob (capped).
- [Tweak] Skill bonus stacking changed from multiplicative to additive, preventing exponential stacking abuse with multiple damage skills.
- [Tweak] Enchantment damage bonus changed from flat value to multiplicative percentage (2.5% per elite enchant level above vanilla max).
- [Tweak] Sweep attacks now deal 25% of primary target damage to nearby enemies.
- [Tweak] Thorns damage is now formula-based (baseDamage x thornsLevel x 2%), scaling properly with mob level instead of being flat.
- [Tweak] ProceduralShopMenu now generates items based on your skill level for each item type instead of random tiers, and enforces gear restrictions before purchase.
- [Tweak] Skill level-up notifications now show a title, play a sound, spawn particles, and broadcast a server-wide announcement.
- [Tweak] DynamicQuests now adapt to dungeon level when players enter dynamic dungeons — quest objectives update to match selected difficulty.
- [Tweak] Setup menu completely redesigned with three clear presets: "Recommended" (green, full install), "Content-Only" (yellow, no natural spawning), and "No Progression" (red, disables skills and loot). Post-setup messages guide players through the Nightbreak account workflow.
- [Tweak] All URLs throughout the plugin are now clickable with hover tooltips instead of raw text.
- [Tweak] All separator lines across the plugin updated to gradient-colored styling for a cleaner look.
- [Tweak] NPC role displays, wormhole text, and Gambling Den earnings display now use TextDisplay entities instead of invisible ArmorStands.
- [Tweak] Quick Reload skill (Crossbows) redesigned — now grants a brief movement speed boost after hitting an enemy instead of attack speed (which had no effect on crossbow reload).
- [Tweak] Reactive Shielding trigger threshold reduced from 20% to 10% of max health.
- [Tweak] Config key standardization — dozens of YAML keys across many config files migrated from "Human Readable Keys" to camelCase for consistency.
- [Tweak] Updated FreeMinecraftModels, EasyMinecraftGoals, and MagmaCore to latest versions.
- [Fix] Tons of bug fixes across combat, dungeons, skills, instanced content, displays, menus, version checking, and content management. Too many to list individually — if something was broken in 9.x, it's probably fixed now.
- [Removal] Removed Guild Rank system entirely.
- [Removal] Removed TOGGLE skill type and all toggle-based skills (Blade Dance, Reckless Fury, Dread Aura).
- [Removal] Removed old procedural item name generation system — replaced by curated static name lists.
- [Removal] Removed default events package.
- [Removal] Removed 20+ wormhole configs replaced by NPC teleporters.
- [Removal] Removed ShadowOfTheBinderOfWorldsLair (consolidated with Binder of Worlds Sanctum).
- [Removal] Removed several unused sound files, custom model icons, and many obsolete config fields across DefaultConfig, MobCombatSettingsConfig, SkillsConfig, QuestsConfig, EconomySettingsConfig, and menu configs.
EliteMobs 10.0.0-SNAPSHOT-10 (Release Candidate 1)
- [New] Download All button in /em setup! A new dynamic button appears at the end of the content list that automatically detects your content state — shows a red cross if no Nightbreak token is linked, a yellow crown if content is available to download or has pending updates, and a green checkmark when everything is installed and up to date. One click downloads or updates all your content at once.
- [New] /em downloadall command — bulk-downloads all available content packages you have access to via your Nightbreak account. Downloads sequentially with live progress messages, deduplicates by Nightbreak slug, auto-reloads the plugin when finished, and gracefully continues downloads even if the player disconnects mid-process.
- [New] /em updatecontent command — same as downloadall but only targets outdated packages, making it easy to keep all your content current with one command.
- [New] It is now possible to install & update content from in-game using your Nightbreak account!
- [New] Complete combat formula redesign! Damage is now calculated using pure formula-based architecture instead of the old hybrid vanilla+exponential system. Both offensive (player→elite) and defensive (elite→player) formulas are now symmetric, level-consistent, and fully documented.
- [New] ArmorDefenseCalculator - centralized defense calculation that unifies both elite and vanilla armor into a single gear score. Vanilla armor now actually matters for damage reduction! Damage-type-aware enchantments now work properly (Projectile Protection reduces arrow damage, Blast Protection reduces explosion damage, etc.).
- [New] WeaponOffenseCalculator - centralized offense calculation that normalizes DPS across all weapon types. Swords, axes, hoes, bows, crossbows, tridents, maces, and spears now all have identical time-to-kill when matched, regardless of attack speed differences.
- [New] Arrow combat data is now stored in projectile persistent data at launch time (weapon level, skill type, skill level, damage multiplier), preventing weapon-switch exploits where players could fire an arrow with a strong bow then swap to a different weapon before impact.
- [New] Thorns damage is now formula-based (baseDamage x thornsLevel x 2%), scaling properly with mob level instead of being flat.
- [New] Three-phase async-safe plugin initialization! Config file I/O now happens off the main thread, with entity spawning and Bukkit API calls happening on the sync thread. This significantly reduces server startup blocking.
- [New] PluginState enum (UNINITIALIZED, INITIALIZING, INITIALIZED) allows external plugins to check EliteMobs readiness status via MetadataHandler.pluginState.
- [New] EliteMobsInitializedEvent - custom Bukkit event fired when EliteMobs fully initializes, allowing other plugins to hook into the initialization lifecycle.
- [New] Quest Lockout system! Quests can now have a configurable lockout period (in minutes) after completion, preventing players from immediately re-accepting the same quest. Lockout time is displayed via subtitle and chat message. Configure per-quest via questLockoutMinutes in quest config files. Lockout data is persisted in the player database and expired lockouts are automatically cleaned up on load/save.
- [New] Skills page in the Player Status Screen! The /em status book and Bedrock dialog now include a dedicated Skills page showing all skill types with levels, XP progress bars, and formatted XP counts. Accessible from the cover page index.
- [New] CommandMessagesConfig - all command output messages (100+ strings across 25+ categories) are now centralized in command_messages.yml instead of being hardcoded throughout the codebase, enabling full localization of command messages.
- [New] StaticItemNamesConfig - all procedurally-generated item display names (~400 unique names across all weapon and armor types) are now configurable in ItemNames.yml, including new name lists for maces and spears.
- [New] LootMenuConfig for configurable loot voting/need-greed menu display text.
- [New] VortexThrustSkill for Spears (Tier 2) - replaces Skewer. Pulls nearby enemies toward your target location, applies Slowness II, with visual effects (Evoker sound + portal particles).
- [New] Weapon-switch passive skill effects! Skills like Swift Strikes (speed), Poise (knockback resist), Flurry (attack speed), Grim Reach (interaction range), Long Reach, and Polearm Mastery now automatically apply/remove their attribute modifiers when switching weapons.
- [New] Skill action bar notifications with configurable format for skill activations and stack counts.
- [New] Template-driven skill lore system - skill descriptions now use config-driven loreTemplates and formattedBonusTemplate with placeholder support, enabling translation of all skill descriptions.
- [New] TestStrategy enum for skills (PROC_COUNT, ATTRIBUTE_CHECK, CONDITION_SETUP) enabling more accurate automated skill testing.
- [New] GamblingDisplay utility class consolidating shared sound, message, and validation logic across all gambling games.
- [New] GamblingSession base class for gambling game state tracking.
- [New] Added maces & spears to EliteMobs, as well as leveling those up as skills, adding drops for them & more!
- [New] WormholePlayerListener - clears wormhole wireframe BlockDisplay entities when players change worlds or disconnect, preventing visual ghosting/stacking.
- [New] Added custom model data entries and icons for setup menu content states (checkmark, red cross, yellow crown).
- [Tweak] Item name generation completely redesigned - the old procedural system (noun+adjective+verb templates) has been replaced by curated static name lists per weapon/armor type, producing more thematic and higher-quality item names.
- [Tweak] Combat formula: players now survive ~5 hits from same-level content and ~3 sword hits to kill a standard elite at ALL levels (level-consistent). This is true whether you're level 5 or level 100.
- [Tweak] Equal DPS across all weapon types - sword, axe, hoe, bow, etc. all have identical time-to-kill (~1.875 sec) at matched combat, achieved via attack speed normalization.
- [Tweak] Gear reduction curve: 0-50% below matching gear, 50-75% above matching (capped at +10 levels above mob). Naked players take 2x damage, peak gear players take 0.5x damage.
- [Tweak] Weapon adjustment curve: 50% damage with no weapon, 100% at matching level, up to 125% at +10 levels above mob (capped).
- [Tweak] Skill bonus stacking changed from multiplicative to additive, preventing exponential stacking abuse with multiple damage skills.
- [Tweak] Enchantment damage bonus changed from flat value to multiplicative percentage (2.5% per elite enchant level above vanilla max).
- [Tweak] Sweep attacks now deal 25% of primary target damage to nearby enemies.
- [Tweak] Exponential skill scaling: every 7.5 skill level difference = 2x damage multiplier in both offensive and defensive formulas.
- [Tweak] All static skill system collections (cooldowns, stacks, registry, selections) migrated to ConcurrentHashMap for thread safety during concurrent event processing and plugin reloads.
- [Tweak] Skill config values now capped at 10.0 maximum to prevent unbounded scaling overflow.
- [Tweak] SkillBonusConfigFields now has a fallback constructor for orphaned/user-created config files.
- [Tweak] Resource pack asset paths reorganized: items/equipment/ renamed to items/gear/, models/equipment/ renamed to models/gear/.
- [Tweak] UI icon grayX.json renamed to gray_x.json for naming consistency.
- [Tweak] Removed embedded pack.mcmeta and pack.png from em_rsp_defaults — resource pack metadata is now managed externally.
- [Tweak] All command messages across the entire plugin now use configurable strings from CommandMessagesConfig with placeholder support ($player, $amount, $questName, $time, etc.).
- [Tweak] All gambling messages (debt collector dialogue, blackjack labels, game results, house earnings display) externalized to GamblingConfig for full localization.
- [Tweak] All enchantment challenge messages (no challenge installed, success, failure, critical failure) externalized to DungeonsConfig.
- [Tweak] All loot preview labels (command, currency, chance, amount) externalized to StaticItemNamesConfig.
- [Tweak] All status screen text (dialog titles, skills page, quests page, back button, skill item display) externalized to PlayerStatusMenuConfig for localization.
- [Tweak] Farming protection warning and reset messages externalized to CommandMessagesConfig.
- [Tweak] All dungeon/content package status messages (installed, not installed, download prompts, access info, lockout notifications) externalized to DungeonsConfig.
- [Tweak] Version notification messages (outdated content, connection warnings, auto-update prompts) externalized to CommandMessagesConfig.
- [Tweak] Plugin initialization now gracefully handles server shutdown during async loading phase via shutdownRequested flag.
- [Tweak] Plugin initialization failures now properly set state to UNINITIALIZED with error logging instead of leaving the plugin in a broken state.
- [Tweak] API error messages now include the URL that caused the error, making it much easier to identify which content is failing.
- [Tweak] Failed access prefetches now log a single summary line listing all failed slugs instead of spamming individual errors.
- [Tweak] Updated MagmaCore with API error logging improvements and spear material compatibility.
- [Tweak] Updated Nightbreak account service to cache user access summaries for 5 minutes, preventing concurrent requests from hammering the Patreon API.
- [Tweak] Removed redundant ChatColorConverter.convert() calls throughout item lore, loot shower, teleports page, and status screen — config values are now pre-converted at load time.
- [Fix] Fixed vanilla armor being completely ignored in elite damage calculations - it now properly contributes to the gear score and damage reduction.
- [Fix] Fixed inconsistent vanilla damage contribution across levels (was 88% at Lv5, 32% at Lv25 - now 0%, fully replaced by formula).
- [Fix] Fixed damage inconsistency where hit counts to kill varied across different levels despite being at matched combat.
- [Fix] Fixed weapon-switch exploit for ranged attacks where players could swap weapons between firing and impact to manipulate damage calculations.
- [Fix] Fixed potential gambling double-payout exploit - game outcomes are now resolved idempotently via a central resolveOutcome() method with unresolved-game tracking.
- [Fix] Fixed potential race conditions in skill bonus event handler, registry, and player skill selection during concurrent access.
- [Fix] Fixed wormhole wireframe BlockDisplay entities accumulating when players change worlds or reconnect.
- [Fix] Fixed ConcurrentModificationException crash during content version checking caused by async threads iterating the packages HashMap during plugin reload.
- [Fix] Fixed setup menu spamming the Nightbreak API on every open - content and access checks are now throttled to once per 5 minutes.
- [Fix] Fixed duplicate API calls during access prefetch - packages sharing the same Nightbreak slug (e.g. Story Mode Dungeons) are now only checked once and the result is shared.
- [Fix] Fixed spear material warnings spamming the console on Minecraft versions that don't have spears yet.
- [Fix] Several fixes for dungeons.
- [Fix] Fixed bug that would cause music to sometimes not play for instanced content.
- [Removal] Removed TOGGLE skill type entirely - all toggle-based skills have been redesigned or removed.
- [Removal] Removed ToggleSkill interface.
- [Removal] Removed Blade Dance skill (Swords Tier 4) - toggle dodge/damage tradeoff.
- [Removal] Removed Reckless Fury skill (Axes Tier 3) - toggle damage/defense tradeoff.
- [Removal] Removed Dread Aura skill (Hoes Tier 3) - toggle aura that weakened enemies.
- [Removal] Removed Skewer skill (Spears Tier 2) - replaced by Vortex Thrust.
- [Removal] Removed CombatSystem 50/50 skill/item contribution ratio system (replaced by separate multiplicative formula layers).
- [Removal] Removed pre-compensation damage logic (BASE_PLAYER_DPS, EXPECTED_GEAR_DAMAGE_MULTIPLIER, etc.).
- [Removal] Removed old procedural name generation system (noun/adjective/verb/verber templates and nameFormat from ProceduralItemGenerationSettingsConfig) - replaced by static curated name lists.
- [Removal] Removed several unused sound files (dark cathedral ambient/fight, nether bell soundtrack, void bell sounds).
EliteMobs 10.0.0-SNAPSHOT-9 (BETA 5)
- [New] It is now possible to install & update content from in-game using your Nightbreak account!
- [New] EliteMobs now offloads a singificant portion of loading an reloading to async, making booting considerably faster, and lowering the disruption of EliteMobs reloads down to nearly nothing.
- [New] Added maces & spears to EliteMobs, as well as leveling those up as skills, adding drops for them & more!
- [New] Added new icons and images for skills menus and em setup
- [Fix] Fixed ConcurrentModificationException crash during content version checking caused by async threads iterating the packages HashMap during plugin reload.
- [Fix] Fixed setup menu spamming the Nightbreak API on every open - content and access checks are now throttled to once per 5 minutes.
- [Fix] Fixed duplicate API calls during access prefetch - packages sharing the same Nightbreak slug (e.g. Story Mode Dungeons) are now only checked once and the result is shared.
- [Fix] Fixed spear material warnings spamming the console on Minecraft versions that don't have spears yet.
- [Fix] Several fixes for dungeons
- [Fix] Fixed bug that would cause music to sometimes not play for instanced content
- [Tweak] API error messages now include the URL that caused the error, making it much easier to identify which content is failing.
- [Tweak] Failed access prefetches now log a single summary line listing all failed slugs instead of spamming individual errors.
- [Tweak] Updated MagmaCore with API error logging improvements and spear material compatibility.
- [Tweak] Updated Nightbreak account service to cache user access summaries for 5 minutes, preventing concurrent requests from hammering the Patreon API.
EliteMobs 10.0.0-SNAPSHOT-8 (BETA 4)
- [New] Wormholes can now use models instead of particles/wireframe, added models for Primis, Oasis and the wormhole at the AG spawn
- [Fix] Properly added diamond league arena teleport
- [Removal] Moved wood league arena files from plugin defaults to the Adventurer's Guild package
- [Removal] Removed all default events
EliteMobs 10.0.0-SNAPSHOT-7 (BETA 3)
- [New] Added exp popup text to make it nicer and easier to track
- [New] Added $playerName placeholder that will extract the player name, as opposed to $player which displays the display name as it features in-game
- [New] If a potion effect is present on a player, item-based potion effects will no longer override that effect (and potentially shorten the duration if players switch out from it)
- [New] You can now do color gradients for pretty much all elitemobs text
- [New] A lot of default EliteMobs content has been restyled to use the expanded color palette
- [Fix] Fixed longstanding bug where instanced worlds would not get unloaded/deleted properly
- [Fix] Fixed bugs related to scripts getting very upset when worlds unloaded
- [Fix] Fixed the new version checking system not being able to check some content
- [Fix] Fixed issue where players would not be able to set their skills with the guild greeter
- [Fix] Fixed issue where players could mess with armor stands / item frames in locations protected by elitemobs dungeon protection
- [Fix] Fixed issue where uninstalling content would not persist through restarts
- [Fix] Fixed issue where sometimes health bars for bosses wouldn't show
- [Fix] Fixed a bug where the meteor shower enchant would cause items to be deleted incorrectly
- [Fix] Fixed bug with dialog-based /em menu
- [Update] Updated EasyMinecraftGoals version
EliteMobs 10.0.0-SNAPSHOT-6 (BETA 2)
- [New] Story Mode Dungeons are now fully updated for EliteMobs 10
- [Fix] Fixed Yggdrasil file corruption on the Nightbreak platform
- [Fix] Fixed error when using /em
- [Fix] Fixed coin drops erroring on any version other than 1.21.4
- [Fix] Fixed certain types of displays not working on versions that weren't 1.21.4 (such as combat level)
- [Fix] Fixed the custom shop menu using the wrong ui skin
EliteMobs 10.0.0-SNAPSHOT-5 (BETA 1)
EliteMobs 10 is a very substantial rewrite of EliteMobs. The old Guild Rank system has been completely replaced with a deep Skill System featuring 70+ unique abilities across 7 weapon categories. Almost every dungeon now scales to player level with three difficulty tiers. Combat math has been rewritten with exponential scaling for more intuitive difficulty curves. I even added gambling.
Beware: Testing has been done for lower level content, and the feedback is universally that this is much better than EliteMobs 9. However, things will be actively rebalanced based on feedback, and high level content is unlikely to be balanced as of right now. That being said, it should take a least 6 months of nonstop playing to start really seeing big problems, and I should be patching this on at least a weekly basis, with the full EM 10 release coming out hopefully in just a few weeks of tweaks. Some big systems are half implemented, like the ability to update and download dungeons from in game, and some are still planned to come out later in the lifecycle, like classes and custom item scripting.
The Skill System
The Guild Rank system is gone. In its place is a comprehensive skill system where players level up individual weapon categories by using them in combat.
Skill Categories
- Swords - 11 skill bonuses
- Axes - 7 skill bonuses
- Bows - 10 skill bonuses
- Crossbows - 8 skill bonuses
- Tridents - 10 skill bonuses
- Hoes (Scythes) - 11 skill bonuses
- Armor - 10 skill bonuses
Each category levels independently. Use a sword, gain sword XP. Wear armor while taking hits, gain armor XP. Your Combat Level is calculated from all skill levels combined and displays above your head.
Skill Bonuses (70+ Total)
As you level each category, you unlock skill bonuses - special abilities that activate during combat. Examples include:
- Blade Dance (Swords) - Chance to strike all nearby enemies
- Executioner (Axes) - Bonus damage against low-health targets
- Multishot (Bows) - Fire additional arrows
- Explosive Tip (Crossbows) - Bolts explode on impact
- Storm Caller (Tridents) - Summon lightning on hit
- Soul Siphon (Hoes) - Drain health from enemies
- Last Stand (Armor) - Survive a killing blow once per combat
Skill bonuses use different activation mechanics:
- Proc skills - Chance-based activation on hit
- Cooldown skills - Powerful effects with timers
- Stacking skills - Build power over multiple hits
- Conditional skills - Activate when specific conditions are met
Skill Commands
- /em skillcheck
- View skill levels - /em skillset
- Set a specific skill - /em skillsetall
- Set all skills
Dynamic Dungeons
Every lair, minidungeon, and story mode dungeon has been converted to a Dynamic Dungeon that scales to player level.
Converted Content
Lairs & Minidungeons: Beast's Sanctuary, Fireworks, Hallosseum, Knight's Castle, Catacombs, Colosseum, Dark Cathedral, Dark Spire, Invasion, North Pole, Airship, Pirate Ship, Sewers, Steamworks, The Ruins, Under Grove, Vampire Manor, Yggdrasil
Story Mode: The Bridge, The Cave, The City, The Climb, The Deep Mines, The Mines, The Nether Bell, The Nether Wastes, The Palace, The Quarry, Bone Monastery, Craftenmines Lab, Frost Palace
Three Difficulty Tiers
Each dungeon offers three difficulties with different level sync values:
- Normal (+5 level sync) - Enemies 5 levels below you
- Hard (+0 level sync) - Enemies match your level
- Mythic (-5 level sync) - Enemies 5 levels above you
All difficulties have a 24-hour lockout timer after completion.
NPC Teleporters
Wormholes have been removed from the Adventurer's Guild. In their place, teleporter NPCs provide quick access to each dungeon with custom models and cleaner navigation.
Combat Overhaul
Exponential Scaling
Combat math now uses exponential scaling instead of linear modifiers:
- Every +5 levels = exactly 2x HP (works consistently at all level ranges)
- Player damage scales exponentially to match
- Same-level combat feels identical whether you're level 25 or level 100
Damage Formula
Boss damage has been completely rewritten:
- Calculated based on player's armor skill level and max health
- Pre-compensates for expected gear and skill reductions
- Target: ~5 hits to kill at same level, ~2 hits at +10 levels above
Armor Skill Health Bonus
Players gain +1 heart (2 HP) per Armor skill level above 1, applied via attribute modifiers.
Number Formatting
Large numbers now display with K/M/B/T suffixes. "1,500,000" becomes "1.5M" in health bars and damage popups.
Gambling System
A complete casino experience has been added to EliteMobs.
Games
- Blackjack - Standard casino rules with hit, stand, and double down
- Coin Flip - Quick 50/50 bets with configurable payouts
- Higher/Lower - Card guessing with streak multipliers
- Slot Machine - Spinning reels with configurable symbols and jackpots
Economy & Debt
- BettingMenu - Select bet amounts before each game
- GamblingEconomyHandler - Tracks transactions, debt, and house earnings
- Gambling Den Owner - NPC displays total house earnings via floating text
- Debt Collector - Boss that spawns to hunt players who owe the casino money
NPCs
- Blackjack Dealer
- Card Shark (Higher/Lower)
- Coin Flipper
- Slot Machine Operator
- Gambling Den Owner
Configuration
GamblingConfig controls bet limits, payout multipliers, debt collector spawn chance/cooldown/timeout, and all game parameters.
Permission: elitemobs.gambling.npc
Arrow Shop
New Fletcher NPC sells arrows for elite currency.
Permission: elitemobs.shop.arrow.npc
Script Placeholders
Boss scripts now support dynamic placeholders in MESSAGE, TITLE_MESSAGE, ACTION_BAR_MESSAGE, and BOSS_BAR_MESSAGE actions:
- $playerName - Player who triggered the event
- $playerX, $playerY, $playerZ - Player coordinates
- $bossName - Boss display name
- $bossX, $bossY, $bossZ - Boss coordinates
- $bossLevel - Boss level
- $bossWorldName - World name
- $targetName - Per-target replacement for RUN_COMMAND_AS_PLAYER
Performance Improvements
Packet-Based Displays
Text and item displays now use packet-based systems that don't spawn real entities:
- FakeText - Boss health bars, damage popups, combat level displays, NPC chat bubbles, dialog text, wormhole labels, resurrection banners
- FakeItem - Loot shower currency coins, Gold Explosion/Gold Shotgun projectiles
Benefits: Better performance, coins can't be stolen by hoppers, displays are player-specific where appropriate.
TextDisplay Migration
NPC role displays, wormhole text, and gambling displays now use proper TextDisplay entities instead of invisible ArmorStands for cleaner rendering.
Dungeon Protection
DungeonProtector has been expanded to prevent:
- Container access (chests, barrels, shulker boxes)
- Dragon egg interaction
- Fence gate interaction
- Flight toggle (configurable via preventFlyToggleInDungeons in CombatTag.yml)
PlaceholderAPI Integration
New placeholders for all skill levels:
- %elitemobs_player_swords_level%
- %elitemobs_player_axes_level%
- %elitemobs_player_bows_level%
- %elitemobs_player_crossbows_level%
- %elitemobs_player_tridents_level%
- %elitemobs_player_hoes_level%
- %elitemobs_player_armor_level%
- %elitemobs_player_combat_level_roman%
Shop Improvements
- ProceduralShopMenu now generates items based on player's skill level for each item type
- Items spawn between (skillLevel - 5) and skillLevel instead of random tiers
- Gear restrictions enforced before purchase - can't buy items you can't use
- Hoes added to procedural item generation
Quality of Life
- Skill level-up notifications show title, play CHALLENGE_COMPLETE sound, spawn TOTEM_OF_UNDYING particles, and broadcast server-wide
- /em gettier now sets all skill levels to match and includes trident in test gear
- Training dummies at levels 1, 25, 50, 75, and 100 for testing builds
- DynamicQuests adapt objectives when entering dynamic dungeons
- Items store elite level in persistent data for faster lookups
Version Checking
Content version checking now uses the Nightbreak API (nightbreak.io) with per-package slug tracking for more reliable update notifications.
Bug Fixes
- Instance teleport blocking now only affects players in that instance
- Spectators can no longer teleport out of instances via vanilla menu
- Resistance potion effect applies as percentage multiplier correctly
- Health display updates delay 1 tick so damage applies first
- Skill bonus multipliers skip non-damage skills correctly
- Script $playerName references the triggering player, not the boss
- Translation system handles camelCase language names properly
- NPCs with custom models route interactions correctly
Removed
- Guild Rank System - Completely replaced by Skills
- ShadowOfTheBinderOfWorldsLair - Consolidated with Binder of Worlds Sanctum
- 20 Wormhole Configs - Replaced by NPC teleporters
- Default Events Package - Disabled, marked for removal
Dependencies
- Java 21 required
- MagmaCore 1.24-SNAPSHOT
- EasyMinecraftGoals 1.19.23
- FreeMinecraftModels 2.3.17
Migration Notes
This is a major version with breaking changes:
- Guild Ranks are gone - Player progression data will need to be considered. The new skill system starts fresh.
- Wormholes removed - If you had custom wormhole configurations pointing to default dungeons, they may need updating.
- Java 21 required - Update your server runtime if needed.
This is a beta release. Please report issues on Discord.
EliteMobs 9.6.3
- [Critical Fix] Key fixes to translations
- [Critical Fix] Key fixes to papermc compatibility

