mirror of
https://git.sanhost.net/sanasol/hytale-f2p
synced 2026-02-26 09:11:49 -03:00
Merge upstream/develop into v2.0.11 - sync with main repository
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 () => {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
106
GUI/js/ui.js
106
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);
|
||||
|
||||
Reference in New Issue
Block a user