Players were losing character data (inventory, armor, backpack) after
each launcher update because config.json corruption wiped the UUID
mapping. Same username, new UUID = server treats as new player.
Fix: UUIDs now stored in separate uuid-store.json that saveConfig()
can never touch. Added safety check to refuse destructive writes
when config file exists but loads empty. Includes 28 regression tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
JAVA_TOOL_OPTIONS -javaagent path was not quoted, causing JVM to
truncate at first space. Affects all users with spaces in install
path (e.g. "Hytale F2P Launcher").
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Migrate from downloading pre-patched server JARs from CDN to downloading
the DualAuth ByteBuddy Agent from GitHub releases. The server JAR stays
pristine - auth patching happens at runtime via -javaagent: flag.
clientPatcher.js:
- Replace patchServer() with ensureAgentAvailable()
- Download dualauth-agent.jar to Server/ directory
- Remove serverJarContainsDualAuth() and validateServerJarSize()
gameLauncher.js:
- Set JAVA_TOOL_OPTIONS env var with -javaagent: for runtime patching
- Update logging to show agent status instead of server patch count
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: comprehensive UUID/username persistence bug fixes
Major fixes for UUID/skin reset issues that caused players to lose cosmetics:
Core fixes:
- Username rename now preserves UUID (atomic rename, not new identity)
- Atomic config writes with backup/recovery system
- Case-insensitive UUID lookup with case-preserving storage
- Pre-launch validation blocks play if no username configured
- Removed saveUsername calls from launch/install flows
UUID Modal fixes:
- Fixed isCurrent badge showing on wrong user
- Added switch identity button to change between saved usernames
- Fixed custom UUID input using unsaved DOM username
- UUID list now refreshes when player name changes
- Enabled copy/paste in custom UUID input field
UI/UX improvements:
- Added translation keys for switch username functionality
- CSS user-select fix for UUID input fields
- Allowed Ctrl+V/C/X/A shortcuts in Electron
Files: config.js, gameLauncher.js, gameManager.js, playerManager.js,
launcher.js, settings.js, main.js, preload.js, style.css, en.json
See UUID_BUGS_FIX_PLAN.md for detailed bug list (18 bugs, 16 fixed)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(i18n): add switch username translations to all locales
Added translation keys for username switching functionality:
- notifications.noUsername
- notifications.switchUsernameSuccess
- notifications.switchUsernameFailed
- notifications.playerNameTooLong
- confirm.switchUsernameTitle
- confirm.switchUsernameMessage
- confirm.switchUsernameButton
Languages updated: de-DE, es-ES, fr-FR, id-ID, pl-PL, pt-BR, ru-RU, sv-SE, tr-TR
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: move UUID_BUGS_FIX_PLAN.md to docs folder
* docs: update UUID_BUGS_FIX_PLAN with complete fix details
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
The bundled libzstd.so is incompatible with glibc 2.41's stricter heap
validation, causing "free(): invalid pointer" crashes.
Solution: Automatically replace bundled libzstd.so with system version
on Linux. The launcher detects and symlinks to /usr/lib/libzstd.so.1.
- Auto-detect system libzstd at common paths (Arch, Debian, Fedora)
- Backup bundled version as libzstd.so.bundled
- Create symlink to system version
- Add HYTALE_NO_LIBZSTD_FIX=1 to disable if needed
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* modernized UI for GPU Preference option
* feat: auto-detect dedicated GPU on hybrid laptops (iGPU+dGPU)
* feat: detailed GPU info in auto-detection feature on startup
* feat: add GPU options for launcher
- Add GPU preference setting (Auto/Integrated/Dedicated)
- Implement Linux GPU selection with DRI_PRIME and NVIDIA env vars
- Add GPU detection using Electron's app.getGPUInfo()
- Update settings UI with GPU preference dropdown
- Integrate GPU preference into game launch process
* feat: auto-detect dedicated GPU on hybrid laptops (iGPU+dGPU)
* added fallbacks to and option to use integrated GPU.
* add package-lock and fix deps version
* changed 'Nvidia' string to 'NVIDIA'
* fix: selecting `dedicated` option while using nvidia GPU did not set its specific env variables
* remove unused `CONFIG_FILE` variable on launcher core modules
* fix: duplicated save-load gpu detection functions
* move game option settings to the top, while custom java to the bottom
* fix: settings-header margin-bottom from 3rem to 1rem and supress line-clamp warning
Added a full profile system and fixed a few critical mod loading issues.
What changed
Profiles — Implemented proper profile management (create, switch, delete). Each profile now has its own isolated mod list.
Mod Isolation — Fixed ModManager so mods are strictly scoped to the active profile. Browsing and installing only affects the selected profile.
Critical Fix — Fixed a path bug where mods were being saved to ~/AppData/Local on macOS (Windows path) instead of ~/Library/Application Support. Mods now save to the correct location and load correctly in-game.
Stability — Added an auto-sync step before every launch to make sure the physical mods folder always matches the active profile.
UI — Added a profile selector dropdown and a profile management modal.