Links
Tags
Creators
Details
4.5.2
Compatibility
Changes
[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.
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:uJlQwDFx"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:VxdGAFxk:uJlQwDFx"
}

