From 615ee5cadc888db359ba1baf91b966e8e7c5b1fc Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 08:19:13 +0800 Subject: [PATCH 01/26] fix: resolve cross-platform EPERM permissions errors modManager.js: - Switch from hardcoded 'junction' to dynamic symlink type based on OS (fixing Linux EPERM). - Add retry logic for directory removal to handle file locking race conditions. - Improve broken symlink detection during profile sync. gameManager.js: - Implement retry loop (3 attempts) for game directory removal in updateGameFiles to prevent EBUSY/EPERM errors on Windows. paths.js: - Prevent fs.mkdirSync failure in getModsPath by pre-checking for broken symbolic links. --- backend/core/paths.js | 13 ++++++++++-- backend/managers/gameManager.js | 16 ++++++++++++++- backend/managers/modManager.js | 35 +++++++++++++++++++++++++-------- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/backend/core/paths.js b/backend/core/paths.js index 17a7b92..b6aa309 100644 --- a/backend/core/paths.js +++ b/backend/core/paths.js @@ -179,8 +179,17 @@ async function getModsPath(customInstallPath = null) { const profilesPath = path.join(userDataPath, 'Profiles'); if (!fs.existsSync(modsPath)) { - // Ensure the Mods directory exists - fs.mkdirSync(modsPath, { recursive: true }); + // Check for broken symlink to avoid EEXIST/EPERM on mkdir + let isBrokenLink = false; + try { + const stats = fs.lstatSync(modsPath); + if (stats.isSymbolicLink()) isBrokenLink = true; + } catch (e) { /* ignore */ } + + if (!isBrokenLink) { + // Ensure the Mods directory exists + fs.mkdirSync(modsPath, { recursive: true }); + } } if (!fs.existsSync(disabledModsPath)) { fs.mkdirSync(disabledModsPath, { recursive: true }); diff --git a/backend/managers/gameManager.js b/backend/managers/gameManager.js index 2fb8b62..963bbdd 100644 --- a/backend/managers/gameManager.js +++ b/backend/managers/gameManager.js @@ -365,7 +365,21 @@ async function updateGameFiles(newVersion, progressCallback, gameDir = GAME_DIR, if (fs.existsSync(gameDir)) { console.log('Removing old game files...'); - fs.rmSync(gameDir, { recursive: true, force: true }); + let retries = 3; + while (retries > 0) { + try { + fs.rmSync(gameDir, { recursive: true, force: true }); + break; + } catch (err) { + if ((err.code === 'EPERM' || err.code === 'EBUSY') && retries > 0) { + retries--; + console.log(`[UpdateGameFiles] Removal failed with ${err.code}, retrying in 1s... (${retries} retries left)`); + await new Promise(resolve => setTimeout(resolve, 1000)); + } else { + throw err; + } + } + } } fs.renameSync(tempUpdateDir, gameDir); diff --git a/backend/managers/modManager.js b/backend/managers/modManager.js index 7929e8a..631db7f 100644 --- a/backend/managers/modManager.js +++ b/backend/managers/modManager.js @@ -2,6 +2,7 @@ const fs = require('fs'); const path = require('path'); const crypto = require('crypto'); const axios = require('axios'); +const { getOS } = require('../utils/platformUtils'); const { getModsPath, getProfilesDir } = require('../core/paths'); const { saveModsToConfig, loadModsFromConfig } = require('../core/config'); const profileManager = require('./profileManager'); @@ -307,11 +308,16 @@ async function syncModsForCurrentProfile() { // 2. Symlink / Migration Logic let needsLink = false; + let globalStats = null; + + try { + globalStats = fs.lstatSync(globalModsPath); + } catch (e) { + // Path doesn't exist + } - if (fs.existsSync(globalModsPath)) { - const stats = fs.lstatSync(globalModsPath); - - if (stats.isSymbolicLink()) { + if (globalStats) { + if (globalStats.isSymbolicLink()) { const linkTarget = fs.readlinkSync(globalModsPath); // Normalize paths for comparison if (path.resolve(linkTarget) !== path.resolve(profileModsPath)) { @@ -319,7 +325,7 @@ async function syncModsForCurrentProfile() { fs.unlinkSync(globalModsPath); needsLink = true; } - } else if (stats.isDirectory()) { + } else if (globalStats.isDirectory()) { // MIGRATION: It's a real directory. Move contents to profile. console.log('[ModManager] Migrating global mods folder to profile folder...'); const files = fs.readdirSync(globalModsPath); @@ -349,7 +355,20 @@ async function syncModsForCurrentProfile() { // Remove the directory so we can link it try { - fs.rmSync(globalModsPath, { recursive: true, force: true }); + let retries = 3; + while (retries > 0) { + try { + fs.rmSync(globalModsPath, { recursive: true, force: true }); + break; + } catch (err) { + if ((err.code === 'EPERM' || err.code === 'EBUSY') && retries > 0) { + retries--; + await new Promise(resolve => setTimeout(resolve, 500)); + } else { + throw err; + } + } + } needsLink = true; } catch (e) { console.error('Failed to remove global mods dir:', e); @@ -364,8 +383,8 @@ async function syncModsForCurrentProfile() { if (needsLink) { console.log(`[ModManager] Creating symlink: ${globalModsPath} -> ${profileModsPath}`); try { - // 'junction' is key for Windows without admin - fs.symlinkSync(profileModsPath, globalModsPath, 'junction'); + const symlinkType = getOS() === 'windows' ? 'junction' : 'dir'; + fs.symlinkSync(profileModsPath, globalModsPath, symlinkType); } catch (err) { // If we can't create the symlink, try creating the directory first console.error('[ModManager] Failed to create symlink. Falling back to direct folder mode.'); From b99b22e8bfd9bcf7388cd0b726b0c899538f7905 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 09:23:15 +0800 Subject: [PATCH 02/26] fix: missing pacman builds --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04eabb7..d643760 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,6 +35,7 @@ jobs: dist/*.AppImage.blockmap dist/*.deb dist/*.rpm + dist/*.pacman dist/*.pkg.tar.zst dist/latest-linux.yml From 17e15c17f049711bcd3f6d0eb42ceba976003e6a Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 09:34:16 +0800 Subject: [PATCH 03/26] prepare release for 2.1.1 minor fix for EPERM error permission --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1b1fcf7..5937ba6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hytale-f2p-launcher", - "version": "2.1.0", + "version": "2.1.1", "description": "A modern, cross-platform launcher for Hytale with automatic updates and multi-client support", "homepage": "https://github.com/amiayweb/Hytale-F2P", "main": "main.js", From 653d4429ed5e58d09fea8bcc3dd27e2c4fefe2d1 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 09:36:03 +0800 Subject: [PATCH 04/26] prepare release 2.1.1 minor fix EPERM permission error --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12d6ac3..3a3df94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "hytale-f2p-launcher", - "version": "2.1.0", + "version": "2.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "hytale-f2p-launcher", - "version": "2.1.0", + "version": "2.1.1", "license": "MIT", "dependencies": { "adm-zip": "^0.5.10", From b668bdb45a7a735aaa27d6f919d4cc651cc56799 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 09:48:26 +0800 Subject: [PATCH 05/26] prepare release 2.1.1 --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3a7bcb2..1839f1a 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,13 @@
-

🎮 Hytale F2P Launcher | Cross-Platform Multiplayer 🖥️

+

🎮 Hytale F2P Launcher 🚀

+

💻 Cross-Platform Multiplayer 🖥️

Available for Windows 🪟, macOS 🍎, and Linux 🐧

An unofficial cross-platform launcher for Hytale with automatic updates and multiplayer support (all OS supported)

-![Version](https://img.shields.io/badge/Version-2.1.0-green?style=for-the-badge) +![Version](https://img.shields.io/badge/Version-2.1.1-green?style=for-the-badge) ![Platform](https://img.shields.io/badge/Platform-Windows%20%7C%20macOS%20%7C%20Linux-orange?style=for-the-badge) ![License](https://img.shields.io/badge/License-Educational-blue?style=for-the-badge) @@ -17,10 +18,10 @@ ### ⚠️ **READ [QUICK START](https://github.com/amiayweb/Hytale-F2P/tree/main?tab=readme-ov-file#-quick-start) before Downloading & Installing the Launcher!** ⚠️ -🛑 **Found a problem? Join the Discord and Select #Open-A-Ticket!: https://discord.gg/gME8rUy3MB** 🛑 +#### 🛑 **Found a problem? Join the Discord and Select #Open-A-Ticket!: https://discord.gg/gME8rUy3MB** 🛑

- If you like the project, feel free to support us via Buy Me a Coffee! + 👍 If you like the project, feel free to support us via Buy Me a Coffee!
Any support is appreciated and helps keep the project going.

From 375b422c732aa635832c93354994f19141836cdf Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 11:33:00 +0800 Subject: [PATCH 06/26] Update README.md Windows Prequisites for ARM64 builds --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1839f1a..ac43863 100644 --- a/README.md +++ b/README.md @@ -161,9 +161,15 @@ ### 🪟 Windows Prequisites -* **Java JDK 25:** Download via [Adoptium](https://adoptium.net/temurin/releases/?version=25) or [Oracle](https://www.oracle.com/java/technologies/downloads/#jdk25-windows) -* **Latest Visual Studio Redist:** Download via [Microsoft Visual C++ Redistributable](https://aka.ms/vc14/vc_redist.x64.exe) or [All-in-One by Techpowerup](https://www.techpowerup.com/download/visual-c-redistributable-runtime-package-all-in-one/) -* **ENABLE MULTIPLAYER:** // TODO MULTIPLAYER GUIDE; FIREWALL GUIDE AND SUCH +* ** +* **Java JDK 25:** + * [Oracle](https://www.oracle.com/java/technologies/downloads/#jdk25-windows), **no** support for Windows ARM64 in both version 25 and 21. + * [Adoptium](https://adoptium.net/temurin/releases/?version=25), has Windows ARM64 support in version 21 only. + * [Microsoft](https://learn.microsoft.com/en-us/java/openjdk/download), has Windows ARM64 support in version 25. + * Download from any vendor if your OS is not Windows with ARM64 architecture. +* **Latest Visual Studio Redist:** + * Download via [Microsoft Visual C++ Redistributable](https://aka.ms/vc14/vc_redist.x64.exe) + * Or [All-in-One by Techpowerup](https://www.techpowerup.com/download/visual-c-redistributable-runtime-package-all-in-one/) ### 🐧 Linux Prequisites From 20faf36b372317da8d58c8888603b626d907266b Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 12:01:46 +0800 Subject: [PATCH 07/26] fix: remove broken symlink after detected --- backend/core/paths.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/core/paths.js b/backend/core/paths.js index b6aa309..147bc46 100644 --- a/backend/core/paths.js +++ b/backend/core/paths.js @@ -187,9 +187,10 @@ async function getModsPath(customInstallPath = null) { } catch (e) { /* ignore */ } if (!isBrokenLink) { - // Ensure the Mods directory exists - fs.mkdirSync(modsPath, { recursive: true }); + fs.unlinkSync(modsPath); // Remove broken symlink } + // Ensure the Mods directory exists + fs.mkdirSync(modsPath, { recursive: true }); } if (!fs.existsSync(disabledModsPath)) { fs.mkdirSync(disabledModsPath, { recursive: true }); From 94d4586b97ae774190e50255a706dbc75278d133 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 12:09:48 +0800 Subject: [PATCH 08/26] fix: add pathexists for paths.js to check symlink --- backend/core/paths.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/backend/core/paths.js b/backend/core/paths.js index 147bc46..bd381b4 100644 --- a/backend/core/paths.js +++ b/backend/core/paths.js @@ -181,16 +181,26 @@ async function getModsPath(customInstallPath = null) { if (!fs.existsSync(modsPath)) { // Check for broken symlink to avoid EEXIST/EPERM on mkdir let isBrokenLink = false; + let pathExists = false; try { - const stats = fs.lstatSync(modsPath); - if (stats.isSymbolicLink()) isBrokenLink = true; - } catch (e) { /* ignore */ } + const stats = fs.lstatSync(modsPath); + pathExists = true; + if (stats.isSymbolicLink()) { + // Check if target exists + try { + fs.statSync(modsPath); + } catch { + isBrokenLink = true; + } + } + } catch (e) { /* path doesn't exist at all */ } if (!isBrokenLink) { fs.unlinkSync(modsPath); // Remove broken symlink } - // Ensure the Mods directory exists - fs.mkdirSync(modsPath, { recursive: true }); + if (!pathExists || isBrokenLink) { + fs.mkdirSync(modsPath, { recursive: true }); + } } if (!fs.existsSync(disabledModsPath)) { fs.mkdirSync(disabledModsPath, { recursive: true }); From eff6fcd520048d352bac70f181dc6b383567b2fc Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 12:24:24 +0800 Subject: [PATCH 09/26] fix: isbrokenlink should be true to remove the symlink --- backend/core/paths.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/core/paths.js b/backend/core/paths.js index bd381b4..78a5289 100644 --- a/backend/core/paths.js +++ b/backend/core/paths.js @@ -195,7 +195,7 @@ async function getModsPath(customInstallPath = null) { } } catch (e) { /* path doesn't exist at all */ } - if (!isBrokenLink) { + if (isBrokenLink) { fs.unlinkSync(modsPath); // Remove broken symlink } if (!pathExists || isBrokenLink) { From aed00cd0673da1f8b414733d4176d00bdf44f31c Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 13:52:18 +0800 Subject: [PATCH 10/26] add arch package .pkg.tar.zst for release --- .github/workflows/release.yml | 48 ++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d643760..1e2845b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,6 +9,51 @@ on: workflow_dispatch: jobs: + build-arch: + runs-on: ubuntu-latest + + container: + image: archlinux:latest + + steps: + - name: Install base packages + run: | + pacman -Syu --noconfirm + pacman -S --noconfirm \ + base-devel \ + git \ + nodejs \ + npm \ + rpm-tools \ + libxcrypt-compat + + - name: Create build user + run: | + useradd -m builder + echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers + + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Fix permissions + run: chown -R builder:builder . + + - name: Build Arch Package + run: | + sudo -u builder bash << 'EOF' + set -e + makepkg -s --noconfirm + EOF + - uses: actions/upload-artifact@v4 + with: + name: arch-package + path: | + *.pkg.tar.zst + *.src.tar.zst + .SRCINFO + build-linux: runs-on: ubuntu-latest steps: @@ -36,7 +81,6 @@ jobs: dist/*.deb dist/*.rpm dist/*.pacman - dist/*.pkg.tar.zst dist/latest-linux.yml build-windows: @@ -115,6 +159,8 @@ jobs: # If it's the 'release' branch, use 'v2.0.2-beta.r42' # name: ${{ github.ref_type == 'tag' && github.ref_name || format('v{0}-beta.r{1}', steps.pkg_version.outputs.VERSION, github.run_number) }} files: | + artifacts/arch-package/*.pkg.tar.zst + artifacts/arch-package/*.src.tar.zst artifacts/linux-builds/**/* artifacts/windows-builds/**/* artifacts/macos-builds/**/* From b39877f5612a2bbd8cecda3b107cc79f02d5b456 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 17:46:40 +0800 Subject: [PATCH 11/26] fix: release workflow for build-arch and build-linux * build-arch job now only build arch .pkg.tar.zst package instead of the whole generic linux. * build-linux job now exclude .pacman package since its deprecated and should not be used. --- .github/workflows/release.yml | 154 +++++++++++++++++----------------- 1 file changed, 78 insertions(+), 76 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1e2845b..ee466e9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,80 +9,6 @@ on: workflow_dispatch: jobs: - build-arch: - runs-on: ubuntu-latest - - container: - image: archlinux:latest - - steps: - - name: Install base packages - run: | - pacman -Syu --noconfirm - pacman -S --noconfirm \ - base-devel \ - git \ - nodejs \ - npm \ - rpm-tools \ - libxcrypt-compat - - - name: Create build user - run: | - useradd -m builder - echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers - - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Fix permissions - run: chown -R builder:builder . - - - name: Build Arch Package - run: | - sudo -u builder bash << 'EOF' - set -e - makepkg -s --noconfirm - EOF - - uses: actions/upload-artifact@v4 - with: - name: arch-package - path: | - *.pkg.tar.zst - *.src.tar.zst - .SRCINFO - - build-linux: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Install build dependencies - run: | - sudo apt-get update - sudo apt-get install -y libarchive-tools - - - uses: actions/setup-node@v4 - with: - node-version: '22' - cache: 'npm' - - run: npm ci - - - name: Build Linux Packages - run: | - npx electron-builder --linux --x64 --arm64 --publish never - - uses: actions/upload-artifact@v4 - with: - name: linux-builds - path: | - dist/*.AppImage - dist/*.AppImage.blockmap - dist/*.deb - dist/*.rpm - dist/*.pacman - dist/latest-linux.yml - build-windows: runs-on: windows-latest steps: @@ -123,8 +49,82 @@ jobs: dist/*.zip dist/latest-mac.yml + build-linux: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install build dependencies + run: | + sudo apt-get update + sudo apt-get install -y libarchive-tools + + - uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'npm' + - run: npm ci + + - name: Build Linux Packages + run: | + npx electron-builder --linux AppImage deb rpm --x64 --arm64 --publish never + - uses: actions/upload-artifact@v4 + with: + name: linux-builds + path: | + dist/*.AppImage + dist/*.AppImage.blockmap + dist/*.deb + dist/*.rpm + dist/latest-linux.yml + + build-arch: + runs-on: ubuntu-latest + container: + image: archlinux:latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install base packages + run: | + pacman -Syu --noconfirm + pacman -S --noconfirm \ + base-devel \ + git \ + nodejs \ + npm \ + rpm-tools \ + libxcrypt-compat + + - name: Create build user + run: | + useradd -m builder + echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers + + - name: Fix Permissions + run: chown -R builder:builder . + + - name: Build Arch Package + run: | + sudo -u builder bash << 'EOF' + set -e + makepkg --printsrcinfo > .SRCINFO + makepkg -s --noconfirm + EOF + + - name: Upload Arch Package + uses: actions/upload-artifact@v4 + with: + name: arch-package + path: | + *.pkg.tar.zst + *.src.tar.zst + .SRCINFO + release: - needs: [build-linux, build-windows, build-macos] + needs: [build-windows, build-macos, build-linux, build-arch] runs-on: ubuntu-latest if: | startsWith(github.ref, 'refs/tags/v') || @@ -154,13 +154,15 @@ jobs: - name: Create Release uses: softprops/action-gh-release@v2 with: + tag_name: ${{ github.ref_name }} # If it's a tag, use the tag. - tag_name: ${{ github.ref_type == 'tag' && github.ref_name || format('v{0}.r{1}', steps.pkg_version.outputs.VERSION, github.run_number) }} + # tag_name: ${{ github.ref_type == 'tag' && github.ref_name || format('v{0}.r{1}', steps.pkg_version.outputs.VERSION, github.run_number) }} # If it's the 'release' branch, use 'v2.0.2-beta.r42' # name: ${{ github.ref_type == 'tag' && github.ref_name || format('v{0}-beta.r{1}', steps.pkg_version.outputs.VERSION, github.run_number) }} files: | artifacts/arch-package/*.pkg.tar.zst artifacts/arch-package/*.src.tar.zst + artifacts/arch-package/.SRCINFO artifacts/linux-builds/**/* artifacts/windows-builds/**/* artifacts/macos-builds/**/* From 131de1dcd7210aa58c31c1940e25528e68aa0981 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 17:56:44 +0800 Subject: [PATCH 12/26] fix: removes pacman build as it replaced by tar.zst and adds build:arch shortcut for pkgbuild --- package.json | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 5937ba6..83a319b 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,11 @@ "build:win": "electron-builder --win", "build:linux": "electron-builder --linux", "build:mac": "electron-builder --mac", - "build:all": "electron-builder --win --linux --mac" + "build:all": "electron-builder --win --linux --mac", + "build:arch": "electron-builder --linux dir", + "build:appimage": "electron-builder --linux AppImage --publish never", + "build:deb": "electron-builder --linux deb --publish never", + "build:rpm": "electron-builder --linux rpm --publish never" }, "keywords": [ "hytale", @@ -82,7 +86,7 @@ ] } ], - "icon": "icon.ico" + "icon": "build/icon.ico" }, "linux": { "target": [ @@ -106,13 +110,6 @@ "x64", "arm64" ] - }, - { - "target": "pacman", - "arch": [ - "x64", - "arm64" - ] } ], "icon": "build/icon.png", From 78f76afe0a2e0d6525f373c627768852b41c61ab Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 18:20:37 +0800 Subject: [PATCH 13/26] aur: add proper VCS (-git) PKGBUILD created clean VCS-based PKGBUILD following arch packaging conventions. this explicitly marked as a rolling (-git) build and derives its version dynamically from git tags and commit history via pkgver(). previous hybrid approach has been changed. key changes: - use -git suffix to clearly indicate rolling source builds - set pkgver=0 and compute the actual version via pkgver() - build only a directory layout using electron-builder (--dir) - avoid generating AppImage, deb, rpm, or pacman installers - align build and package steps with Arch packaging guidelines note: this PKGBUILD is intended for development and AUR use only and is not suitable for binary redistribution or release artifacts. --- PKGBUILD | 33 --------------------------------- PKGBUILD-git | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 33 deletions(-) delete mode 100644 PKGBUILD create mode 100644 PKGBUILD-git diff --git a/PKGBUILD b/PKGBUILD deleted file mode 100644 index 12f6707..0000000 --- a/PKGBUILD +++ /dev/null @@ -1,33 +0,0 @@ -# Maintainer: Terromur -pkgname=Hytale-F2P-git -_pkgname=Hytale-F2P -pkgver=2.0.12.r150.gb62ffc1 -pkgrel=1 -pkgdesc="Hytale-F2P - unofficial Hytale Launcher for free to play with multiplayer support" -arch=('x86_64') -url="https://github.com/amiayweb/Hytale-F2P" -license=('custom') -makedepends=('npm' 'git' 'rpm-tools' 'libxcrypt-compat') -source=("git+$url.git" "Hytale-F2P.desktop") -sha256sums=('SKIP' '46488fada4775d9976d7b7b62f8d1f1f8d9a9a9d8f8aa9af4f2e2153019f6a30') - -pkgver() { - cd "$_pkgname" - version=$(git describe --abbrev=0 --tags --match "v[0-9]*") - commits=$(git rev-list --count HEAD) - hash=$(git rev-parse --short HEAD) - printf "%s.r%s.g%s" "${version#v}" "$commits" "$hash" -} - -build() { - cd "$_pkgname" - npm ci - npm run build:linux -} - -package() { - mkdir -p "$pkgdir/opt/$_pkgname" - cp -r "$_pkgname/dist/linux-unpacked/"* "$pkgdir/opt/$_pkgname" - install -Dm644 "$_pkgname.desktop" "$pkgdir/usr/share/applications/$_pkgname.desktop" - install -Dm644 "$_pkgname/GUI/icon.png" "$pkgdir/usr/share/icons/hicolor/256x256/apps/$_pkgname.png" -} diff --git a/PKGBUILD-git b/PKGBUILD-git new file mode 100644 index 0000000..26da67a --- /dev/null +++ b/PKGBUILD-git @@ -0,0 +1,33 @@ +# Maintainer: Terromur +pkgname=Hytale-F2P-git +_pkgname=Hytale-F2P +pkgver=0 +pkgrel=1 +pkgdesc="Hytale-F2P - Unofficial Hytale Launcher for free to play with multiplayer support (rolling git build)" +arch=('x86_64') +url="https://github.com/amiayweb/Hytale-F2P" +license=('custom') +depends=('gtk3' 'nss' 'libxcrypt-compat') +makedepends=('git' 'npm') +source=("git+$url.git" "$_pkgname.desktop") +sha256sums=('SKIP' '46488fada4775d9976d7b7b62f8d1f1f8d9a9a9d8f8aa9af4f2e2153019f6a30') + +pkgver() { + cd "$srcdir/$_pkgname" + git describe --tags --long | sed 's/^v//;s/-/.r/;s/-/./' +} + +build() { + cd "$srcdir/$_pkgname" + npm ci + npm run build:arch +} + +package() { + cd "$srcdir/$_pkgname" + install -d "$pkgdir/opt/$_pkgname" + cp -r "$_pkgname/dist/linux-unpacked/"* "$pkgdir/opt/$_pkgname" + + install -Dm644 "$srcdir/$_pkgname.desktop" "$pkgdir/usr/share/applications/$_pkgname.desktop" + install -Dm644 GUI/icon.png "$pkgdir/usr/share/icons/hicolor/256x256/apps/$_pkgname.png" +} From e4266906328574660ed65d9aa9b3e0330fc92ede Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 18:33:07 +0800 Subject: [PATCH 14/26] ci: add fixed-version PKGBUILD for Arch Linux releases this PKGBUILD intended for CI and GitHub release artifacts. targets tagged releases only and uses a fixed pkgver that matches the corresponding git tag. all of the VCS logic has been removed to PKGBUILD-git to ensure reproducible builds and stable versioning suitable for binary distribution. the build process relies on electron-builder directory output (--dir) and packages only the unpacked application into a standard Arch Linux package (.pkg.tar.zst). other distro format are excluded from this path and handled separately. this change establishes a clear separation between: - rolling AUR development builds (-git) - CI-generated, versioned Arch Linux release packages the result is predictable artifact naming, correct version alignment, and Arch-compliant packaging for downstream users. --- PKGBUILD | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 PKGBUILD diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 0000000..5eea283 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,27 @@ +# Maintainer: Fazri Gading +# This PKGBUILD is for Github Releases +pkgname=Hytale-F2P +pkgver=2.1.1 +pkgrel=1 +pkgdesc="Hytale-F2P - unofficial Hytale Launcher for free to play with multiplayer support" +arch=('x86_64') +url="https://github.com/amiayweb/Hytale-F2P" +license=('custom') +depends=('gtk3' 'nss' 'libxcrypt-compat') +makedepends=('npm') +source=("$url/archive/v$pkgver.tar.gz" "Hytale-F2P.desktop") +sha256sums=('SKIP' '46488fada4775d9976d7b7b62f8d1f1f8d9a9a9d8f8aa9af4f2e2153019f6a30') + +build() { + cd "$_pkgname-$pkgver" + npm ci + npm run build:arch +} + +package() { + cd "$_pkgname-$pkgver" + install -d "$pkgdir/opt/$_pkgname" + cp -r dist/linux-unpacked/* "$pkgdir/opt/$_pkgname" + install -Dm644 "$srcdir/$_pkgname.desktop" "$pkgdir/usr/share/applications/$_pkgname.desktop" + install -Dm644 GUI/icon.png "$pkgdir/usr/share/icons/hicolor/256x256/apps/$_pkgname.png" +} From 75a450c9ecd8057442895627ffecbe01bc4765c2 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Mon, 26 Jan 2026 18:54:53 +0800 Subject: [PATCH 15/26] Update README.md adds information for Arch build --- README.md | 58 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index ac43863..b172ce6 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ Windows 10/11 (64-bit; X64/ARM64) | Linux (x64/ARM64) | macOS (Apple Silicon only)
- ⚠️ Note: macOS Intel (x86) is not yet supported 1 + ⚠️ Note: macOS Intel (x86) is not yet supported 1 @@ -131,7 +131,7 @@ 🧠 RAM - 8GB (Dedicated) / 12GB (iGPU) + 8GB (dGPU)2 /
12GB (iGPU)3 16 GB 32 GB @@ -156,7 +156,9 @@
-

1 Hytale did not provide game files for macOS Intel, yet.

+

Note 1 Hytale did not provide game files for macOS Intel, yet.

+

Note 2 Using Discrete/Dedicated GPU (dGPU) must have 8 GB RAM minimum.

+

Note 3 Using Integrated GPU (dGPU) must have 12 GB RAM minimum.

@@ -209,24 +211,36 @@ 3. **Permissions & Execution:** * **AppImage:** Make the file executable and run it: ```bash - chmod +x Hytale-F2P-Launcher.AppImage - ./Hytale-F2P-Launcher.AppImage + chmod +x hytale-f2p-launcher.AppImage + ./hytale-f2p-launcher.AppImage ``` - * **Fedora (dnf):** Install the RPM: + * **Ubuntu/Debian-based or Fedora/RHEL-based:** Install the DEB/RPM: ```bash - sudo dnf install ./Hytale-F2P-Launcher.rpm - ``` - * **Debian/Ubuntu (apt):** Install the DEB: - ```bash - sudo apt install ./Hytale-F2P-Launcher.deb + # Fedora/RHEL-based + sudo dnf install ./hytale-f2p-launcher.rpm + # Debian/Ubuntu + sudo apt install ./hytale-f2p-launcher.deb ``` * **Arch Linux (pacman):** Install the package using: ```bash - sudo pacman -U /path/to/Hytale-F2P-Launcher.pkg.tar.zst + # Stable Build + sudo pacman -U hytale-f2p-launcher.pkg.tar.zst + # Development Build + yay -S hytale-f2p-git # or + paru -S hytale-f2p-git + # Manual Build + git clone https://aur.archlinux.org/hytale-f2p-git.git + cd hytale-f2p-git + makepkg -si ``` + +> [!NOTE] +> Make sure to adjust the filename correctly with the version and the architecture type. + 4. **Troubleshooting:** * **FUSE:** If the AppImage fails to launch on newer distributions, ensure `libfuse2` (or `fuse2` on Arch/Fedora) is installed. * **Desktop Entry:** After installing via `.rpm`, `.deb`, or `.pkg.tar.zst`, the launcher should automatically appear in your App Library/Grid. + * Missing libxcrypt.so.1: Install `libxcrypt-compat` using your package manager --- @@ -292,20 +306,20 @@ See [BUILD.md](BUILD.md) for comprehensive build instructions. ## 📋 Changelog -### 🆕 v2.1.0 - -- 🚨 **Auto-Retry Downloads and Auto-Patch Files** — -- ⚡ **Hardware Acceleration** — -- 👨‍💻 **In-App Logging** — -- 🛠️ **Repair Button** — Y -- 🔎 **Browse CurseForge Mods** — Browsing mods now easier with our dedicated CurseForge API Key. -- 🌎 **Fixes and Release New Translation** — Fixed 🇪🇸 🇧🇷 and added more translation for current build. Turkish 🇹🇷 language now added. - - +### 🆕 v2.1.1 +- 🛠️ **Fix EPERM** Issue +- 🅰️ **Adds Better Arch Build** +-
Click here to see older Changelogs +### 🆕 v2.1.0 +- 🚨 **Auto-Retry Downloads and Auto-Patch Files** — +- ⚡ **Hardware Acceleration** — +- 🔎 **Browse CurseForge Mods** — Browsing mods now easier with our dedicated CurseForge API Key. +- 🌎 **Fixes and Release New Translation** — Fixed 🇪🇸 🇧🇷 and added more translation for current build. Turkish 🇹🇷 language now added. + ### 🆕 v2.0.2b *(Minor Update: Performance & Utilities)* - 🌎 **Language Translation** — A big welcome for Spanish 🇪🇸 and Portuguese (Brazil) 🇧🇷 players! **Language setting can be found in the bottom part of Settings pane.** - 💻 **Laptop/Hybrid GPU Performance Issue Fix** — Added automatic GPU detection system and options to choose which GPU will be used for the game, *specifically for Linux users*. From 081ac926e36aa490a51afe9b220bb46dbb45fae8 Mon Sep 17 00:00:00 2001 From: TalesAmaral <57869141+TalesAmaral@users.noreply.github.com> Date: Mon, 26 Jan 2026 11:49:39 -0300 Subject: [PATCH 16/26] Update README.md BUILD.md location was changed and now this link is poiting to nothing --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ac43863..0b2036c 100644 --- a/README.md +++ b/README.md @@ -286,7 +286,7 @@ The `.zip` version is useful for users who prefer a portable installation or nee ## 🛠️ Building from Source -See [BUILD.md](BUILD.md) for comprehensive build instructions. +See [BUILD.md](docs/BUILD.md) for comprehensive build instructions. --- From cc1c6c334c5ce0f01200a75b6483ce728c000303 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Tue, 27 Jan 2026 00:14:53 +0800 Subject: [PATCH 17/26] Update PKGBUILD --- PKGBUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/PKGBUILD b/PKGBUILD index 5eea283..1bcb516 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -1,3 +1,4 @@ +# Maintainer: Terromur # Maintainer: Fazri Gading # This PKGBUILD is for Github Releases pkgname=Hytale-F2P From 782845463128bfb7c76b3e0b11523a6bb3f3ff04 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Tue, 27 Jan 2026 00:15:25 +0800 Subject: [PATCH 18/26] Update PKGBUILD-git --- PKGBUILD-git | 1 + 1 file changed, 1 insertion(+) diff --git a/PKGBUILD-git b/PKGBUILD-git index 26da67a..d3e690d 100644 --- a/PKGBUILD-git +++ b/PKGBUILD-git @@ -1,4 +1,5 @@ # Maintainer: Terromur +# Maintainer: Fazri Gading pkgname=Hytale-F2P-git _pkgname=Hytale-F2P pkgver=0 From f4d966ee65b2bbd96a94dc0d107a52b6ff54cdb5 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Tue, 27 Jan 2026 02:16:01 +0800 Subject: [PATCH 19/26] chore: fix ubuntu/debian part in README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c85885c..b35c9e4 100644 --- a/README.md +++ b/README.md @@ -217,9 +217,10 @@ * **Ubuntu/Debian-based or Fedora/RHEL-based:** Install the DEB/RPM: ```bash # Fedora/RHEL-based - sudo dnf install ./hytale-f2p-launcher.rpm + sudo dnf install hytale-f2p-launcher.rpm # Debian/Ubuntu - sudo apt install ./hytale-f2p-launcher.deb + sudo apt install -y libasound2 libpng16-16 libpng-dev libicu76 + sudo dpkg -i hytale-f2p-launcher.deb ``` * **Arch Linux (pacman):** Install the package using: ```bash @@ -235,7 +236,7 @@ ``` > [!NOTE] -> Make sure to adjust the filename correctly with the version and the architecture type. +> Make sure to adjust the filename correctly with the version and the architecture type. TIP: Use `cd` command to the package location. 4. **Troubleshooting:** * **FUSE:** If the AppImage fails to launch on newer distributions, ensure `libfuse2` (or `fuse2` on Arch/Fedora) is installed. From e7023dcf95a57487afc7874591619f2277e7a9e1 Mon Sep 17 00:00:00 2001 From: walti0 <95646872+walti0@users.noreply.github.com> Date: Mon, 26 Jan 2026 20:06:16 +0100 Subject: [PATCH 20/26] Polish language support (#195) --- GUI/js/i18n.js | 3 +- GUI/locales/pl-PL.json | 234 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 GUI/locales/pl-PL.json diff --git a/GUI/js/i18n.js b/GUI/js/i18n.js index faf6847..b2ec9e0 100644 --- a/GUI/js/i18n.js +++ b/GUI/js/i18n.js @@ -6,7 +6,8 @@ const i18n = (() => { { code: 'en', name: 'English' }, { code: 'es-ES', name: 'Español (España)' }, { code: 'pt-BR', name: 'Portuguese (Brazil)' }, - { code: 'tr-TR', name: 'Turkish (Turkey)' } + { code: 'tr-TR', name: 'Turkish (Turkey)' }, + { code: 'pl-PL', name: 'Polish (Poland)' } ]; // Load single language file diff --git a/GUI/locales/pl-PL.json b/GUI/locales/pl-PL.json new file mode 100644 index 0000000..7d03edf --- /dev/null +++ b/GUI/locales/pl-PL.json @@ -0,0 +1,234 @@ +{ + "nav": { + "play": "Graj", + "mods": "Mody", + "news": "Wiadomości", + "chat": "Chat z graczami", + "settings": "Ustawienia", + "skins": "Skiny" + }, + "header": { + "playersLabel": "Graczy:", + "manageProfiles": "Zarządzaj Profilami", + "defaultProfile": "Domyślny", + "f2p": "FREE TO PLAY" + }, + "install": { + "title": "FREE TO PLAY LAUNCHER", + "playerName": "Nazwa Gracza", + "playerNamePlaceholder": "Wprowadź Nazwę", + "customInstallation": "Dostosuj Instalacje", + "installationFolder": "Folder docelowy", + "pathPlaceholder": "Domyślna lokalizacja", + "browse": "Przeglądaj", + "installButton": "ZAINSTALUJ HYTALE", + "installing": "INSTALOWANIE..." + }, + "play": { + "ready": "GOTOWE", + "subtitle": "Uruchom Hytale i rozpocznij przygodę", + "playButton": "GRAJ W HYTALE", + "latestNews": "NAJNOWSZE WIADOMOŚCI", + "viewAll": "ZOBACZ CAŁOŚĆ", + "checking": "SPRAWDZANIE...", + "play": "GRAJ" + }, + "mods": { + "searchPlaceholder": "Wyszukaj mody...", + "myMods": "MOJE MODY", + "previous": "POPRZEDNIA", + "next": "NASTĘPNA", + "page": "Strona", + "of": "z", + "modalTitle": "MOJE MODY", + "noModsFound": "Nie Znaleziono Modów", + "noModsFoundDesc": "Spróbuj dostosować wyszukiwanie", + "noModsInstalled": "Brak Zainstalowanych Modów", + "noModsInstalledDesc": "Dodaj mody z CurseForge lub zaimportuj lokalne pliki", + "view": "WIDOK", + "install": "ZAINSTALUJ", + "installed": "ZAINSTALOWANE", + "enable": "WŁĄCZ", + "disable": "WYŁĄCZ", + "active": "AKTYWNE", + "disabled": "WYŁĄCZONE", + "delete": "Usuń mod", + "noDescription": "Brak opisu", + "confirmDelete": "Czy na pewno chcesz usunąć \"{name}\"?", + "confirmDeleteDesc": "Tej czynności nie można cofnąć.", + "confirmDeletion": "Potwierdź" + }, + "news": { + "title": "WSZYSTKIE WIADOMOŚCI", + "readMore": "Zobacz Więcej" + }, + "chat": { + "title": "Chat z graczami", + "pickColor": "Kolor", + "inputPlaceholder": "Wprowadź swoją wiadomość...", + "send": "Wyślij", + "online": "online", + "charCounter": "{current}/{max}", + "secureChat": "Bezpieczny czat – Linki są ocenzurowane", + "joinChat": "Dołącz do Czatu", + "chooseUsername": "Wybierz nazwę użytkownika, aby dołączyć do Czatu z graczami", + "username": "Nazwa Gracza", + "usernamePlaceholder": "Wprowadź swoją nazwę...", + "usernameHint": "Między 3-20 znaków, tylko litery, cyfry i znaki - i _", + "joinButton": "Dołącz do Czatu", + "colorModal": { + "title": "Dostosuj Kolor Użytkownika", + "chooseSolid": "Wybierz jednolity kolor:", + "customColor": "Kolor niestandardowy:", + "preview": "Podgląd:", + "previewUsername": "Nazwa", + "apply": "Zastosuj Kolor" + } + }, + "settings": { + "title": "USTAWIENIA", + "java": "Środowisko Java", + "useCustomJava": "Użyj niestandardowej ścieżki Java", + "javaDescription": "Zastąp dołączone środowisko wykonawcze Java własnym", + "javaPath": "Ścieżka Wykonywalna Java", + "javaPathPlaceholder": "Wybierz ścieżkę Java...", + "javaBrowse": "Przeglądaj", + "javaHint": "Wybierz folder instalacyjny Java (obsługiwane Windows, Mac, Linux)", + "discord": "Integracja z Discordem", + "enableRPC": "Włącz Discord Rich Presence", + "discordDescription": "Pokaż swoją aktywność na Discordzie", + "game": "Opcje gry", + "playerName": "Nazwa Gracza", + "playerNamePlaceholder": "Wprowadź swoją nazwę", + "playerNameHint": "Ta nazwa będzie używana w grze (1-16 znaków)", + "openGameLocation": "Otwórz Lokalizację Gry", + "openGameLocationDesc": "Otwórz folder instalacyjny gry", + "account": "Zarządzanie identyfikatorami UUID gracza", + "currentUUID": "Obecny UUID", + "uuidPlaceholder": "Ładowanie UUID...", + "copyUUID": "Skopiuj UUID", + "regenerateUUID": "Generuj UUID", + "uuidHint": "Twój unikalny identyfikator gracza dla tej nazwy użytkownika", + "manageUUIDs": "Zarządzaj wszystkimi UUID", + "manageUUIDsDesc": "Wyświetl i zarządzaj wszystkimi identyfikatorami UUID graczy", + "language": "Język", + "selectLanguage": "Wybierz Język", + "repairGame": "Napraw Grę", + "reinstallGame": "Zainstaluj ponownie pliki gry (zachowuje dane)", + "gpuPreference": "Preferencje GPU", + "gpuHint": "Wybierz preferowany procesor graficzny (Linux: wpływa na DRI_PRIME)", + "gpuAuto": "Auto", + "gpuIntegrated": "Zintegrowana", + "gpuDedicated": "Dedykowana", + "logs": "SYSTEM LOGS", + "logsCopy": "Kopiuj", + "logsRefresh": "Odśwież", + "logsFolder": "Otwórz Folder", + "logsLoading": "Ładowanie logów..." + }, + "uuid": { + "modalTitle": "Zarządzanie UUID", + "currentUserUUID": "Aktualny UUID użytkownika", + "allPlayerUUIDs": "Wszystkie identyfikatory UUID graczy", + "generateNew": "Wygeneruj nowy UUID", + "loadingUUIDs": "Ładowanie UUID...", + "setCustomUUID": "Ustaw niestandardowy UUID", + "customPlaceholder": "Wprowadź niestandardowy UUID (format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)", + "setUUID": "Ustaw UUID", + "warning": "Ostrzeżenie: Ustawienie niestandardowego identyfikatora UUID spowoduje zmianę Twojego obecnego identyfikatora gracza", + "copyTooltip": "Kopiuj UUID", + "regenerateTooltip": "Wygeneruj nowy UUID" + }, + "profiles": { + "modalTitle": "Zarządzaj Profilami", + "newProfilePlaceholder": "Nowa Nazwa Profilu", + "createProfile": "Utwórz Profil" + }, + "discord": { + "notificationText": "Dołącz do naszej społeczności Discord!", + "joinButton": "Dołącz Discord" + }, + "skins": { + "title": "Skiny", + "comingSoon": "Personalizacja skórek już wkrótce..." + }, + "common": { + "confirm": "Potwierdź", + "cancel": "Anuluj", + "save": "Zapisz", + "close": "Zamknij", + "delete": "Usuń", + "edit": "Edytuj", + "loading": "Ładowanie...", + "apply": "Zastosuj" + }, + "notifications": { + "gameDataNotFound": "Błąd: Nie znaleziono danych gry", + "gameUpdatedSuccess": "Gra została zaktualizowana pomyślnie! 🎉", + "updateFailed": "Aktualizacja nie powiodła się: {error}", + "updateError": "Błąd aktualizacji: {error}", + "discordEnabled": "Discord Rich Presence włączony", + "discordDisabled": "Discord Rich Presence wyłączony", + "discordSaveFailed": "Nie udało się zapisać ustawień Discorda", + "playerNameRequired": "Proszę podać prawidłową nazwę gracza", + "playerNameSaved": "Nazwa gracza została zapisana pomyślnie", + "playerNameSaveFailed": "Nie udało się zapisać nazwy gracza", + "uuidCopied": "Identyfikator UUID skopiowany do schowka!", + "uuidCopyFailed": "Nie udało się skopiować UUID", + "uuidRegenNotAvailable": "Ponowna gerowanie UUID niedostępne", + "uuidRegenFailed": "Nie udało się ponownie wygenerować UUID", + "uuidGenerated": "Nowy UUID został pomyślnie wygenerowany!", + "uuidGeneratedShort": "Wygenerowano nowy UUID!", + "uuidGenerateFailed": "Nie udało się wygenerować nowego UUID", + "uuidRequired": "Wprowadzić UUID", + "uuidInvalidFormat": "Nieprawidłowy format UUID", + "uuidSetFailed": "Nie udało się ustawić niestandardowego UUID", + "uuidSetSuccess": "Niestandardowy UUID został ustawiony pomyślnie!", + "uuidDeleteFailed": "Nie udało się usunąć UUID", + "uuidDeleteSuccess": "UUID został pomyślnie usunięty!", + "modsDownloading": "Pobieranie {name}...", + "modsTogglingMod": "Przełączanie moda...", + "modsDeletingMod": "Usuwanie moda...", + "modsLoadingMods": "Ładowanie modów z CurseForge...", + "modsInstalledSuccess": "{name} zainstalowany pomyślnie! 🎉", + "modsDeletedSuccess": "{name} usunięto pomyślnie", + "modsDownloadFailed": "Nie udało się pobrać moda: {error}", + "modsToggleFailed": "Nie udało się przełączyć moda: {error}", + "modsDeleteFailed": "Nie udało się usunąć moda: {error}", + "modsModNotFound": "Nie znaleziono informacji o modzie" + }, + "confirm": { + "defaultTitle": "Potwierdź działanie", + "regenerateUuidTitle": "Wygeneruj nowy UUID", + "regenerateUuidMessage": "Czy na pewno chcesz wygenerować nowy UUID? To spowoduje zmianę Twojego identyfikatora gracza.", + "regenerateUuidButton": "Generuj", + "setCustomUuidTitle": "Ustaw niestandardowy UUID", + "setCustomUuidMessage": "Czy na pewno chcesz ustawić ten UUID? To spowoduje zmianę Twojego identyfikatora gracza.", + "setCustomUuidButton": "Ustaw UUID", + "deleteUuidTitle": "Usuń UUID", + "deleteUuidMessage": "Czy na pewno chcesz usunąć UUID dla \"{username}\"? Tej czynności nie można cofnąć.", + "deleteUuidButton": "Usuń", + "uninstallGameTitle": "Odinstaluj grę", + "uninstallGameMessage": "Czy na pewno chcesz odinstalować Hytale? Wszystkie pliki gry zostaną usunięte.", + "uninstallGameButton": "Odinstaluj" + }, + "progress": { + "initializing": "Inicjalizacja...", + "downloading": "Pobieranie...", + "installing": "Instalowanie...", + "extracting": "Ekstraktowanie...", + "verifying": "Weryfikowanie...", + "switchingProfile": "Przełączanie profilu...", + "profileSwitched": "Profil zmieniony!", + "startingGame": "Uruchamianie gry...", + "launching": "URUCHAMIANIE...", + "uninstallingGame": "Odinstalowywanie gry...", + "gameUninstalled": "Gra została pomyślnie odinstalowana!", + "uninstallFailed": "Odinstalowanie nie powiodło się: {error}", + "startingUpdate": "Rozpoczynanie obowiązkowej aktualizacji gry...", + "installationComplete": "Instalacja zakończona pomyślnie!", + "installationFailed": "Instalacja nie powiodła się: {error}", + "installingGameFiles": "Instalowanie plików gry...", + "installComplete": "Instalacja zakończona!" + } +} From 6fa933fece1de0b3ec7f2e8afaf0a45a573f2047 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Tue, 27 Jan 2026 03:19:06 +0800 Subject: [PATCH 21/26] Update support_request.yml Added hardware specification --- .github/ISSUE_TEMPLATE/support_request.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/support_request.yml b/.github/ISSUE_TEMPLATE/support_request.yml index 71d98e1..53dfe8d 100644 --- a/.github/ISSUE_TEMPLATE/support_request.yml +++ b/.github/ISSUE_TEMPLATE/support_request.yml @@ -28,6 +28,15 @@ body: validations: required: true + - type: textarea + id: hardwarespec + attributes: + label: Hardware Specification + description: Tell us your CPU, iGPU, dGPU, VRAM, and RAM information. + placeholder: "CPU: Intel i9-14900K 6.0 GHz | GPU: NVIDIA RTX 4090 | VRAM: 24 GB | RAM: 32 GB" + validations: + required: true + - type: input id: version attributes: @@ -66,4 +75,4 @@ body: id: additional attributes: label: Additional Information - description: Any other information that might help us assist you. \ No newline at end of file + description: Any other information that might help us assist you. From 6b76eb365e16342e33502acafa5469d363ba853a Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Tue, 27 Jan 2026 03:21:47 +0800 Subject: [PATCH 22/26] Update bug_report.yml Add logs textfield to bug report --- .github/ISSUE_TEMPLATE/bug_report.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index dafdc62..c3bb5e6 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -71,8 +71,17 @@ body: validations: required: true + - type: textarea + id: logs + attributes: + label: Logs or Error Messages + description: If applicable, paste any error messages or logs here. + render: shell + validations: + required: true + - type: textarea id: additional attributes: label: Additional context - description: Add any other context about the problem here. \ No newline at end of file + description: Add any other context about the problem here. From 639a2ab1b55330f23c3f5623a3c7acd02e8b2cd6 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Tue, 27 Jan 2026 03:38:20 +0800 Subject: [PATCH 23/26] chore: add changelog in README.md --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b35c9e4..7ff99b0 100644 --- a/README.md +++ b/README.md @@ -308,20 +308,21 @@ See [BUILD.md](docs/BUILD.md) for comprehensive build instructions. ## 📋 Changelog ### 🆕 v2.1.1 -- 🛠️ **Fix EPERM** Issue -- 🅰️ **Adds Better Arch Build** -- +- 🛠️ **Fix Bug EPERM**: EPERM or Error Permission in creating/removing process in reinstalling is now fixed. +- 🅰️ **Adds .pkg.tar.zst Build for Arch Users**: This Arch-package has been needed since the first release. +- ❎ **Removes .pacman Build for Arch**: Based on the established conventions within the Arch Linux community, the file extension .pacman should not be used for package files. +- 🌎 **New Translation**: New Polish 🇵🇱 Translation added to the Launcher.
Click here to see older Changelogs -### 🆕 v2.1.0 +### 🔄 v2.1.0 - 🚨 **Auto-Retry Downloads and Auto-Patch Files** — - ⚡ **Hardware Acceleration** — - 🔎 **Browse CurseForge Mods** — Browsing mods now easier with our dedicated CurseForge API Key. - 🌎 **Fixes and Release New Translation** — Fixed 🇪🇸 🇧🇷 and added more translation for current build. Turkish 🇹🇷 language now added. -### 🆕 v2.0.2b *(Minor Update: Performance & Utilities)* +### 🔄 v2.0.2b *(Minor Update: Performance & Utilities)* - 🌎 **Language Translation** — A big welcome for Spanish 🇪🇸 and Portuguese (Brazil) 🇧🇷 players! **Language setting can be found in the bottom part of Settings pane.** - 💻 **Laptop/Hybrid GPU Performance Issue Fix** — Added automatic GPU detection system and options to choose which GPU will be used for the game, *specifically for Linux users*. - 👨‍💻 **In-App Logging** — Reporting bugs and issues to `Github Issues` tab or `Open A Ticket` channel in our Discord Server has been made easier for players, no more finding logs file manually. From 01823729ec9867f5961c8f69bc98ac83bc698842 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Tue, 27 Jan 2026 03:40:22 +0800 Subject: [PATCH 24/26] fix screenshot input in feature_request.yml --- .github/ISSUE_TEMPLATE/feature_request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 6d1d5d4..44c8816 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -39,7 +39,7 @@ body: validations: required: true - - type: screenshots + - type: textarea id: screenshots attributes: label: Screenshots (Optional) @@ -49,4 +49,4 @@ body: id: additional attributes: label: Additional context - description: Add any other context or screenshots about the feature request here. \ No newline at end of file + description: Add any other context or screenshots about the feature request here. From 7d2672b684860e1670f33f8ffd7bf9d32d9e1b93 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Tue, 27 Jan 2026 03:41:26 +0800 Subject: [PATCH 25/26] add hardware spec input in bug_report.yml --- .github/ISSUE_TEMPLATE/bug_report.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index c3bb5e6..f138ffc 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -55,6 +55,15 @@ body: validations: required: true + - type: textarea + id: hardwarespec + attributes: + label: Hardware Specification + description: Tell us your CPU, iGPU, dGPU, VRAM, and RAM information. + placeholder: "CPU: Intel i9-14900K 6.0 GHz | GPU: NVIDIA RTX 4090 | VRAM: 24 GB | RAM: 32 GB" + validations: + required: true + - type: dropdown id: os attributes: From 3edee4b4eb632f5c87e7d052c9f60aa48ec6747c Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Tue, 27 Jan 2026 03:55:01 +0800 Subject: [PATCH 26/26] fix: PKGBUILD pkgname variable fix --- PKGBUILD | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PKGBUILD b/PKGBUILD index 1bcb516..d5518ce 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -14,15 +14,15 @@ source=("$url/archive/v$pkgver.tar.gz" "Hytale-F2P.desktop") sha256sums=('SKIP' '46488fada4775d9976d7b7b62f8d1f1f8d9a9a9d8f8aa9af4f2e2153019f6a30') build() { - cd "$_pkgname-$pkgver" + cd "$pkgname-$pkgver" npm ci npm run build:arch } package() { - cd "$_pkgname-$pkgver" - install -d "$pkgdir/opt/$_pkgname" - cp -r dist/linux-unpacked/* "$pkgdir/opt/$_pkgname" - install -Dm644 "$srcdir/$_pkgname.desktop" "$pkgdir/usr/share/applications/$_pkgname.desktop" - install -Dm644 GUI/icon.png "$pkgdir/usr/share/icons/hicolor/256x256/apps/$_pkgname.png" + cd "$pkgname-$pkgver" + install -d "$pkgdir/opt/$pkgname" + cp -r dist/linux-unpacked/* "$pkgdir/opt/$pkgname" + install -Dm644 "$srcdir/$pkgname.desktop" "$pkgdir/usr/share/applications/$pkgname.desktop" + install -Dm644 GUI/icon.png "$pkgdir/usr/share/icons/hicolor/256x256/apps/$pkgname.png" }