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
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")withComponent.translatable("key")andI18n.get(). -
Added ~55 new translation keys to
en_us.jsonanduk_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 toMap<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
addRenderableWidgettoaddStaticin:-
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, andreEntryCooldownswere not being cleared. Added aPlayerLoggedOutEventhandler inEventHandler: logout now triggerssurrenderPlayer(), 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, andShopItemat 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 aminecraft.screen == thischeck 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 sharedMap<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()` виклики (були окремо для кожного рядка)
- Ширина блоку обчислюється одним проходом
---