promotional bannermobile promotional banner

Orbis & Dungeons (RPG class mod)

The Evolution Update introduces a modular Race and Class system, allowing players to combine unique biological traits and combat specializations for permanent stats, weapon bonuses, and elemental resistances.

File Details

Orbis_and_Dungeons-2026.2.10-9611.jar

  • R
  • Feb 10, 2026
  • 129.00 KB
  • 968
  • Early Access

File Name

Orbis_and_Dungeons-2026.2.10-9611.jar

Supported Versions

  • Early Access

Version 2026.2.10 - Translation Priority Fix & Stability Patch

🐛 Bug Fix: UI Descriptions Not Updating from Config

Problem: When editing displayName or tagline in races_config.json / classes_config.json, the changes were not reflected in the UI. Both RaceSelectionPage and ClassSelectionPage were reading names and taglines exclusively from translation files (en.json, pt_br.json, etc.) via TranslationManager.translate(), completely ignoring the config values.

Root Cause: The config fields displayName and tagline were loaded into memory correctly (via RaceConfigLoader / ClassConfigLoader) but were never referenced by the UI code. The UI only used TranslationManager.translate("race.<id>.tagline") — which reads from language JSON files only.

Fix: Implemented a translation-first priority chain with config fallback:

Priority Source When Used
1st Current language translation file (e.g., chinese.json) If the key exists in the active language
2nd English translation file (en.json) Fallback if current language doesn't have the key
3rd Config JSON (races_config.json / classes_config.json) Fallback for new races/classes without translations
4th Raw ID Last resort if nothing else is available

 

This means:

  • Multilingual support works: /language set chinese → uses chinese.json translations when available
  • New custom races/classes work immediately: If a user adds a new race in config with tagline: "Master of Shadows" but no translation file has it yet, the UI displays the config text
  • Existing translations take priority: Prevents config overriding properly localized text

🔧 New API: TranslationManager.translateOrNull()

Added translateOrNull(String key) method that returns null instead of the raw key when no translation is found. This enables the priority chain pattern:

String tagline = TranslationManager.translateOrNull("race.orc.tagline");
if (tagline == null) {
    tagline = config.tagline; // fallback to config
}

🛡️ Critical Stability Fix: System.err Removal

Problem: TranslationManager contained 9 instances of System.err.println() and 1 e.printStackTrace(). In Hytale's plugin system, System.err outputs are classified as SEVERE and can kill the entire plugin.

Fix: All 10 occurrences replaced with System.out.println():

Location Original Fixed
extractDefaultLanguageFiles() System.err on IOException System.out
createEmptyLanguageFile() e.printStackTrace() System.out with message
loadAllTranslations() System.err × 3 (dir not found, no files, load fail) System.out × 3
loadLanguagePreference() System.err on IOException System.out
saveLanguagePreference() System.err on IOException System.out
translate() System.err on format failure System.out
getTranslation() System.err on missing key Removed entirely (silent)
setLanguage() System.err on unknown lang System.out

 

📁 Files Changed

File Changes
TranslationManager.java Replaced 9× System.errSystem.out, removed 1× e.printStackTrace(), added translateOrNull() method
RaceSelectionPage.java buildRaceButtons() + applyRaceToUI() — translation priority with config fallback
ClassSelectionPage.java Button building + applyClassToUI() — translation priority with config fallback

 

📋 Build Info

  • JAR: Orbis_and_Dungeons-2026.2.10-9611.jar
  • Java: 25 | Gradle: 9.3.1 | Hytale Server: 2026.02.06