[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 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).