Wave Defense

A versatile PvE and PvP engine featuring wave defense, customizable shops, and three competitive game modes for Minecraft

File Details

wavedefense-0.2.40.jar

  • R
  • Apr 18, 2026
  • 558.98 KB
  • 17
  • 1.20.1
  • Forge

File Name

wavedefense-0.2.40.jar

Supported Versions

  • 1.20.1

Curse Maven Snippet

Forge

implementation fg.deobf("curse.maven:wave-defense-1492909:7945279")
Curse Maven does not yet support mods that have disabled 3rd party sharing

Learn more about Curse Maven

 

ENG:

  •  

    Changelog

    [0.2.40] - 2026-04-18

    Added — Localization (Full i18n Support)

    The mod now fully supports the Minecraft translation system. Players will see the interface in their preferred language.

    • Refactored ~53 Java files — replaced Component.literal("Text") with Component.translatable("key") and I18n.get().

    • Added ~55 new translation keys to en_us.json and uk_ua.json: PvP HUD strings, PlayerSettings, HudEdit, HudLayout presets, AdminMenu, and all server-side messages.

    • 6 new language files (full translation of all keys):

      • 🇩🇪 de_de.json — Deutsch

      • 🇫🇷 fr_fr.json — Français

      • 🇪🇸 es_es.json — Español

      • 🇵🇱 pl_pl.json — Polski

      • 🇧🇷 pt_br.json — Português (Brasil)

      • 🇨🇳 zh_cn.json — 简体中文

    • HudLayout.Preset — the enum now stores a translation key instead of a hardcoded string.

    • WaveActionsScreen — refactored the tooltip system from text-matching to Map<Button, String> (ensures correct behavior in any language).

    • HudOverlay — PvP HUD strings (pvp.buy_phase, pvp.round_active, pvp.waiting) moved from hardcode to i18n.

    Fixed — Scroll Buttons (Critical UI Bug)

    Scroll buttons (▲/▼) in 8 admin screens were incorrectly registered via addRenderableWidget(), causing them to be caught by the scissor clip. This rendered them invisible and unclickable when a list appeared.

    Fixed by switching from addRenderableWidget to addStatic in:

    • AdminMenuScreen — locations list

    • CompletionRewardScreen — rewards list

    • WaveConfigScreen — waves list

    • PlayerMenuScreen — player locations list

    • PlayerShopScreen — shop items list

    • MobSelectionScreen — mob list

    • WaveMobsEditorScreen — wave mobs list

    • LocationEditorScreen — spawn points list

    Fixed — LocationEditorScreen Click-Guard

    When scrolling down, widgets moving "out" of view (Y < 76) could still receive clicks in the header and tab areas. The protection now validates all registered widgets regardless of mouse Y-position.

    Fixed — Memory Leak on Disconnect

    When a player at a location disconnected, playerData, playerBackups, and reEntryCooldowns were not being cleared. Added a PlayerLoggedOutEvent handler in EventHandler: logout now triggers surrenderPlayer(), correctly restoring inventory and clearing all maps.

    Fixed — reEntryCooldowns Memory Leak

    Entries in reEntryCooldowns (UUID → timestamp) were accumulating indefinitely. Added automatic removal of expired entries every minute (every 1200 ticks).

    Fixed — PurchaseItemPacket (TOCTOU + NPE)

    • Now captures references to ShopPoint, sourceList, and ShopItem at a single point in time.

    • Added null-checks for every step (prevents NPE if an admin edits the shop during a transaction).

    • Replaced hardcoded error string with wavedefense.msg.item_not_available.

    Fixed — ImportExportScreen tell() Race Condition

    rebuildWidgets() could execute after the screen was closed (e.g., when a packet arrived after the player had already switched to another screen). Added a minecraft.screen == this check before triggering the rebuild.

    Optimization — getPlayersInLocation() Per-Tick Cache

    This method was called 40+ times per tick, iterating through all playerData (O(M) complexity per call). It now builds a shared Map<String, List<ServerPlayer>> once per tick, reducing subsequent calls to an O(1) lookup. The cache is invalidated upon player join/leave.

    Optimization — HudOverlay Rendering

    • Eliminated duplicate mc.font.width() calls (previously called separately for each line).

    • Block width is now calculated in a single pass.

     




Укр:

 

# Changelog

## [0.2.40] - 2026-04-18

### Додано — Локалізація (повна підтримка i18n)
Мод тепер повністю підтримує систему перекладів Minecraft. Гравці з будь-якою мовою інтерфейсу бачать текст своєю мовою.

- **Виправлено ~53 Java-файли** — замінено `Component.literal("Текст")` на `Component.translatable("ключ")` і `I18n.get()`
- **Додано ~55 нових ключів перекладу** в `en_us.json` і `uk_ua.json`: PvP HUD рядки, PlayerSettings, HudEdit, HudLayout presets, AdminMenu, всі серверні повідомлення
- **6 нових мовних файлів** (повний переклад всіх ключів):
  - 🇩🇪 `de_de.json` — Deutsch
  - 🇫🇷 `fr_fr.json` — Français
  - 🇪🇸 `es_es.json` — Español
  - 🇵🇱 `pl_pl.json` — Polski
  - 🇧🇷 `pt_br.json` — Português (Brasil)
  - 🇨🇳 `zh_cn.json` — 简体中文
- **`HudLayout.Preset`** — enum тепер зберігає translation key замість рядка мовою інтерфейсу
- **`WaveActionsScreen`** — tooltip-система рефакторена з text-matching на `Map<Button, String>` (коректно при будь-якій мові)
- **HudOverlay** — PvP рядки HUD (`pvp.buy_phase`, `pvp.round_active`, `pvp.waiting`) замінено з хардкоду на i18n

### Виправлено — Scroll-кнопки (критичний UI-баг)
Scroll-кнопки (▲/▼) у 8 адмін-екранах були зареєстровані через `addRenderableWidget()` і потрапляли під scissor-кліп — ставали невидимими і некліка́бельними при появі списку.

Виправлено (`addRenderableWidget` → `addStatic`):
- `AdminMenuScreen` — список локацій
- `CompletionRewardScreen` — список нагород
- `WaveConfigScreen` — список хвиль
- `PlayerMenuScreen` — список локацій для гравця
- `PlayerShopScreen` — список товарів
- `MobSelectionScreen` — список мобів
- `WaveMobsEditorScreen` — список мобів хвилі
- `LocationEditorScreen` — список точок спавну мобів

### Виправлено — LocationEditorScreen click-guard
При скролі вниз widgets що "виплигували" вгору (Y < 76) могли отримувати кліки в зоні заголовка і табів. Захист тепер перевіряє всі зареєстровані widgets незалежно від Y-позиції миші.

### Виправлено — Memory leak при disconnect
При відключенні гравця що знаходився на локації — `playerData`, `playerBackups`, `reEntryCooldowns` не очищались. Додано обробник `PlayerLoggedOutEvent` в `EventHandler`: при logout викликається `surrenderPlayer()` → коректне відновлення інвентаря і очистка всіх карт.

### Виправлено — Витік пам'яті reEntryCooldowns
Записи в `reEntryCooldowns` (UUID → timestamp) накопичувались нескінченно. Додано автоматичне видалення прострочених записів раз на хвилину (кожні 1200 тіків).

### Виправлено — PurchaseItemPacket (TOCTOU + NPE)
- Захоплення посилань на `ShopPoint`, `sourceList` і `ShopItem` в один момент часу
- Додано null-перевірки для кожного кроку (захист від NPE при одночасному редагуванні магазину адміном)
- Замінено хардкодований рядок помилки на `wavedefense.msg.item_not_available`

### Виправлено — ImportExportScreen tell() race
`rebuildWidgets()` міг виконатись після закриття екрана (пакет приходить коли гравець вже відкрив інший екран). Додано перевірку `minecraft.screen == this` перед rebuild.

### Оптимізація — getPlayersInLocation() per-tick кеш
Метод викликався 40+ разів на тік, кожен раз ітеруючи по всіх `playerData` (O(M) кожен виклик). Тепер будує спільний кеш `Map<String, List<ServerPlayer>>` один раз на тік, результат всіх наступних викликів — O(1) lookup. Кеш інвалідується при вході/виході гравця.

### Оптимізація — HudOverlay rendering
- Усунено дубльовані `mc.font.width()` виклики (були окремо для кожного рядка)
- Ширина блоку обчислюється одним проходом

---