Список изменений
[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.

