3.3.0
API CHANGES - **GameModule.getDisplayName()** default method. Modules can now override this to declare their own display name. The core checks this method before falling back to the language.yml lookup or the descriptor name. - **ModuleConfigAPI.registerCopyOnly(String fileName)** registers a config file using a copy if missing strategy: the bundled resource is only copied to disk when the file does not exist; afterwards the file is loaded without merging defaults, so entries the admin deliberately removed are never restored. - **MenuAPI.registerModuleMenuAPI(String moduleId, MenuAPI handler)** and **MenuAPI.unregisterModuleMenuAPI(String moduleId)** modules can now register a custom MenuAPI handler for their own menus without touching the core implementation class. - **ItemClickHandler<P>** functional interface for GUI item click callbacks in the inventory API. - **ItemAPI.registerClickHandler(String itemId, ItemClickHandler handler)** and **ItemAPI.unregisterClickHandler(String itemId)** modules can now register click handlers for their lobby items. - **HytaleEventRegistry** interface allows Hytale modules to register ECS systems in registerEvents() without reflection. - **MCSoundsAPI** interface (extends SoundsAPI) with **playNBS(P, String)** and **stopNBS(P)** for Minecraft specific NoteBlock song playback. - **HTSoundsAPI** interface (extends SoundsAPI) with **playMIDI(P player, String midiId)** and **stopMIDI(P player)** for Hytale specific MIDI song playback. - **Deprecated SoundsAPI.playNBS**: use **MCSoundsAPI.playNBS** (Minecraft) or **HTSoundsAPI.playMIDI** (Hytale) instead. All changes are additive and require no modifications to existing 3.2 modules. CORE CHANGES - **/ba join** now opens a minigame categories menu before the arena list, grouping available arenas by minigame. - Added **use_categories** option in **play_menu.yml** (default: true). Set to false to restore the previous flat arena list behaviour.
