Список изменений
[4.5.2] — Artemis Bow & Passive Ticker Fix Pass (2026-03-18)
Fixed — 8 issues across 5 files
High
-
AB-OPEN-01 ·
ArtemisBow— memory leak: unbounded homing-arrow runnables accumulate on rapid fire (ArtemisBow.java) Each call toperformProjectileLaunchspawned 5 independentBukkitRunnableinstances (one per arrow). Players firing continuously in rapid succession could accumulate dozens of concurrent runnables with no upper bound, gradually degrading server TPS. Fix: added a per-playerAtomicIntegercounter (activeArrowsmap, capped at 15 = 3 simultaneous volleys). Each runnable increments on start and decrements on cancel/expire. New volleys are silently skipped if the cap is reached. Counter is cleaned up onperformQuitandperformDeath. -
AB-OPEN-02 ·
ArtemisBow—performProjectileHitdeals lightning damage without team check (ArtemisBow.java) After BUG-10 was fixed (switched tostrikeLightningEffect+ manualtarget.damage()), the new manual damage call had noisFriendlyFireguard. Result: Artemis Bow arrows could deal lightning damage to teammates. Fix: addedif (target instanceof Player tp && isFriendlyFire(shooter, tp)) return;before callingtarget.damage(). Also added a null-guard: ifprojectile.getShooter()is not aPlayer, the method returns early. -
AB-OPEN-03/05 ·
ArtemisBow— Sky Strike targets first entity in list, not closest (ArtemisBow.java)getNearbyEntities(20, 20, 20)returns entities in no guaranteed order. Sky Strike broke out of the loop on the first non-team entity — sometimes picking a distant mob over an enemy player standing 2 blocks away. Fix: replaced early-break loop with a fulldistanceSquaredscan to find the closest valid target. Search radius is now configurable viasky_strike_radius(default 20). -
AB-OPEN-04 ·
ArtemisBow— fan arrows use default Minecraft damage (~0.5 hearts) instead of bow charge (ArtemisBow.java)player.launchProjectile(Arrow.class)spawns arrows with base damage 2.0 — they ignore the actual bow charge the player applied. Only the centre (original) arrow inherited the real charge damage. Fix: addedextraArrow.setDamage(baseArrow.getDamage())when spawning each fan arrow so all 5 arrows deal equal damage consistent with bow charge.
Medium
-
BUG-HH-02 ·
HadesHelm— standalone passiveBukkitRunnableleaks on reload (HadesHelm.java)startPassive()spawned a newBukkitRunnableon every class instantiation. On plugin reload the old instance was discarded but the runnable kept running → N tasks after N reloads. Same root cause as BUG-AB-01 (fixed in 4.5.1 for ArtemisBow). Fix: removedstartPassive()entirely. Night Vision, Invisibility-while-sneaking, and Fire Aura logic migrated topassiveTick()— driven by the singleUnifiedPassiveTicker. -
BUG-GC-01 ·
GuardianCannon— standalone passiveBukkitRunnableleaks on reload (GuardianCannon.java) Same root cause as BUG-HH-02.startPassiveTask()ran on instantiation → N tasks after N reloads. Fix: Dolphins Grace water passive migrated topassiveTick(). -
BUG-LS-01 ·
LichStaff— standalone passiveBukkitRunnableleaks on reload (LichStaff.java) Same root cause as BUG-HH-02.startPassiveTask()ran on instantiation → N tasks. Fix: Frost Walker passive migrated topassiveTick(). The ammo / shoot system is unaffected — it correctly uses per-useBukkitRunnableinstances that self-cancel.
Low
- plugin.yml —
api-versionset to4.4.1(invalid format) (plugin.yml) Paper requiresapi-versionto be a major.minor string (1.21), not a plugin version string. An invalid value causes a warning on every server start. Fix: changedapi-version: 4.4.1→api-version: 1.21.
Changed
pom.xml— version4.5.1→4.5.2.plugin.yml— version4.5.1→4.5.2;api-versioncorrected to1.21; description updated.

