HungerGameSSS 4.5.8
release21 марта 2026 г.HungerGamesSSS v4.5.8 — Legend Rewrite Pass
🔧 Bug Fixes (13 issues)
- Fixed 8 abilities double-registering events on reload (CloudSword, VoidStaff, WitherSickles, Excalibur, EmeraldBlade, MidasSword, VillagerWand, ChainsawSword)
- Fixed ObsidianDagger, HypnosisStaff, GolemHammer passive tasks never cancelling on shutdown
- Fixed
loadPlayerStats()blocking main thread on player join → now async - Fixed
savePlayerStats()overwriting real stats with zeros on every join - Fixed UpdateManager HTTP connection hanging indefinitely when Modrinth unreachable
🗑️ Removed
- ChainsawSword — removed (replaced by Crimson Chainsword's new design)
- DeathScythe — removed (replaced by Reaper Scythe's new design)
⚔️ Legend Rewrites (12 weapons)
| Weapon | Old | New |
|---|---|---|
| Warpick | Broken mine + shatter | Mine Explosion (5s CD) + Critical Hit armor shred (20s CD) |
| Dragon Katana | Simple dash | Permanent Speed I passive + Dragon Dash teleport (12s CD) |
| Artemis Bow | Power V + Infinity | Power III (upgradeable to VII via Anvil) + Homing 25% + Lightning 20% |
| Aiglos | Ice freeze AOE | Explosive spear throw — 3×3×3 blast, Sharpness scales explosion, Loyalty III return |
| Armadillo Detonator | Auto-explode on contact | Right-click shoot (max 3 active, 20s CD) + Left-click instant detonate all |
| Beehive Blaster | Ball projectile | Right-click spawns 4 angry bees, auto-target nearest enemy, Poison I (8s) per sting |
| Crimson Chainsword | Bleed DoT + rev mechanic | Shred Stacks passive (+10% pen/stack, max 5) + Chainsaw Rampage (10s CD, 3s burst, 12 ticks) |
| Corrupted Crossbow | Spread arrows | Poison Cloud bolt (4s CD) — AoE splash 4×4×4, Multishot = 3 clouds |
| Death Note | Stare at target to summon Warden | Type /dn <name> → instant kill (bypass armor/totem), 3 uses total, 25s per-target CD |
| Reaper Scythe | Wither AOE sweep | Soul Harvest (45s CD) — steal ALL beneficial effects + 25% lifesteal per target |
| Ender Bow | Swap positions + blink | Pearl Shot (30s CD) + Arrow→Floating Pearl (walk in = instant teleport, no CD) |
| Excalibur | 5s timed invincibility | 3-Hit Immunity Charges — block any damage, auto-recharge +1 every 45s |
| Fountain of Youth | Regen zone only | Passive +1 HP/s while held + 8×8 healing zone (30s, 60s CD) |
| Ghastly Whistle | Air strike only | Summon rideable Ghast (20s) — steer with WASD, auto-fires fireballs at enemies |
🆕 New Systems
/dncommand — Death Note kill command with tab-complete (enemy arena players only)- AnvilListener — Artemis Bow can be upgraded Power III→VII via anvil; other legendaries protected from accidental ability-strip
- Player Head drop — drops victim's head on PvP kill (used in Warpick/Aiglos/etc. recipes). Configurable:
game.death.drop-head+game.death.drop-chance attributes:YAML block — any legend item can now set AttributeModifiers (attack damage, speed, reach) via config without codeunbreakable: true— YAML flag support in legend item configs
🍳 Recipe Overhaul
All 12 rewritten weapons have brand-new recipes themed around their playstyle. Highlights:
- Death Note: Nether Star + 3× Player Head + 3× Wither Skull + Echo Shard × 3 + Shulker Shell × 3 (endgame grind)
- Excalibur: Gold Block × 36 + Emerald Block × 4 + Diamond Sword + Enchanted Golden Apple
- Ghastly Whistle: Dried Ghast × 5 + Diamond × 4 + Saddle + Ghast Tear × 3 (35 min grind)
HungerGameSSS 4.5.7
release20 марта 2026 г.[4.5.7] — Full Bug Sweep Pass 4 (2026-03-20)
Fixed — 13 issues across 14 files
High
-
BUG-REG-01 · 8 ability classes —
registerEvents()in constructor causes double event-handling on reload (CloudSword.java,VoidStaff.java,WitherSickles.java,Excalibur.java,EmeraldBlade.java,MidasSword.java,VillagerWand.java,ChainsawSword.java,HypnosisStaff.java) Each of these abilities calledBukkit.getPluginManager().registerEvents(this, plugin)inside their constructor. On plugin reload,AbilityRegistryinstantiates fresh objects, but the old instances' handlers are never unregistered — both the old and new instances fire for every event, causing every hit, click, and projectile event to be processed twice. Fix: moved allregisterEvents()calls out of constructors and intoAbilityRegistry.register(), which is called exactly once per ability instance.AbilityRegistry.register()now checksability instanceof Listenerand registers automatically, so abilities only need to implementListener— no manual registration needed. -
BUG-OD-01 ·
ObsidianDagger— standalone passiveBukkitRunnableleaks on reload (ObsidianDagger.java)startPassiveTask()spawned a newBukkitRunnableon every class instantiation. After N reloads there were N concurrent tasks all granting Resistance to low-health players. Same root cause as BUG-AB-01 (fixed in 4.5.1 for ArtemisBow). Fix: removedstartPassiveTask()entirely. Low-health Resistance passive migrated topassiveTick(), driven by the singleUnifiedPassiveTickerinAbilityManager. -
BUG-HS-01 ·
HypnosisStaff— minionTask has no reference, cannot be cancelled on shutdown (HypnosisStaff.java)startMinionTask()spawned aBukkitRunnablebut discarded the returnedBukkitTaskreference. On plugin shutdown,AbilityManager.shutdown()cancelled the unified passive ticker but had no way to reach the minion task — it kept running indefinitely after disable, pathfinding mobs toward offline players. Fix: stored the task asprivate BukkitTask minionTask. Addedcleanup()override that cancels the task and callscleanupMobs()for every tracked owner, removing all controlled mobs from the world. -
BUG-GH-01 ·
GolemHammer—disable()is never called, passiveTask never cancelled (GolemHammer.java)GolemHammerstored its passive task in a field and provided adisable()method to cancel it, but nothing ever calleddisable()— notAbilityManager.shutdown(), notMain.onDisable(). The task ran forever after plugin disable, checking and modifying knockback-resistance attributes on every online player. Fix: renameddisable()tocleanup()(implementing the newAbility.cleanup()contract) so thatAbilityRegistry.shutdownAll()picks it up automatically.disable()is kept as a@Deprecateddelegate for any external callers. -
BUG-JOIN-01 ·
PlayerJoinListener—loadPlayerStats()blocks main thread on every join (PlayerJoinListener.java)loadPlayerStats()executed a JDBC query synchronously on the server's main thread. With a remote MySQL database even a 20 ms query introduces a measurable tick-time spike and can cause lag for all players when multiple players join simultaneously. Fix: wrapped the call inBukkit.getScheduler().runTaskAsynchronously(). -
BUG-JOIN-02 ·
PlayerJoinListener—savePlayerStats()immediately afterloadPlayerStats()overwrites DB stats with zeroes (PlayerJoinListener.java)savePlayerStats()was called one line afterloadPlayerStats()with the comment "Ensure record exists". BecauseloadPlayerStats()is now async (and was previously also a blocking call that hadn't finished before the save began),PlayerDatastill held its default values (kills=0, deaths=0, wins=0…) at save time. For any returning player, their stats were reset to zero on every server join. Fix: removed the erroneoussavePlayerStats()call. New player records are created correctly by theON CONFLICT DO UPDATE/INSERT OR REPLACEupsert inDatabaseManagerthe first time a real stat change is saved (on death, win, or disconnect).
Medium
-
BUG-SHUT-01 ·
AbilityManager.shutdown()— only cancels the unified ticker; standalone tasks in GolemHammer, HypnosisStaff, ObsidianDagger, DeathNote are not cleaned up (AbilityManager.java,AbilityRegistry.java,Ability.java) Three abilities (GolemHammer, HypnosisStaff, ObsidianDagger) owned standaloneBukkitRunnabletasks that nothing cancelled on shutdown.DeathNotehad a workingcleanup()method but it required a specific cast inMain.onDisable()— easy to break during refactors. Fix: addeddefault void cleanup() {}to theAbilityinterface. AddedAbilityRegistry.shutdownAll()which iterates all registered abilities and callscleanup()on each.AbilityManager.shutdown()now delegates toshutdownAll()after cancelling the unified ticker.Main.onDisable()no longer needs any per-ability special cases. -
BUG-ARENA-01 ·
Arena— 14 public fields bypass thread-safe getters/setters (Arena.java)name,world,cornucopia,spawns,hologramMap,holograms,originalBlocks,blockQueue,activeLegendaries,configuredLegendaries,temporaryLegendaries,pvpEnabled,netherEnabled,endEnabled,lifestealEnabled,hardcoreEnabled,veinminerEnabled,enabled,netherWorld, andmaxPlayerswere allpublic. Any class could modify them without going through the synchronized setters, silently breaking thread-safety guarantees on state, timer, and gameEnded. Fix: changed all fields toprivate. Added missing accessor methods (getHologramMap(),getHolograms(),getOriginalBlocks(),getBlockQueue(),getTemporaryLegendaries(),getActiveLegendaries(),setActiveLegendaries(),getNetherWorld(),setNetherWorld()). Updated all call-sites inArenaManager,ArenaListener,DungeonManager, andMatchServiceto use the new accessors. -
BUG-UM-01 ·
UpdateManager— missing connection timeout causes async thread to hang indefinitely (UpdateManager.java)HttpURLConnectionwas opened with noconnectTimeoutorreadTimeout. If Modrinth's API was unreachable (DNS failure, network outage, server down), the async thread blocked forever, leaking a thread for the entire server uptime. Fix: addedconn.setConnectTimeout(5000)andconn.setReadTimeout(5000)— the check fails gracefully within 5 s and logs a warning instead of hanging.
Low
- DEAD-CODE-01 ·
ArenaManager— threebuildStyle*placeholder methods are unreachable dead code (ArenaManager.java)buildStyleClassic(),buildStyleUltimate(), andbuildStyleSpeedSilver()were never called from anywhere in the codebase. They placed simple flat platforms without integrating into the Cornucopia pipeline (no chest scanning, no legendary hologram placement, no queue processing). They existed as early prototypes and were never completed. Fix: removed all three methods. The Cornucopia pipeline (buildCornucopia()→startCornucopiaPhase2()→scanForChests()→startPhase3()→finalizeArena()) is the sole code path for arena construction.
Changed
pom.xml— version4.5.6→4.5.7.plugin.yml— version4.5.6→4.5.7; description updated.
HungerGameSSS 4.5.6
release20 марта 2026 г.[4.5.6] — Bug Sweep Pass 3 (2026-03-20)
Fixed — 5 issues across 5 files
High
-
BUG-PM-01 ·
PlayerManager/MatchService/WithdrawCommand— stolen heart item is unclickable after Component-API migration (PlayerManager.java,MatchService.java,WithdrawCommand.java)PlayerManager.onPlayerInteractidentified stolen hearts by comparingmeta.getDisplayName()to the language-file string. After the 4.5.4 fix migrated item names tometa.displayName(Component), the legacygetDisplayName()call returns""— the comparison always failed and hearts could never be consumed. Fix: aNamespacedKeyPDC tagstolen_heartis now written to every heart item on creation (MatchServiceandWithdrawCommand).PlayerManagerreads the PDC tag instead of the display name. -
BUG-EB-01 ·
EnderBow— position swap has no team check (EnderBow.java)performProjectileHitswapped the shooter and any hitLivingEntityunconditionally. Shooting a teammate teleported them to the shooter's position. Fix: addedisFriendlyFirecheck before performing the swap; returns early for friendly targets.
Medium
- BUG-CB-01 ·
CornucopiaBuilder/ArenaManager— build progress spams all online players (CornucopiaBuilder.java,ArenaManager.java)clearArea()usedBukkit.broadcastMessage()for three status messages ("Pre-loading chunks", "Clearing area", "Clearing N%"). These messages were delivered to every player on the server, not just players in the arena being built. Fix: replaced all fourbroadcastMessagecalls withplugin.getLogger().info().
Low
- DUPE-IMPORT · Duplicate
importstatements across 8 manager/model files (ScoreboardManager.java,ArenaManager.java,DungeonManager.java,Arena.java,LegendaryRecipe.java,HologramManager.java,LobbyManager.java,MessageManager.java) A previous tooling pass accidentally injected theColorUtilimport statement 9–27 times per file. While harmless at runtime, it produced compiler noise and inflated source size. Fix: de-duplicated all import blocks; one import per class per file.
Changed
pom.xml— version4.5.5→4.5.6.plugin.yml— version4.5.5→4.5.6.
[4.5.5] — Bug Sweep Pass 2 (2026-03-20)
Fixed — 7 issues across 6 files
High
-
BUG-GT-01 ·
GameTask— world border Phase 1 and Phase 2 execute simultaneously for 60 seconds (GameTask.java) Phase 1 ran whiletimer ∈ (grace, main]and Phase 2 whiletimer ∈ (main−60, main]. During the last 60 s of the main phase both conditions were true, so Phase 2 calledborder.setSize()immediately after Phase 1 — resetting the border back tomiddleSizeon every tick and then fast-shrinking todmSize. Players saw the border snap suddenly rather than transitioning smoothly. Fix: made the ranges mutually exclusive — Phase 1 covers(grace, main−60]and Phase 2 covers(main−60, main](else-if chain). -
BUG-FM-01 ·
MatchService— feast never spawns from the second match onward (MatchService.java)resetArena()calledfeastManager.cleanup(arenaName)which removed feast chests but did not clear thefeastSpawnedguard set inFeastManager. On the next match the guard was still set, sospawnFeast()was never called again for the lifetime of the server. Fix: changed the call tofeastManager.resetArena(arenaName)which calls bothcleanup()andfeastSpawned.remove(). -
BUG-CD-01 ·
MatchService— countdown cancels immediately becausegetGamePlayers()is empty duringSTARTINGstate (MatchService.java) The not-enough-players check instartCountdownused:arena.getGamePlayers().values().stream().filter(GamePlayer::isAlive).count() < 2gamePlayersis not populated until the match transitions toPLAYING, soaliveCountwas always 0 → the countdown broadcast "not_enough_players" and cancelled on the very first tick. Fix: replaced the alive-count check witharena.getPlayers().size() < 2, which counts the raw joined-player list that is populated duringSTARTING.
Medium
- BUG-AB-04 ·
DeathNote—sendActionBar(String)deprecated on Paper 1.21 (DeathNote.java) The progress bar was sent viaplayer.sendActionBar(String), a deprecated overload removed in newer Paper builds. Fix: wrapped the string withLegacyComponentSerializer.legacySection().deserialize().
Low
- BUG-AB-05 ·
VoidStaff,SoulGauntlet,DeathScythe,WitherSickles—sendActionBar(String)deprecated (13 call-sites) (VoidStaff.java,SoulGauntlet.java,DeathScythe.java,WitherSickles.java) Same issue as BUG-AB-04. All 13 remaining String-based action-bar calls replaced withLegacyComponentSerializer.legacySection().deserialize().
Changed
pom.xml— version4.5.4→4.5.5.plugin.yml— version4.5.4→4.5.5.
HungerGameSSS 4.5.4
release19 марта 2026 г.Fixed:
- 8+ missing message keys, CloudSword stutter, PoseidonsTrident thrown hit
- Legend name + lore had italic — fix all,use Paper Component API
HungerGameSSS 4.5.2
release18 марта 2026 г.[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.

