Links
Tags
Creators
Details
4.5.9
Compatibility
Changes
[4.5.9] — Bug Fix Pass 5 (2026-04-24)
Fixed — 3 bugs across 3 files
High
- BUG-BASE-01 ·
BaseAbility—validateCanUse()uses wrong permission nodehg.admininstead ofhoplitebr.admin(BaseAbility.java)validateCanUse()granted the admin bypass withplayer.hasPermission("hg.admin"). The correct node — defined inplugin.ymland fixed for commands in 4.1 (bug M-07) — ishoplitebr.admin. Any operator who granted thehoplitebr.adminpermission explicitly (without OP) received no bypass; conversely,hg.admingrants that had been assigned in a permissions plugin incorrectly bypassed ability checks. Fix: changed check toplayer.hasPermission("hoplitebr.admin"). The|| player.isOp()fallback is unchanged so vanilla OP still bypasses.
Medium
-
BUG-CTX-01 ·
AbilityContext— noisCancelled()/setCancelled()API (AbilityContext.java) TheAbilityContextobject was fully immutable after construction. Abilities that need to signal downstream handlers to skip processing (e.g. two abilities sharing the same trigger chain) had no standard way to do so — each ability reimplemented ad-hoc boolean flags. Fix: added a mutableboolean cancelledfield withisCancelled()andsetCancelled(boolean)accessors. The field defaults tofalse. Abilities can now callctx.setCancelled(true)to mark a context as consumed, and other abilities/listeners can checkctx.isCancelled()before acting. -
BUG-OD-02 ·
ObsidianDagger— deprecatedgetTargetBlock(null, range)+ 1-tick meteor trail task + hardcodedsendMessagecalls (ObsidianDagger.java) Three independent issues inperformRightClick:player.getTargetBlock(null, TARGET_DISTANCE)— passingnullfor the transparent-block set is deprecated in Paper 1.21 and emits a compile warning. Replaced withplayer.getTargetBlockExact(distance, FluidCollisionMode.NEVER)with arayTraceBlocksprimary path for accurate targeting.- The meteor particle trail
BukkitRunnableran at period1L(every tick). A falling meteor moves slowly enough that2L(every 2 ticks) produces visually identical results at half the server-side task overhead. - Two
player.sendMessage("§...")calls bypassed the Adventure component API (italic rendering issue) and the i18n system. Replaced withplayer.sendActionBar(Component)usingLegacyComponentSerializer, consistent with the pattern used throughout other abilities since 4.5.5.
Changed
pom.xml— version4.5.8→4.5.9.plugin.yml— version4.5.8→4.5.9; description updated.
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:bhF8XExN"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:VxdGAFxk:bhF8XExN"
}

