▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Моды/HungerGameSSS
HungerGameSSS

HungerGameSSS

HungerGameSSS is a high-performance Hunger Games plugin featuring unique Legendary Weapons with special abilities, dynamic gameplay systems, and full arena customization — built for competitive PvP servers.

321
3
Все версииHungerGameSSS 4.5.7

HungerGameSSS 4.5.7

Release3 нед. назад

Список изменений

[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 called Bukkit.getPluginManager().registerEvents(this, plugin) inside their constructor. On plugin reload, AbilityRegistry instantiates 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 all registerEvents() calls out of constructors and into AbilityRegistry.register(), which is called exactly once per ability instance. AbilityRegistry.register() now checks ability instanceof Listener and registers automatically, so abilities only need to implement Listener — no manual registration needed.

  • BUG-OD-01 · ObsidianDagger — standalone passive BukkitRunnable leaks on reload (ObsidianDagger.java) startPassiveTask() spawned a new BukkitRunnable on 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: removed startPassiveTask() entirely. Low-health Resistance passive migrated to passiveTick(), driven by the single UnifiedPassiveTicker in AbilityManager.

  • BUG-HS-01 · HypnosisStaff — minionTask has no reference, cannot be cancelled on shutdown (HypnosisStaff.java) startMinionTask() spawned a BukkitRunnable but discarded the returned BukkitTask reference. 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 as private BukkitTask minionTask. Added cleanup() override that cancels the task and calls cleanupMobs() for every tracked owner, removing all controlled mobs from the world.

  • BUG-GH-01 · GolemHammerdisable() is never called, passiveTask never cancelled (GolemHammer.java) GolemHammer stored its passive task in a field and provided a disable() method to cancel it, but nothing ever called disable() — not AbilityManager.shutdown(), not Main.onDisable(). The task ran forever after plugin disable, checking and modifying knockback-resistance attributes on every online player. Fix: renamed disable() to cleanup() (implementing the new Ability.cleanup() contract) so that AbilityRegistry.shutdownAll() picks it up automatically. disable() is kept as a @Deprecated delegate for any external callers.

  • BUG-JOIN-01 · PlayerJoinListenerloadPlayerStats() 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 in Bukkit.getScheduler().runTaskAsynchronously().

  • BUG-JOIN-02 · PlayerJoinListenersavePlayerStats() immediately after loadPlayerStats() overwrites DB stats with zeroes (PlayerJoinListener.java) savePlayerStats() was called one line after loadPlayerStats() with the comment "Ensure record exists". Because loadPlayerStats() is now async (and was previously also a blocking call that hadn't finished before the save began), PlayerData still 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 erroneous savePlayerStats() call. New player records are created correctly by the ON CONFLICT DO UPDATE / INSERT OR REPLACE upsert in DatabaseManager the 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 standalone BukkitRunnable tasks that nothing cancelled on shutdown. DeathNote had a working cleanup() method but it required a specific cast in Main.onDisable() — easy to break during refactors. Fix: added default void cleanup() {} to the Ability interface. Added AbilityRegistry.shutdownAll() which iterates all registered abilities and calls cleanup() on each. AbilityManager.shutdown() now delegates to shutdownAll() 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, and maxPlayers were all public. 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 to private. Added missing accessor methods (getHologramMap(), getHolograms(), getOriginalBlocks(), getBlockQueue(), getTemporaryLegendaries(), getActiveLegendaries(), setActiveLegendaries(), getNetherWorld(), setNetherWorld()). Updated all call-sites in ArenaManager, ArenaListener, DungeonManager, and MatchService to use the new accessors.

  • BUG-UM-01 · UpdateManager — missing connection timeout causes async thread to hang indefinitely (UpdateManager.java) HttpURLConnection was opened with no connectTimeout or readTimeout. 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: added conn.setConnectTimeout(5000) and conn.setReadTimeout(5000) — the check fails gracefully within 5 s and logs a warning instead of hanging.

Low

  • DEAD-CODE-01 · ArenaManager — three buildStyle* placeholder methods are unreachable dead code (ArenaManager.java) buildStyleClassic(), buildStyleUltimate(), and buildStyleSpeedSilver() 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 — version 4.5.64.5.7.
  • plugin.yml — version 4.5.64.5.7; description updated.

Файлы

HungerGamesSSS-4.5.7.jar(881.55 KiB)
Основной
Скачать

Метаданные

Канал релиза

Release

Номер версии

4.5.7

Загрузчики

Paper
Purpur

Версии игры

1.21–1.21.11

Загрузок

4

Дата публикации

3 нед. назад

Загрузил

ID версии

Главная