File Details
wavedefense-0.2.40.2.jar
- R
- Apr 20, 2026
- 568.41 KB
- 15
- 1.20.1
- Forge
File Name
wavedefense-0.2.40.2.jar
Supported Versions
- 1.20.1
Curse Maven Snippet
Changelog
[0.2.40] - 2026-04-18
Added — Full i18n / Localization overhaul
The mod now fully integrates with Minecraft's translation system. Players with any interface language see all text in their own language — no hardcoded strings remain in player-facing output.
- ~53 Java files fixed — replaced
Component.literal("text")withComponent.translatable("key")andI18n.get()throughout all GUI screens, game logic, network packets, and event handlers - 224 translation keys per language file, covering all UI screens, HUD strings, chat messages, tooltips, and admin menus
- Added ~80 new translation keys to
en_us.jsonanduk_ua.json: PvP HUD strings, lobby/portal/boundary messages, PlayerSettings, HudEdit, HudLayout presets, AdminMenu, server-side game messages, wave/round/match events, completion rewards - 6 new language files (complete translation of all 224 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— 简体中文
- 🇩🇪
WaveManager.java— addedbroadcastToLocation(String, Component)overload; changedendSessionForLocationto accept aComponentdirectly; all 30+ broadcast calls converted toComponent.translatable()HudLayout.Preset— enum now stores a translation key instead of a raw display string; preset buttons rendered viaComponent.translatable()WaveActionsScreen— tooltip system refactored from text-matching toMap<Button, String>(works correctly regardless of active language)HudOverlay— PvP HUD status lines (pvp.buy_phase,pvp.round_active,pvp.waiting) converted from hardcoded Ukrainian to i18n keysPlayerSettingsScreen,HudEditScreen,AdminMenuScreen,CompletionRewardScreen— all labels, buttons, hints, and error messages converted to translatable keysKeyBindings.java— "leaving location" and "shop unavailable in spectator" messages converted- All network packets (
PurchaseItemPacket,TeleportPacket,ImportLocationPacket,ExportLocationPacket,AdminTeleportPacket) — server responses now useComponent.translatable(), resolving client-side in the player's language
Fixed — Scroll buttons in 8 admin screens (critical UI bug)
Scroll buttons (▲/▼) in 8 admin screens were registered via addRenderableWidget() and fell under the scissor clip — they became invisible and unclickable when a list appeared.
Fixed (addRenderableWidget → addStatic):
AdminMenuScreen— location listCompletionRewardScreen— reward listWaveConfigScreen— wave listPlayerMenuScreen— location list for playerPlayerShopScreen— item listMobSelectionScreen— mob listWaveMobsEditorScreen— wave mob listLocationEditorScreen— mob spawn point list
Fixed — Memory leak on player disconnect
When a player disconnected while inside a location, playerData, playerBackups, and reEntryCooldowns were not cleaned up. Added a PlayerLoggedOutEvent handler in EventHandler: on logout, surrenderPlayer() is called, properly restoring inventory and clearing all internal maps.
Fixed — reEntryCooldowns memory leak
Entries in reEntryCooldowns (UUID → timestamp) accumulated indefinitely. Added automatic removal of expired entries once per minute (every 1 200 ticks).
Fixed — PurchaseItemPacket (TOCTOU + NPE)
- References to
ShopPoint,sourceList, andShopItemare now captured atomically - Added null checks at every step (guards against NPE when an admin edits the shop concurrently)
Fixed — ImportExportScreen rebuild race
rebuildWidgets() could run after the screen was already closed (packet arrives while the player has opened a different screen). Added a minecraft.screen == this guard before rebuild.
Optimization — getPlayersInLocation() per-tick cache
The method was called 40+ times per tick, each time iterating over all playerData (O(n) per call). It now builds a shared Map<String, List<ServerPlayer>> once per tick; all subsequent calls are O(1) lookups. The cache is invalidated on player join/leave.
Optimization — HudOverlay rendering
- Eliminated duplicate
mc.font.width()calls (previously computed separately for each line) - Block width is now calculated in a single pass