Links
Tags
Creators
Details
4.5.1
Compatibility
Changes
[4.5.1] — Logic Bug Fix Pass (2026-03-16)
Fixed — 12 logic bugs across 11 weapon files
Critical
- BUG-PL-01 ·
PhantomLongbow— ability completely non-functional (PhantomLongbow.java)arrow.remove()was called immediately inperformProjectileLaunch, then aBukkitRunnablewas scheduled 1 tick later. By the time the runnable ran,projectile.isValid()wasfalse→ instant cancel → ability only granted invisibility, nothing else happened. Fix: stop callingremove(). Instead setarrow.setPickupStatus(DISALLOWED),setGravity(false),setDamage(0)so the arrow flies invisibly. The tracking runnable now checksisValid() || isOnGround() || isDead()and callsarrow.remove()itself.
High
-
BUG-FY-02 ·
FountainOfYouth— inverted team check heals enemies, skips teammates (FountainOfYouth.java)isFriendlyFirereturnstruefor teammates. The conditionif (isFriendlyFire(player, target)) continuewas therefore skipping teammates and healing enemies — the exact opposite of the comment. Fix: added!→if (!isFriendlyFire(player, target)) continue. -
BUG-VS-01 ·
VoidStaff— portal CD starts on first portal, blocks second placement (VoidStaff.java)portalCDs.put(...)ran unconditionally after any portal placement. Player placed portal #1, 40 s CD started, clicking again to place portal #2 hit the CD guard and was blocked — so a connected portal pair could never be created. Fix: movedportalCDs.put(...)inside theif (connected)branch only. -
BUG-CC-03 ·
CorruptedCrossbow— extra bolts missinghg_abilitymetadata, no hit effects (CorruptedCrossbow.java) Extra bolts were taggedcorrupted_extraandcorrupted_boltbut nothg_ability.AbilityManager.handleProjectileHitonly dispatchesperformProjectileHitwhenhg_abilityis present. Result: extra bolts dealt only vanilla arrow damage with no Poison or Weakness effects. Fix: addedextra.setMetadata("hg_ability", ...)when spawning each extra bolt.
Medium
-
BUG-CSW-01 ·
CrimsonChainsword— bleed only fires 1 damage tick out of 5 (CrimsonChainsword.java)runTaskTimer(10L, 10L)incrementsticks0→1→2→3→4 then cancels. Damage condition wasticks % 20 == 0— onlyticks=0satisfies this → 1 damage tick instead of 5. Fix: removed% 20 == 0check. Period is already the interval; every call = one bleed tick. -
BUG-SB-01 ·
ShadowBlade— Shadow Step has no team check, teleports behind teammates (ShadowBlade.java) Shadow Step's target loop had noisFriendlyFireguard, allowing teleport behind allies. Fix: addedif (e instanceof Player tp && isFriendlyFire(player, tp)) continue;. -
BUG-RH-01/02 ·
RavagerHorn— lazy location capture + no Ravager cleanup on quit/death (RavagerHorn.java) (1) Stampede lambdas calledplayer.getLocation()lazily — waves diverged if player moved during the 16-tick animation. Fixed: capturecastLoc = player.getLocation().clone()before the loop. (2) NoperformQuit/performDeathhook — Ravager persisted in the world after the player disconnected or died. Fixed: addedactiveRavagersmap +dismountAndRemove()called on both events. -
BUG-DN-01 ·
DeathNote— passive task runs every tick (20×/s), expensive raytracing (DeathNote.java)runTaskTimer(1L, 1L)= 20rayTrace(range:50)calls per player per second. With 10 players = 200 raytrace/s. ChangedTASK_PERIODfrom1Lto3L(~7 raytrace/s/player), still provides smooth progress bar updates.
Low
-
BUG-VW-01 ·
VillagerWand—taggedForRewardmap memory leak (VillagerWand.java) Entries were only removed on entity death. Entities that fled, despawned, or were removed by arena reset left their UUID in the map indefinitely. Fixed: value now stores an expiry timestamp (now + rewardWindow).onEntityDeathchecksnow <= expiry. A cleanup task runs every 20 s to evict stale entries. -
BUG-SG-01 ·
SoulGauntlet— action bar hardcodes-3instead ofblastCost(SoulGauntlet.java) Ifsoul_blast_soulswas changed in config, the displayed soul count was wrong. Fix:(charges - 3)→(charges - blastCost). -
BUG-WS-02 ·
WitherSickles—dualWieldActivedesync when offhand is overwritten (WitherSickles.java) If a player manually placed another item into the offhand slot,dualWieldActivekept the UUID entry, blockingequipOffhandfrom re-running. FixedonInventoryClickto detect this state and calldualWieldActive.remove(uuid). -
BUG-AB-01 ·
ArtemisBow— standalone passiveBukkitRunnableleaks on reload (ArtemisBow.java)startPassive()spawned a new task on every class instantiation. On plugin reload the old instance was discarded but the runnable kept running → N tasks after N reloads. Migrated topassiveTick()hook consumed by the singleUnifiedPassiveTickerinAbilityManager.startPassive()and its runnable removed entirely.
Changed
pom.xml— version4.5.0→4.5.1.plugin.yml— version4.5.0→4.5.1; 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:UcDPAKK2"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:VxdGAFxk:UcDPAKK2"
}

