From b46ce93af74fa03194b847bf97dd82835b3317a5 Mon Sep 17 00:00:00 2001 From: Fazri Gading Date: Sat, 24 Jan 2026 00:07:59 +0800 Subject: [PATCH 1/4] Release Stable Build v2.0.11 (#119) * Add electron-updater auto-update support - Install electron-updater package - Configure GitHub releases publish settings - Create AppUpdater class with full update lifecycle - Integrate auto-update into main.js - Add comprehensive documentation (AUTO-UPDATES.md, TESTING-UPDATES.md) - Set up dev-app-update.yml for testing * Add cache clearing documentation for electron-updater - Introduced CLEAR-UPDATE-CACHE.md to guide users on clearing the electron-updater cache across macOS, Windows, and Linux. - Added programmatic method for cache clearing in JavaScript. - Enhanced update handling in main.js and preload.js to support new update events. - Updated GUI styles for download buttons and progress indicators in update.js and style.css. * Update auto-update UI and configuration - Fix version display (newVersion field) - Add download progress bar with real-time updates - Reorder buttons: Install & Restart (primary), Manually Download (secondary) - Update dev-app-update.yml to point to fork - Update package.json version to 2.0.2 * Add installation effects and draggable progress bar Introduces animated installation effects overlay and makes the progress bar draggable. Adds maximize window support, improves window controls styling, and enforces a single app instance. Removes the unused Skins page and related translations. Refines various UI details for a more polished user experience. * Adjust news card aspect ratio and add Play tab style Set a default aspect ratio for .news-card and add a specific style for the LATEST NEWS section in the Play tab to override the aspect ratio and use full height. * Add splash screen to launcher startup Introduced a new splash screen (splash.html) and updated main.js to display it on startup before loading the main window. The splash screen is shown for 2.5 seconds as a placeholder for future loading logic, improving user experience during application launch. * Display launcher version in UI Adds a version display element to the bottom right of the UI, fetching the version from package.json via a new IPC handler. Updates main.js, preload.js, and ui.js to support retrieving and displaying the version, and adds relevant styles in style.css. * Custom Mod loading fix (#92) * feat: Add Repair Game functionality including UserData backup and cache clearing * feat: Add In-App Logs Viewer and Logs Folder shortcut * feat: Add Open Logs feature * disable dev tools * Fix Settings UI * Implement custom mod loading, autoimport, auto repair * Fixed Custom Mod loading issues and merge issues * feat: Externalize sensitive API keys and Discord client ID into environment variables using dotenv. * feat(mods): add profile-based mod management and auto-repair * feat: add 'Close launcher on game start' option and improve app termination behavior (#93) * update main branch to release/v2.0.2b (#86) * add more linux pkgs, create auto-release and pre-release feature for Github Actions * removed package-lock from gitignore * update .gitignore for local build * add package-lock.json to maintain stability development * update version to 2.0.2b also add deps for rpm and arch * update 2.0.2b: add arm64 support, product and executable name, maintainers; remove snap; * update 2.0.2b: add latest.yml for win & linux, arm64 support; remove snap * fix release build naming * Prepare release v2.0.2b * feat: add 'Close launcher on game start' option and improve app termination behavior - Added 'Close launcher on game start' setting in GUI and backend. - Implemented automatic app quit after game launch if setting is enabled. - Added Cmd+Q (Mac) and Ctrl+Q/Alt+F4 (Win/Linux) shortcuts to quit the app. - Updated 'window-close' handler to fully quit the app instead of just closing the window. - Added i18n support for the new setting in English, Spanish, and Portuguese. --------- Co-authored-by: Fazri Gading Co-authored-by: Arnav Singh * Update publish config to point to chasem-dev fork * Fix Linux metadata files in workflow and improve error handling * Bump version to 2.0.5 * Bump version to 2.0.6 * Fix update popup showing for same version - add version comparison checks * Bump version to 2.0.7 * Fix SHA512 checksum mismatch handling - clear cache and retry automatically * Bump version to 2.0.8 * Bump version to 2.0.9 * Fix: Use explicit latest-linux.yml to prevent yml file collision The glob pattern latest*.yml was matching both latest-linux.yml AND latest.yml from the Linux build, causing the Windows latest.yml to be overwritten with incorrect checksums. Co-Authored-By: Claude Sonnet 4.5 * Bump version to 2.0.10 Co-Authored-By: Claude Sonnet 4.5 * Fix: Remove portable target to fix SHA512 checksum mismatch The portable and nsis targets both produced x64.exe files with the same name, causing one to overwrite the other. The latest.yml contained the checksum from one build while the actual file was from the other build. Removed portable target - nsis installer is sufficient. Bump version to 2.0.11 Co-Authored-By: Claude Sonnet 4.5 * Remove outdated documentation files related to auto-updates, build instructions, and testing updates. Update `dev-app-update.yml` and `package.json` to reflect the correct GitHub owner. This cleanup streamlines the project and ensures accurate configuration for future updates. * Add semantic versioning policy documentation - numerical versions only * Update package-lock.json to include new dependencies and versions, enhancing project stability and compatibility. * fixed imgur restriction for UK * fix: adds EGL env var to detect installed NVIDIA GPU * Update release.yml * patch v2.0.11-beta: fix env issue in GA release, warn Intel Mac users, add com templates. (#115) * fix: throw error for Intel Mac user * docs: first draft of issue and PR template * fix: env of curseforge API key and discord client ID * implemented late patch should be in #115 * Final patch for release.yml v2.0.11 --------- Co-authored-by: chasem-dev Co-authored-by: AMIAY Co-authored-by: Rahul Sahani <110347707+Rahul-Sahani04@users.noreply.github.com> Co-authored-by: Arnav Singh <72737311+ArnavSingh77@users.noreply.github.com> Co-authored-by: Arnav Singh Co-authored-by: Claude Sonnet 4.5 --- .env.example | 2 + .github/CODE_OF_CONDUCT.md | 83 + .github/CONTRIBUTING.md | 70 + .../ISSUE_TEMPLATE/assets_contribution.yml | 54 + .github/ISSUE_TEMPLATE/bug_report.yml | 84 + .github/ISSUE_TEMPLATE/feature_request.yml | 42 + .../ISSUE_TEMPLATE/security_vulnerability.yml | 61 + .github/ISSUE_TEMPLATE/support_request.yml | 54 + .../ISSUE_TEMPLATE/translation_request.yml | 42 + .github/PULL_REQUEST_TEMPLATE/bug_fix.md | 24 + .../PULL_REQUEST_TEMPLATE/documentation.md | 16 + .github/PULL_REQUEST_TEMPLATE/hotfix.md | 26 + .github/PULL_REQUEST_TEMPLATE/localization.md | 20 + .github/PULL_REQUEST_TEMPLATE/new_feature.md | 25 + .github/PULL_REQUEST_TEMPLATE/refactor.md | 27 + .github/README1.md | 18 +- .github/SECURITY.md | 55 + .github/workflows/release.yml | 36 +- .gitignore | 5 +- GUI/index.html | 202 +- GUI/js/install.js | 28 +- GUI/js/mods.js | 15 +- GUI/js/settings.js | 92 +- GUI/js/ui.js | 106 + GUI/js/update.js | 216 +- GUI/locales/en.json | 15 +- GUI/locales/es.json | 15 +- GUI/locales/pt-BR.json | 16 +- GUI/splash.html | 178 + GUI/style.css | 278 +- README.md | 19 + backend/appUpdater.js | 379 + backend/core/config.js | 14 +- backend/core/paths.js | 36 +- backend/launcher.js | 6 + backend/managers/gameManager.js | 5 + backend/managers/modManager.js | 300 +- backend/utils/platformUtils.js | 12 +- dev-app-update.yml | 3 + docs/AUTO-UPDATES.md | 284 + BUILD.md => docs/BUILD.md | 0 docs/CLEAR-UPDATE-CACHE.md | 78 + docs/TESTING-UPDATES.md | 196 + main.js | 188 +- package-lock.json | 10011 ++++++++-------- package.json | 253 +- preload.js | 13 +- 47 files changed, 8337 insertions(+), 5365 deletions(-) create mode 100644 .env.example create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE/assets_contribution.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/security_vulnerability.yml create mode 100644 .github/ISSUE_TEMPLATE/support_request.yml create mode 100644 .github/ISSUE_TEMPLATE/translation_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE/bug_fix.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/documentation.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/hotfix.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/localization.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/new_feature.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/refactor.md create mode 100644 .github/SECURITY.md create mode 100644 GUI/splash.html create mode 100644 backend/appUpdater.js create mode 100644 dev-app-update.yml create mode 100644 docs/AUTO-UPDATES.md rename BUILD.md => docs/BUILD.md (100%) create mode 100644 docs/CLEAR-UPDATE-CACHE.md create mode 100644 docs/TESTING-UPDATES.md diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..c1c8f4d --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +CURSEFORGE_API_KEY=$1234asdxXXXXXXkQCXXXXXXXXXXASDb32 +DISCORD_CLIENT_ID=561263XXXXXX \ No newline at end of file diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..8d6ac55 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,83 @@ +# Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [INSERT CONTACT METHOD]. All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of actions. + +**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations \ No newline at end of file diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..4ca0d3f --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,70 @@ +# Contributing to Hytale F2P + +Thank you for your interest in contributing to Hytale F2P! We welcome contributions from everyone. By participating in this project, you agree to abide by our [Code of Conduct](CODE_OF_CONDUCT.md). + +## How to Contribute + +### Reporting Bugs + +- Use the [Bug Report](.github/ISSUE_TEMPLATE/bug_report.yml) template +- Include as much detail as possible +- Include screenshots if applicable +- Check if the issue has already been reported + +### Suggesting Features + +- Use the [Feature Request](.github/ISSUE_TEMPLATE/feature_request.yml) template +- Clearly describe the feature and its benefits +- Consider if the feature aligns with the project's goals + +### Contributing Code + +1. Fork the repository +2. Create a feature branch: `git checkout -b feature/your-feature-name` +3. Make your changes +4. Write tests if applicable +5. Ensure all tests pass +6. Update documentation if needed +7. Commit your changes: `git commit -m 'Add some feature'` +8. Push to the branch: `git push origin feature/your-feature-name` +9. Submit a pull request + +### Pull Request Process + +- Use the appropriate [Pull Request template](.github/PULL_REQUEST_TEMPLATE/) +- Ensure your PR description clearly describes the changes +- Link to any related issues +- Wait for review and address any feedback + +## Development Setup + +1. Clone the repository: `git clone https://github.com/your-username/hytale-f2p.git` +2. Install dependencies: `npm install` (or appropriate command) +3. Set up your development environment +4. Run tests: `npm test` +5. Start development server: `npm run dev` + +## Code Style + +- Follow the existing code style in the project +- Use meaningful variable and function names +- Write clear, concise comments +- Keep functions small and focused + +## Testing + +- Write unit tests for new features +- Ensure all existing tests pass +- Test on multiple platforms/browsers if applicable + +## Documentation + +- Update README.md if needed +- Document new features or changes +- Keep documentation up to date + +## Questions? + +If you have questions about contributing, feel free to ask in our [Discussions](https://github.com/your-username/hytale-f2p/discussions) or create a [Support Request](.github/ISSUE_TEMPLATE/support_request.yml). + +Thank you for contributing to Hytale F2P! \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/assets_contribution.yml b/.github/ISSUE_TEMPLATE/assets_contribution.yml new file mode 100644 index 0000000..4d3652f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/assets_contribution.yml @@ -0,0 +1,54 @@ +name: Asset Contribution +description: Contribute assets (images, sounds, models, etc.) +title: "[ASSETS] " +labels: ["assets"] +body: + - type: textarea + id: description + attributes: + label: Asset Description + description: Describe the asset(s) you're contributing. + placeholder: "What type of asset is this? What does it represent?" + validations: + required: true + + - type: input + id: format + attributes: + label: File Format + description: What format are the asset files in? + placeholder: "e.g. PNG, JPG, MP3, OBJ" + + - type: input + id: license + attributes: + label: License + description: What license applies to this asset? + placeholder: "e.g. CC0, MIT, Public Domain" + + - type: textarea + id: usage + attributes: + label: Intended Usage + description: Where and how should this asset be used in the project? + placeholder: "This asset should be used for..., in the following context..." + + - type: textarea + id: source + attributes: + label: Source/Attribution + description: If this asset is derived from another source, provide attribution. + placeholder: "Created by me, or derived from [source]" + + - type: input + id: link + attributes: + label: Download Link + description: Provide a link to download or view the asset. + placeholder: "GitHub release, Google Drive, etc." + + - type: textarea + id: additional + attributes: + label: Additional Information + description: Any other information about the asset. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..6fa5672 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,84 @@ +name: Bug Report +description: Create a report to help us improve +title: "[BUG] " +labels: ["bug"] +body: + - type: textarea + id: description + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. + placeholder: "Tell us what you see! The more detail the better." + validations: + required: true + + - type: textarea + id: reproduce + attributes: + label: To Reproduce + description: Steps to reproduce the behavior + placeholder: | + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. + validations: + required: true + + - type: textarea + id: screenshots + attributes: + label: Screenshots + description: If applicable, add screenshots to help explain your problem. + + - type: input + id: version + attributes: + label: Version + description: What version of the project are you running? + placeholder: "e.g. v1.2.3" + validations: + required: true + + - type: dropdown + id: os + attributes: + label: Operating System + description: What operating system are you using? + options: + - Windows + - macOS + - Linux + - iOS + - Android + - Other + validations: + required: true + + - type: dropdown + id: browser + attributes: + label: Browser (if applicable) + description: What browser are you using? + options: + - Chrome + - Firefox + - Safari + - Edge + - Opera + - Other + - N/A + + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any other context about the problem here. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..89b6e49 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,42 @@ +name: Feature Request +description: Suggest an idea for this project +title: "[FEATURE] " +labels: ["enhancement"] +body: + - type: textarea + id: summary + attributes: + label: Summary + description: Brief explanation of the feature. + placeholder: "Describe in a few sentences what this feature would do." + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Is your feature request related to a problem? Please describe. + description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + placeholder: "Ex. I'm always frustrated when [...]" + + - type: textarea + id: solution + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + placeholder: "Describe what you want to happen." + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. + placeholder: "Describe any alternative solutions or features you've considered." + + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/security_vulnerability.yml b/.github/ISSUE_TEMPLATE/security_vulnerability.yml new file mode 100644 index 0000000..2337e04 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/security_vulnerability.yml @@ -0,0 +1,61 @@ +name: Security Vulnerability +description: Report a security vulnerability +title: "[SECURITY] " +labels: ["security"] +body: + - type: markdown + attributes: + value: | + Thank you for reporting a security vulnerability. Please review our [Security Policy](SECURITY.md) for more information on how we handle security issues. + + If you are reporting a security vulnerability, please provide as much detail as possible so we can assess and address it promptly. + + - type: textarea + id: summary + attributes: + label: Summary + description: Brief description of the security issue. + placeholder: "Describe the security vulnerability in a few sentences." + validations: + required: true + + - type: textarea + id: details + attributes: + label: Vulnerability Details + description: Detailed description of the vulnerability, including how it can be exploited. + placeholder: "Provide detailed steps, code snippets, or other information that demonstrates the vulnerability." + validations: + required: true + + - type: textarea + id: impact + attributes: + label: Impact + description: What is the potential impact of this vulnerability? + placeholder: "Describe the potential consequences if this vulnerability is exploited." + validations: + required: true + + - type: textarea + id: mitigation + attributes: + label: Suggested Mitigation + description: Any suggestions for fixing or mitigating the issue. + placeholder: "Provide any suggestions for how to fix or mitigate this vulnerability." + + - type: input + id: contact + attributes: + label: Contact Information (Optional) + description: How can we contact you for more information? + placeholder: "Email address or other contact method" + + - type: checkboxes + id: terms + attributes: + label: Terms + description: By submitting this issue, you agree to our responsible disclosure terms. + options: + - label: I understand that this is a private security report and will not publicly disclose details until the issue is resolved. + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/support_request.yml b/.github/ISSUE_TEMPLATE/support_request.yml new file mode 100644 index 0000000..1b03828 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/support_request.yml @@ -0,0 +1,54 @@ +name: Support Request +description: Request help or support +title: "[SUPPORT] " +labels: ["support"] +body: + - type: textarea + id: question + attributes: + label: What do you need help with? + description: Describe your question or issue clearly. + placeholder: "I'm having trouble with..." + validations: + required: true + + - type: textarea + id: context + attributes: + label: Context + description: Provide any relevant context or background information. + placeholder: "I've tried..., I expected..., but got..." + + - type: input + id: version + attributes: + label: Version + description: What version are you using? + placeholder: "e.g. v1.2.3" + + - type: dropdown + id: platform + attributes: + label: Platform + description: What platform are you using? + options: + - Windows + - macOS + - Linux + - iOS + - Android + - Web Browser + - Other + + - type: textarea + id: logs + attributes: + label: Logs or Error Messages + description: If applicable, paste any error messages or logs here. + render: shell + + - type: textarea + id: additional + attributes: + label: Additional Information + description: Any other information that might help us assist you. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/translation_request.yml b/.github/ISSUE_TEMPLATE/translation_request.yml new file mode 100644 index 0000000..fc43333 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/translation_request.yml @@ -0,0 +1,42 @@ +name: Translation Request +description: Request translation for text or content +title: "[TRANSLATION] " +labels: ["translation"] +body: + - type: input + id: language + attributes: + label: Target Language + description: What language do you want to translate to? + placeholder: "e.g. Spanish (es-ES), French (fr-FR)" + validations: + required: true + + - type: textarea + id: source_text + attributes: + label: Source Text + description: The original text that needs to be translated. + placeholder: "Paste the text here..." + validations: + required: true + + - type: textarea + id: context + attributes: + label: Context + description: Provide context about where this text appears or how it's used. + placeholder: "This text appears in..., It's used for..." + + - type: input + id: file_location + attributes: + label: File Location + description: Where is this text located in the codebase? + placeholder: "e.g. src/components/Button.js:15" + + - type: textarea + id: notes + attributes: + label: Additional Notes + description: Any specific instructions or notes for the translator. \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/bug_fix.md b/.github/PULL_REQUEST_TEMPLATE/bug_fix.md new file mode 100644 index 0000000..badbb0d --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/bug_fix.md @@ -0,0 +1,24 @@ +## Description +Brief description of the bug fix. + +## Related Issue +Fixes # (issue number) + +## Changes Made +- List the changes made to fix the bug +- Be specific about what was changed and why + +## Testing +- How did you test the fix? +- What scenarios were covered? + +## Screenshots (if applicable) +Add screenshots to demonstrate the fix. + +## Checklist +- [ ] My code follows the project's style guidelines +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] My changes generate no new warnings +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/documentation.md b/.github/PULL_REQUEST_TEMPLATE/documentation.md new file mode 100644 index 0000000..2eda0fe --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/documentation.md @@ -0,0 +1,16 @@ +## Description +Brief description of the documentation changes. + +## Related Issue +Addresses # (issue number) + +## Changes Made +- List the documentation files that were added, updated, or removed +- Describe what information was added or corrected + +## Checklist +- [ ] Documentation is clear and easy to understand +- [ ] Links and references are correct +- [ ] Code examples (if any) are accurate and functional +- [ ] Spelling and grammar are correct +- [ ] Documentation follows the project's style guidelines \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/hotfix.md b/.github/PULL_REQUEST_TEMPLATE/hotfix.md new file mode 100644 index 0000000..0e54f46 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/hotfix.md @@ -0,0 +1,26 @@ +## Description +Brief description of the hotfix. + +## Related Issue +Fixes # (issue number) - URGENT + +## Changes Made +- List the minimal changes made to fix the critical issue +- Be specific about what was changed + +## Urgency +Why is this a hotfix? (Critical bug, security issue, production down, etc.) + +## Testing +- How was the hotfix tested? +- What was the minimal testing performed? + +## Deployment Notes +- Any special deployment considerations? +- Rollback plan if needed? + +## Checklist +- [ ] This is a minimal change addressing only the critical issue +- [ ] No new features or unrelated changes included +- [ ] Basic functionality verified +- [ ] Ready for immediate deployment \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/localization.md b/.github/PULL_REQUEST_TEMPLATE/localization.md new file mode 100644 index 0000000..3cf0748 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/localization.md @@ -0,0 +1,20 @@ +## Description +Brief description of the localization changes. + +## Related Issue +Addresses # (issue number) + +## Changes Made +- List the languages and files that were updated +- Describe what text was translated or updated + +## Languages Updated +- Language 1 (locale code) +- Language 2 (locale code) + +## Checklist +- [ ] Translations are accurate and culturally appropriate +- [ ] Placeholder variables (%s, %d, etc.) are preserved +- [ ] Text length is appropriate for UI elements +- [ ] No hardcoded strings remain +- [ ] Localization files are properly formatted \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/new_feature.md b/.github/PULL_REQUEST_TEMPLATE/new_feature.md new file mode 100644 index 0000000..0ab1bec --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/new_feature.md @@ -0,0 +1,25 @@ +## Description +Brief description of the new feature. + +## Related Issue +Addresses # (issue number) + +## Changes Made +- List the changes made to implement the feature +- Be specific about new files, modified files, and functionality added + +## Testing +- How did you test the new feature? +- What scenarios were covered? + +## Screenshots (if applicable) +Add screenshots to demonstrate the new feature. + +## Checklist +- [ ] My code follows the project's style guidelines +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] My changes generate no new warnings +- [ ] I have added tests that prove my feature works +- [ ] New and existing unit tests pass locally with my changes +- [ ] I have updated the documentation accordingly \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/refactor.md b/.github/PULL_REQUEST_TEMPLATE/refactor.md new file mode 100644 index 0000000..0969f79 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/refactor.md @@ -0,0 +1,27 @@ +## Description +Brief description of the refactoring changes. + +## Related Issue +Addresses # (issue number) + +## Changes Made +- List the refactored code sections +- Describe what was improved (readability, performance, maintainability, etc.) + +## Motivation +Why was this refactoring necessary? + +## Impact +- Does this change affect any APIs or interfaces? +- Are there any breaking changes? + +## Testing +- How was the refactored code tested? +- Did existing tests pass? + +## Checklist +- [ ] Code is more readable and maintainable +- [ ] No functionality was broken +- [ ] Performance was not negatively impacted +- [ ] All existing tests pass +- [ ] New tests were added if necessary \ No newline at end of file diff --git a/.github/README1.md b/.github/README1.md index 3845c60..8a3c27f 100644 --- a/.github/README1.md +++ b/.github/README1.md @@ -22,13 +22,25 @@ All builds run in parallel: ### Creating a Release -1. Update version in `package.json` +**⚠️ IMPORTANT: Semantic Versioning Required** + +This project uses **strict semantic versioning with numerical versions only**: +- ✅ **Valid**: `2.0.1`, `2.0.11`, `2.1.0`, `3.0.0` +- ❌ **Invalid**: `2.0.2b`, `2.0.2a`, `2.0.1-beta` + +**Format**: `MAJOR.MINOR.PATCH` (e.g., `2.0.11`) + +The auto-update system requires semantic versioning for proper version comparison. Letter suffixes are not supported. + +**Steps:** + +1. Update version in `package.json` (use numerical format only, e.g., `2.0.11`) 2. Commit and push to `main` 3. Create and push a version tag: ```bash -git tag v2.0.1 -git push origin v2.0.1 +git tag v2.0.11 +git push origin v2.0.11 ``` The workflow will: diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000..395f3ff --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,55 @@ +# Security Policy + +## Supported Versions + +We take security seriously. The following versions of our project are currently being supported with security updates: + +| Version | Supported | +| ------- | ------------------ | +| 1.x.x | :white_check_mark: | +| < 1.0 | :x: | + +## Reporting a Vulnerability + +If you discover a security vulnerability, please report it to us as follows: + +**Do not report security vulnerabilities through public GitHub issues.** + +Instead, please report security vulnerabilities by: + +1. Using the [Security Vulnerability Report](.github/ISSUE_TEMPLATE/security_vulnerability.yml) template (this creates a private issue) +2. Emailing [security@yourdomain.com](mailto:security@yourdomain.com) (if available) +3. Contacting the maintainers directly through secure channels + +## What to Include in Your Report + +Please include the following information in your report: + +- A clear description of the vulnerability +- Steps to reproduce the issue +- Potential impact of the vulnerability +- Any suggested fixes or mitigations +- Your contact information for follow-up + +## Our Response Process + +1. **Acknowledgment**: We will acknowledge receipt of your report within 48 hours +2. **Investigation**: We will investigate the issue and work on a fix +3. **Updates**: We will provide regular updates on our progress +4. **Resolution**: Once fixed, we will notify you and publicly disclose the issue (with your permission) + +## Responsible Disclosure + +We kindly ask that you: + +- Give us reasonable time to fix the issue before public disclosure +- Avoid accessing or modifying user data +- Avoid denial-of-service attacks or other disruptive actions + +## Recognition + +We appreciate security researchers who help keep our project safe. With your permission, we will acknowledge your contribution in our security advisories. + +## Questions? + +If you have questions about our security policy, please contact us through the methods listed above. \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5f8216a..405e76d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,6 +25,14 @@ jobs: cache: 'npm' - run: npm ci + - name: Create .env file + env: + CF_KEY: ${{ secrets.CURSEFORGE_API_KEY }} + DISCORD_ID: ${{ secrets.DISCORD_CLIENT_ID }} + run: | + echo "CURSEFORGE_API_KEY=$CF_KEY" > .env + echo "DISCORD_CLIENT_ID=$DISCORD_ID" >> .env + - name: Build Linux Packages run: | npx electron-builder --linux --x64 --arm64 --publish never @@ -33,10 +41,11 @@ jobs: name: linux-builds path: | dist/*.AppImage + dist/*.AppImage.blockmap dist/*.deb dist/*.rpm dist/*.pacman - dist/latest.yml + dist/latest-linux.yml build-windows: runs-on: windows-latest @@ -47,12 +56,23 @@ jobs: node-version: '22' cache: 'npm' - run: npm ci - - run: npx electron-builder --win --publish never + + - name: Create .env file + env: + CF_KEY: ${{ secrets.CURSEFORGE_API_KEY }} + DISCORD_ID: ${{ secrets.DISCORD_CLIENT_ID }} + run: | + echo "CURSEFORGE_API_KEY=$CF_KEY" > .env + echo "DISCORD_CLIENT_ID=$DISCORD_ID" >> .env + + - name: Build Windows Packages + run: npx electron-builder --win --publish never - uses: actions/upload-artifact@v4 with: name: windows-builds path: | dist/*.exe + dist/*.exe.blockmap dist/latest.yml build-macos: @@ -64,7 +84,17 @@ jobs: node-version: '22' cache: 'npm' - run: npm ci - - run: npx electron-builder --mac --publish never + + - name: Create .env file + env: + CF_KEY: ${{ secrets.CURSEFORGE_API_KEY }} + DISCORD_ID: ${{ secrets.DISCORD_CLIENT_ID }} + run: | + echo "CURSEFORGE_API_KEY=$CF_KEY" > .env + echo "DISCORD_CLIENT_ID=$DISCORD_ID" >> .env + + - name: Build Windows Packages + run: npx electron-builder --mac --publish never - uses: actions/upload-artifact@v4 with: name: macos-builds diff --git a/.gitignore b/.gitignore index 56f6219..b533c73 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ pkg/ # Package files *.tar.zst -*.zst \ No newline at end of file +*.zst.DS_Store +*.zst +bun.lockb +.env diff --git a/GUI/index.html b/GUI/index.html index eb7b8e7..272dab1 100644 --- a/GUI/index.html +++ b/GUI/index.html @@ -15,7 +15,7 @@
- Background + Background
Settings
- -
@@ -114,7 +110,7 @@

- HYTALE + HYTALE

FREE TO PLAY LAUNCHER

@@ -122,22 +118,26 @@
- +
- +
- + @@ -163,7 +163,8 @@ READY TO PLAY -

Launch Hytale and enter the adventure

+

Launch Hytale and enter the + adventure

@@ -191,7 +193,8 @@
- +
- Page 1 of 1 + Page 1 of 1
@@ -320,8 +329,10 @@ onclick="repairGame()">
-
Repair Game
-
Reinstall game files (preserves data) +
Repair Game +
+
+ Reinstall game files (preserves data)
@@ -329,18 +340,25 @@
- +
- + - - - - + + + +

- Select your preferred GPU (Linux: affects DRI_PRIME) + Select your preferred GPU (Linux: + affects DRI_PRIME)

@@ -355,7 +373,8 @@
- +
@@ -369,7 +388,8 @@

- Your unique player identifier for this username + Your unique player identifier for + this username

@@ -379,8 +399,10 @@
@@ -398,14 +420,38 @@
-
Enable Discord Rich Presence
-
Show your launcher activity on Discord +
Enable + Discord Rich Presence
+
Show your launcher activity + on Discord
+
+

+ + Launcher Behavior +

+ +
+ +
+
+ +

@@ -417,8 +463,10 @@
-
Use Custom Java Path
-
Override the bundled Java runtime with +
Use + Custom Java Path
+
+ Override the bundled Java runtime with your own installation
@@ -426,7 +474,8 @@
- +

@@ -451,7 +501,8 @@
- + @@ -462,14 +513,6 @@
-
-
- -

Skins

-

Skin customization coming soon...

-
-
-
@@ -482,15 +525,18 @@ Copy
-
Loading logs...
+
Loading + logs...

@@ -532,6 +578,20 @@

+ + + @@ -646,8 +708,8 @@
- + @@ -656,6 +718,11 @@
+
+ + Loading... +
+
diff --git a/GUI/js/install.js b/GUI/js/install.js index 36bb46f..86a0ede 100644 --- a/GUI/js/install.js +++ b/GUI/js/install.js @@ -39,6 +39,19 @@ export function setupInstallation() { } }); } + + // Setup installation effects listeners + if (window.electronAPI && window.electronAPI.onInstallationStart) { + window.electronAPI.onInstallationStart(() => { + showInstallationEffects(); + }); + } + + if (window.electronAPI && window.electronAPI.onInstallationEnd) { + window.electronAPI.onInstallationEnd(() => { + hideInstallationEffects(); + }); + } } export async function installGame() { @@ -78,12 +91,19 @@ export async function installGame() { } } catch (error) { const errorMsg = window.i18n ? window.i18n.t('progress.installationFailed').replace('{error}', error.message) : `Installation failed: ${error.message}`; + + // Hide installation effects on error + if (window.hideInstallationEffects) { + window.hideInstallationEffects(); + } + + // Reset button state on error + resetInstallButton(); + if (window.LauncherUI) { window.LauncherUI.updateProgress({ message: errorMsg }); - setTimeout(() => { - window.LauncherUI.hideProgress(); - resetInstallButton(); - }, 3000); + // Don't hide progress bar, just update the message + // User can see the error and close it manually } } } diff --git a/GUI/js/mods.js b/GUI/js/mods.js index 32f4ddd..631db3f 100644 --- a/GUI/js/mods.js +++ b/GUI/js/mods.js @@ -1,5 +1,5 @@ -const API_KEY = '$2a$10$bqk254NMZOWVTzLVJCcxEOmhcyUujKxA5xk.kQCN9q0KNYFJd5b32'; +let API_KEY = null; const CURSEFORGE_API = 'https://api.curseforge.com/v1'; const HYTALE_GAME_ID = 70216; @@ -11,6 +11,15 @@ let modsPageSize = 20; let modsTotalPages = 1; export async function initModsManager() { + try { + if (window.electronAPI && window.electronAPI.getEnvVar) { + API_KEY = await window.electronAPI.getEnvVar('CURSEFORGE_API_KEY'); + console.log('Loaded API Key:', API_KEY ? 'Yes' : 'No'); + } + } catch (err) { + console.error('Failed to load API Key:', err); + } + setupModsEventListeners(); await loadInstalledMods(); await loadBrowseMods(); @@ -417,10 +426,10 @@ async function deleteMod(modId) { const mod = installedMods.find(m => m.id === modId); if (!mod) return; - const confirmMsg = window.i18n ? + const confirmMsg = window.i18n ? window.i18n.t('mods.confirmDelete').replace('{name}', mod.name) + ' ' + window.i18n.t('mods.confirmDeleteDesc') : `Are you sure you want to delete "${mod.name}"? This action cannot be undone.`; - + showConfirmModal( confirmMsg, async () => { diff --git a/GUI/js/settings.js b/GUI/js/settings.js index 0ec95e6..dd383be 100644 --- a/GUI/js/settings.js +++ b/GUI/js/settings.js @@ -3,9 +3,11 @@ let customJavaCheck; let customJavaOptions; let customJavaPath; let browseJavaBtn; -let settingsPlayerName; -let discordRPCCheck; -let gpuPreferenceRadios; +let settingsPlayerName; +let discordRPCCheck; +let closeLauncherCheck; +let gpuPreferenceRadios; + // UUID Management elements let currentUuidDisplay; @@ -159,9 +161,11 @@ function setupSettingsElements() { customJavaOptions = document.getElementById('customJavaOptions'); customJavaPath = document.getElementById('customJavaPath'); browseJavaBtn = document.getElementById('browseJavaBtn'); - settingsPlayerName = document.getElementById('settingsPlayerName'); - discordRPCCheck = document.getElementById('discordRPCCheck'); - gpuPreferenceRadios = document.querySelectorAll('input[name="gpuPreference"]'); + settingsPlayerName = document.getElementById('settingsPlayerName'); + discordRPCCheck = document.getElementById('discordRPCCheck'); + closeLauncherCheck = document.getElementById('closeLauncherCheck'); + gpuPreferenceRadios = document.querySelectorAll('input[name="gpuPreference"]'); + // UUID Management elements currentUuidDisplay = document.getElementById('currentUuid'); @@ -190,9 +194,14 @@ function setupSettingsElements() { settingsPlayerName.addEventListener('change', savePlayerName); } - if (discordRPCCheck) { - discordRPCCheck.addEventListener('change', saveDiscordRPC); - } + if (discordRPCCheck) { + discordRPCCheck.addEventListener('change', saveDiscordRPC); + } + + if (closeLauncherCheck) { + closeLauncherCheck.addEventListener('change', saveCloseLauncher); + } + // UUID event listeners if (copyUuidBtn) { @@ -335,18 +344,43 @@ async function saveDiscordRPC() { } } -async function loadDiscordRPC() { - try { - if (window.electronAPI && window.electronAPI.loadDiscordRPC) { - const enabled = await window.electronAPI.loadDiscordRPC(); - if (discordRPCCheck) { - discordRPCCheck.checked = enabled; - } - } - } catch (error) { - console.error('Error loading Discord RPC setting:', error); - } -} +async function loadDiscordRPC() { + try { + if (window.electronAPI && window.electronAPI.loadDiscordRPC) { + const enabled = await window.electronAPI.loadDiscordRPC(); + if (discordRPCCheck) { + discordRPCCheck.checked = enabled; + } + } + } catch (error) { + console.error('Error loading Discord RPC setting:', error); + } +} + +async function saveCloseLauncher() { + try { + if (window.electronAPI && window.electronAPI.saveCloseLauncher && closeLauncherCheck) { + const enabled = closeLauncherCheck.checked; + await window.electronAPI.saveCloseLauncher(enabled); + } + } catch (error) { + console.error('Error saving close launcher setting:', error); + } +} + +async function loadCloseLauncher() { + try { + if (window.electronAPI && window.electronAPI.loadCloseLauncher) { + const enabled = await window.electronAPI.loadCloseLauncher(); + if (closeLauncherCheck) { + closeLauncherCheck.checked = enabled; + } + } + } catch (error) { + console.error('Error loading close launcher setting:', error); + } +} + async function savePlayerName() { try { @@ -457,13 +491,15 @@ async function loadGpuPreference() { } } -async function loadAllSettings() { - await loadCustomJavaPath(); - await loadPlayerName(); - await loadCurrentUuid(); - await loadDiscordRPC(); - await loadGpuPreference(); -} +async function loadAllSettings() { + await loadCustomJavaPath(); + await loadPlayerName(); + await loadCurrentUuid(); + await loadDiscordRPC(); + await loadCloseLauncher(); + await loadGpuPreference(); +} + async function openGameLocation() { try { diff --git a/GUI/js/ui.js b/GUI/js/ui.js index f417c87..6768f95 100644 --- a/GUI/js/ui.js +++ b/GUI/js/ui.js @@ -479,6 +479,9 @@ function setupUI() { progressSpeed = document.getElementById('progressSpeed'); progressSize = document.getElementById('progressSize'); + // Setup draggable progress bar + setupProgressDrag(); + lockPlayButton(true); setTimeout(() => { @@ -497,10 +500,26 @@ function setupUI() { setupSidebarLogo(); setupAnimations(); setupFirstLaunchHandlers(); + loadLauncherVersion(); document.body.focus(); } +// Load launcher version from package.json +async function loadLauncherVersion() { + try { + if (window.electronAPI && window.electronAPI.getVersion) { + const version = await window.electronAPI.getVersion(); + const versionElement = document.getElementById('launcherVersion'); + if (versionElement) { + versionElement.textContent = `v${version}`; + } + } + } catch (error) { + console.error('Failed to load launcher version:', error); + } +} + window.LauncherUI = { showPage, setActiveNav, @@ -510,4 +529,91 @@ window.LauncherUI = { updateProgress }; +// Make installation effects globally available +window.showInstallationEffects = showInstallationEffects; +window.hideInstallationEffects = hideInstallationEffects; + +// Draggable progress bar functionality +function setupProgressDrag() { + if (!progressOverlay) return; + + let isDragging = false; + let offsetX; + let offsetY; + + progressOverlay.addEventListener('mousedown', dragStart); + document.addEventListener('mousemove', drag); + document.addEventListener('mouseup', dragEnd); + + function dragStart(e) { + // Only drag if clicking on the overlay itself, not on buttons or inputs + if (e.target.closest('.progress-bar-fill')) return; + + if (e.target === progressOverlay || e.target.closest('.progress-content')) { + isDragging = true; + progressOverlay.classList.add('dragging'); + + // Get the current position of the progress overlay + const rect = progressOverlay.getBoundingClientRect(); + offsetX = e.clientX - rect.left - progressOverlay.offsetWidth / 2; + offsetY = e.clientY - rect.top; + } + } + + function drag(e) { + if (isDragging) { + e.preventDefault(); + + // Calculate new position + const newX = e.clientX - offsetX - progressOverlay.offsetWidth / 2; + const newY = e.clientY - offsetY; + + // Get window bounds + const maxX = window.innerWidth - progressOverlay.offsetWidth; + const maxY = window.innerHeight - progressOverlay.offsetHeight; + const minX = 0; + const minY = 0; + + // Constrain to window bounds + const constrainedX = Math.max(minX, Math.min(newX, maxX)); + const constrainedY = Math.max(minY, Math.min(newY, maxY)); + + progressOverlay.style.left = constrainedX + 'px'; + progressOverlay.style.bottom = 'auto'; + progressOverlay.style.top = constrainedY + 'px'; + progressOverlay.style.transform = 'none'; + } + } + + function dragEnd() { + isDragging = false; + progressOverlay.classList.remove('dragging'); + } +} + +// Show/hide installation effects +function showInstallationEffects() { + const installationEffects = document.getElementById('installationEffects'); + if (installationEffects) { + installationEffects.style.display = 'block'; + } +} + +function hideInstallationEffects() { + const installationEffects = document.getElementById('installationEffects'); + if (installationEffects) { + installationEffects.style.display = 'none'; + } +} + +// Toggle maximize/restore window function +function toggleMaximize() { + if (window.electronAPI && window.electronAPI.maximizeWindow) { + window.electronAPI.maximizeWindow(); + } +} + +// Make toggleMaximize globally available +window.toggleMaximize = toggleMaximize; + document.addEventListener('DOMContentLoaded', setupUI); diff --git a/GUI/js/update.js b/GUI/js/update.js index 00393b4..aa44277 100644 --- a/GUI/js/update.js +++ b/GUI/js/update.js @@ -10,6 +10,23 @@ class ClientUpdateManager { this.showUpdatePopup(updateInfo); }); + // Listen for electron-updater events + window.electronAPI.onUpdateAvailable((updateInfo) => { + this.showUpdatePopup(updateInfo); + }); + + window.electronAPI.onUpdateDownloadProgress((progress) => { + this.updateDownloadProgress(progress); + }); + + window.electronAPI.onUpdateDownloaded((updateInfo) => { + this.showUpdateDownloaded(updateInfo); + }); + + window.electronAPI.onUpdateError((errorInfo) => { + this.handleUpdateError(errorInfo); + }); + this.checkForUpdatesOnDemand(); } @@ -33,23 +50,46 @@ class ClientUpdateManager {
Current Version: - ${updateInfo.currentVersion} + ${updateInfo.currentVersion || updateInfo.version || 'Unknown'}
New Version: - ${updateInfo.newVersion} + ${updateInfo.newVersion || updateInfo.version || 'Unknown'}
A new version of Hytale F2P Launcher is available.
- Please download the latest version to continue using the launcher. + Downloading update automatically... +
- + + +