Links
Tags
Creators
Details
4.0
Compatibility
Changes
[4.0] โ 2026-03-12 โ Legendary Ability Audit & Fixes
๐ Bug Fixes โ Legendary Abilities
-
๐ก๏ธ ReinforcedElytra never activated (Critical) โ
performSneak()called!checkCooldown(player)meaning the ability only "activated" while on cooldown and did nothing when ready. Fixed by removing the negation:if (checkCooldown(player)) return; -
๐ฌ DeathNote spammed chat 20ร/sec (Major) โ
showProgress()calledplayer.sendMessage()every tick. With the passive task running at 1-tick period, this sent 20 messages per second to chat, making the chat completely unusable while holding the item. Fixed by replacingsendMessage()withsendActionBar()and rendering a proper progress bar (colored block chars + target name). -
๐ FountainOfYouth healed all online players (Major) โ The heal loop iterated over
Bukkit.getOnlinePlayers()instead of the arena player list. This meant the item healed players in other arenas, spectators, and any player on the server within range regardless of game state. Fixed by iterating overarena.getPlayers()with a team-fire check. -
๐ HadesHelm applied Wither without checking if helm was equipped (Major) โ
performDamaged()added Wither to any attacker when the player took damage, even if they had already unequipped the helm during combat. Fixed by addingAbilityManager.isAbilityItem(player.getInventory().getHelmet(), "hades_helm")guard at the top of the method. -
๐ข HermesBoots cancelled fall damage without checking if boots were worn (Major) โ Same class of bug as HadesHelm:
performDamaged()suppressed all fall damage even after the player swapped out the boots. Fixed by guarding withisAbilityItem(player.getInventory().getBoots(), "hermes_boots"). -
๐จ MidasSword used deprecated
AttributeModifierconstructor (Major) โ The oldAttributeModifier(UUID, String, double, Operation, EquipmentSlot)constructor is removed in Paper 1.21+. Replaced with the currentAttributeModifier(NamespacedKey, double, Operation, EquipmentSlotGroup)API; modifier key stored as aNamespacedKeyfield to allow stable removal on each upgrade. -
๐ฟ EmeraldBlade used deprecated
AttributeModifierconstructor (Major) โ Same issue as MidasSword.updateItemData()callednew AttributeModifier(UUID.randomUUID(), "emerald_blade_damage", โฆ). This also meant a fresh random UUID was generated on every deposit, so the old modifier was never removed, stacking damage indefinitely. Fixed with a stableNamespacedKeyfield (emerald_blade_damage) and the new constructor. -
๐ฉธ CrimsonChainsword leaked
revvedUp/bleedingTargetsmaps on disconnect/death (Minor) โ Neither map was cleaned up when a player left or died, causing unbounded memory growth over long sessions. AddedperformQuit()andperformDeath()overrides that remove the player's entries from both maps.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:VxdGAFxk:TLKPnmTN"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:VxdGAFxk:TLKPnmTN"
}

