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

