▶️ ЗАБЕРИ СВОИ 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.

245
3
Все версииHungerGameSSS 4.3

HungerGameSSS 4.3

Release2 нед. назад

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

[4.3] — Stabilization Patch 3

Fixed

High

  • H-04 · FeastManager — double announce + possible double-spawn (FeastManager.java) The announce-minutes list in config.yml previously included both 20 and 19, causing two broadcasts in the very first minute of the match. Even after the config was corrected in v4.1, a subtler edge still remained: timerSeconds == 0 at the moment the PLAYING state begins, and feastSeconds - 0 * 60 == 0 — meaning any 0-minute entry in the list would fire instantly. Fix: Guard timerSeconds <= 0 returns immediately. Added feastSpawned set (ConcurrentHashMap-backed) so the feast spawns exactly once per match regardless of how many scheduler ticks land on the boundary second. Added resetArena(name) to clear the flag between matches.

  • H-06 · DungeonManager.getMobHP() fallback 40.0 vs config 60.0 (DungeonManager.java) The config.yml declared dungeons.mob-hp: 60.0 as the intended default, but the code fallback was 40.0. When the key was absent the generic dungeon mobs (Spider Queen, Crypt Stalker, Gold Miner, Temple Guardian) spawned with 40 HP — one-third weaker than designed. Fallback corrected to 60.0.

Medium

  • M-04 · Excalibur — reflection hit dungeon mobs, bypassed team system (Excalibur.java) performDamaged reflected against any LivingEntity attacker. When a dungeon mob hit the Excalibur holder, the reflected damage still had the player as the source, which could splash into nearby arena players and bypassed team friendly-fire checks entirely (the team check only ran for Player attackers). Reflection is a PvP mechanic; mob attacks should not trigger it. Changed the guard from instanceof LivingEntity attacker to instanceof Player attacker. The projectile deflect block remains unchanged (projectiles can originate from any source). Also added a self-damage guard (attacker.equals(player)) for defensive robustness.

  • M-05 · MjolnirrotationAngle float unbounded, overflows after ~18 h (Mjolnir.java) rotationAngle was incremented by rotationSpeed on every passive tick with no upper bound. A 32-bit float mantissa has 24-bit precision; at 25°/tick × 20 ticks/s the angle exceeds 2²⁴ in roughly 18 hours of continuous operation, after which rotateY(Math.toRadians(angle)) silently produces garbage rotation matrices and the thrown hammer stops orbiting correctly. Both increment sites now use % 360f to keep the angle in [0, 360).

  • M-06 · VeinMinerListenermaxVeinSize not hot-reloadable (VeinMinerListener.java) The field was read once in the constructor and cached for the lifetime of the plugin. /perf reload (or any config reload) had no effect on vein size until the next server restart. Removed the cached field; maxVeinSize is now read from config on every BlockBreakEvent and passed as a parameter to findVein().

  • M-08 · ArenaListener — duplicate no-arg constructor using static Main.getInstance() (ArenaListener.java) A second constructor public ArenaListener() accessed Main.getInstance() — a static singleton call that fails during class initialisation if the plugin is not fully loaded, and couples the listener to the static instance rather than the injected one. The no-arg constructor was a leftover comment artifact; removed.

  • M-09 · DatabaseManager.getPlayerStats() — synchronous query on main thread (DatabaseManager.java) The method opened a JDBC connection and ran a SELECT on whichever thread called it. When called from command handlers or event listeners on the main thread this blocked the server tick for the entire round-trip. Replaced with getPlayerStatsAsync(UUID) returning CompletableFuture<Map<String,Object>> dispatched to the Bukkit async scheduler. The original synchronous method is kept as @Deprecated getPlayerStats() (delegates to getPlayerStatsSync) for any call-sites that already run on async threads.

  • M-10 · PerformanceOptimizer.toggleMonitoring() always returned true (PerformanceOptimizer.java) The implementation was return activeTasks.get() >= 0 — an AtomicInteger is always ≥ 0, so the method always returned true regardless of monitoring state. Added AtomicBoolean monitoringEnabled (default true); toggleMonitoring() now inverts the flag and returns the new state.

Low

  • L-06 · AbilityDispatcher.LEGEND_KEY static field initialised before onEnable() (AbilityDispatcher.java) The field private static final NamespacedKey LEGEND_KEY = new NamespacedKey(Main.getInstance(), "hg_ability") is evaluated when the class is first loaded. If any class (e.g. a command tab-completer) caused AbilityDispatcher to be loaded before Main.onEnable() completed, getInstance() returned null and every subsequent ability dispatch threw NPE. Changed to lazy initialisation via a private getLegendKey() method that constructs the key on first use.

  • L-07 · Hardcoded test-item blacklist gerald_sniffer/gruntilda/tim_enchanter (ArenaManager.java, config.yml) Three internal test legendary IDs were hard-coded in startCornucopiaPhase2(). Replacing them requires a recompile. Moved to config: legendary.excluded-ids: [] (default empty). Server owners can now exclude any legendary from the active pool without touching source code.

  • L-09 · buildCornucopia() called originalBlocks.clear() destroying prior tracking (ArenaManager.java) Spawn cages and dungeon structures call originalBlocks.put() to record every block they place, enabling full restoration on arena reset. buildCornucopia() called arena.originalBlocks.clear() before building the Cornucopia, erasing all prior entries. On reset, only blocks placed after the clear were restored — cages and dungeons were left as permanent terrain edits. The clear() call is removed; CornucopiaBuilder already appends to the map with individual put() calls.

  • L-10 · GameTask extends BukkitRunnable but is never scheduled — double-tick risk (GameTask.java) GameTask was a dead BukkitRunnable subclass. The arena tick is driven entirely by ArenaManager.tick() via the global loop in Main.onEnable(). If a future developer saw the class and scheduled it directly, every arena would tick twice per second. GameTask.run() now throws UnsupportedOperationException immediately, surfacing the bug during development rather than silently corrupting timer state.

Файлы

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

Метаданные

Канал релиза

Release

Номер версии

4.3

Загрузчики

Bukkit
Paper
Purpur
Spigot

Версии игры

1.21–1.21.11

Загрузок

4

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

2 нед. назад

Загрузил

ID версии

Главная