elitemobs-6.0.0.jar
Curse Maven Snippet
What's new
Changelog — Elite Mobs 2: The Sequel of Dante's Inferno
6.0.0 (this session, built on top of EliteMobs 5.1.1)
Architecture
- Decompiled the original mod (only
.classfiles were provided, no sources) and set up a real, compilable Gradle/NeoForge 1.21.1 project. EliteMobManager(809 lines, did everything) was split into:spawn/EliteSpawner— stateless elite creation/scaling/gear/naming.bosses/LuciferEncounter— Lucifer's phases, mechanics and death sequence.affixes/*— affix framework (previously a singleenum+switch).loot/EliteLootTable— rewards and kill message.EliteMobManager— thin orchestrator (~230 lines): boss bars, loot context, dispatching the two tick loops.
- New
stats/StatModifierSet: additive/multiplicative modifier stack with a documented application order, used throughout health/damage/speed scaling.
Affix system
- Converted from a closed
enumto an open framework: anAffixinterface with hooks (onSpawn,onTick,onDealDamage,onTakeDamage) +AffixRegistry+AffixState(generic, reusable cooldowns and one-shot flags). - Adding a new affix no longer touches any existing file: one class in
affixes/impl+ one line in the registry. - 3 new affixes with real behavior:
- Regenerating — a one-time "second wind" (regeneration + resistance) the first time it drops below 50% health.
- Shielded — periodically recharges an absorption shield.
- Reflective — reflects 25% of melee damage taken back at the attacker (with a re-entrancy guard so two Reflective elites hitting each other can't loop forever).
Lucifer encounter
- Telegraphing added (didn't exist before — a fairness requirement of the
design):
- Meteors: mark their impact point with flame particles and a warning sound ~1s before landing.
- Infernal nova: visibly charges with an expanding particle ring for 1.5s before detonating.
- Phase logic (75/50/25% health), block shredding, fire field and the death
sequence were extracted into their own class, reusing
EliteSpawnerto summon the reinforcement berserkers.
Localization
- Fixed: almost every chat message, command output and the difficulty-menu GUI
used hardcoded English text concatenated directly in Java, ignoring the
lang/*.jsonkeys that already existed (theelitemobs.ui.*keys were defined but never actually used). - Everything now goes through
Component.translatable(...)with variables — never string concatenation. - ~45 new keys added to
en_us.jsonandes_es.json: affixes, Lucifer phase messages, the 9 circle descriptions, command messages, UI tooltips. Natural Spain Spanish, not a literal translation. de_de/fr_frwere left as-is (original content); the new keys fall back toen_uswhere missing.
Integrations and bug fixes
ApotheosisCompatwas fully implemented but never called from anywhere — Lucifer's gear always fell back to plain netherite even with Apotheosis installed. Now actually wired in: if Apotheosis is loaded, Lucifer's gear is generated through its real mythic-rarity API.AnvilUpgradeListener: a redundant condition (< || <=, equivalent to just<=) let players "upgrade" an item with dust of its own current tier for no effect, wasting anvil levels. Fixed to require a strictly higher tier.- Anvil-upgraded item names (
EquipmentUpgrader) now useelitemobs.upgrade_tier.*instead of plain text.
Verification
./gradlew buildgreen after every block of changes, not just at the end.- Client launched via
./gradlew runClient: the mod loads with no errors or exceptions, the world generates and the player joins without issues.
5.1.1 (original baseline, unchanged this session)
NeoForge 1.21.1 mod with 9 difficulty circles, 5 elite tiers, 6 affixes, the
Lucifer encounter (altar + phases), an anvil-based equipment upgrade system, a
client-side difficulty menu, and en_us/es_es/de_de/fr_fr support.
This mod has no additional files
