diff --git a/app/assets/js/configmanager.js b/app/assets/js/configmanager.js index 6869e25..106d6aa 100644 --- a/app/assets/js/configmanager.js +++ b/app/assets/js/configmanager.js @@ -1,6 +1,5 @@ const fs = require('fs-extra') const { LoggerUtil } = require('helios-core') -const { mcVersionAtLeast } = require('helios-core/common') const os = require('os') const path = require('path') @@ -45,24 +44,30 @@ const configPath = path.join(exports.getLauncherDirectory(), 'config.json') const configPathLEGACY = path.join(dataPath, 'config.json') const firstLaunch = !fs.existsSync(configPath) && !fs.existsSync(configPathLEGACY) -exports.getAbsoluteMinRAM = function(){ - const mem = os.totalmem() - return mem >= 6000000000 ? 3 : 2 +exports.getAbsoluteMinRAM = function(ram){ + if(ram?.minimum != null) { + return ram.minimum/1024 + } else { + // Legacy behavior + const mem = os.totalmem() + return mem >= (6*1073741824) ? 3 : 2 + } } -exports.getAbsoluteMaxRAM = function(){ +exports.getAbsoluteMaxRAM = function(ram){ const mem = os.totalmem() - const gT16 = mem-16000000000 - return Math.floor((mem-1000000000-(gT16 > 0 ? (Number.parseInt(gT16/8) + 16000000000/4) : mem/4))/1000000000) + const gT16 = mem-(16*1073741824) + return Math.floor((mem-(gT16 > 0 ? (Number.parseInt(gT16/8) + (16*1073741824)/4) : mem/4))/1073741824) } -function resolveMaxRAM(){ - const mem = os.totalmem() - return mem >= 8000000000 ? '4G' : (mem >= 6000000000 ? '3G' : '2G') -} - -function resolveMinRAM(){ - return resolveMaxRAM() +function resolveSelectedRAM(ram) { + if(ram?.recommended != null) { + return `${ram.recommended}M` + } else { + // Legacy behavior + const mem = os.totalmem() + return mem >= (8*1073741824) ? '4G' : (mem >= (6*1073741824) ? '3G' : '2G') + } } /** @@ -503,18 +508,18 @@ exports.setModConfiguration = function(serverid, configuration){ // Java Settings -function defaultJavaConfig(mcVersion) { - if(mcVersionAtLeast('1.17', mcVersion)) { - return defaultJavaConfig117() +function defaultJavaConfig(effectiveJavaOptions, ram) { + if(effectiveJavaOptions.suggestedMajor > 8) { + return defaultJavaConfig17(ram) } else { - return defaultJavaConfigBelow117() + return defaultJavaConfig8(ram) } } -function defaultJavaConfigBelow117() { +function defaultJavaConfig17(ram) { return { - minRAM: resolveMinRAM(), - maxRAM: resolveMaxRAM(), // Dynamic + minRAM: resolveSelectedRAM(ram), + maxRAM: resolveSelectedRAM(ram), executable: null, jvmOptions: [ '-XX:+UseConcMarkSweepGC', @@ -525,10 +530,10 @@ function defaultJavaConfigBelow117() { } } -function defaultJavaConfig117() { +function defaultJavaConfig8(ram) { return { - minRAM: resolveMinRAM(), - maxRAM: resolveMaxRAM(), // Dynamic + minRAM: resolveSelectedRAM(ram), + maxRAM: resolveSelectedRAM(ram), executable: null, jvmOptions: [ '-XX:+UnlockExperimentalVMOptions', @@ -547,9 +552,9 @@ function defaultJavaConfig117() { * @param {string} serverid The server id. * @param {*} mcVersion The minecraft version of the server. */ -exports.ensureJavaConfig = function(serverid, mcVersion) { +exports.ensureJavaConfig = function(serverid, effectiveJavaOptions, ram) { if(!Object.prototype.hasOwnProperty.call(config.javaConfig, serverid)) { - config.javaConfig[serverid] = defaultJavaConfig(mcVersion) + config.javaConfig[serverid] = defaultJavaConfig(effectiveJavaOptions, ram) } } diff --git a/app/assets/js/scripts/settings.js b/app/assets/js/scripts/settings.js index a96238d..1b8b09b 100644 --- a/app/assets/js/scripts/settings.js +++ b/app/assets/js/scripts/settings.js @@ -156,7 +156,7 @@ async function initSettingsValues(){ if(cVal === 'MinRAM' || cVal === 'MaxRAM'){ let val = gFn.apply(null, gFnOpts) if(val.endsWith('M')){ - val = Number(val.substring(0, val.length-1))/1000 + val = Number(val.substring(0, val.length-1))/1024 } else { val = Number.parseFloat(val) } @@ -1158,16 +1158,6 @@ const settingsJavaExecDetails = document.getElementById('settingsJavaExecDetails const settingsJavaReqDesc = document.getElementById('settingsJavaReqDesc') const settingsJvmOptsLink = document.getElementById('settingsJvmOptsLink') -// Store maximum memory values. -const SETTINGS_MAX_MEMORY = ConfigManager.getAbsoluteMaxRAM() -const SETTINGS_MIN_MEMORY = ConfigManager.getAbsoluteMinRAM() - -// Set the max and min values for the ranged sliders. -settingsMaxRAMRange.setAttribute('max', SETTINGS_MAX_MEMORY) -settingsMaxRAMRange.setAttribute('min', SETTINGS_MIN_MEMORY) -settingsMinRAMRange.setAttribute('max', SETTINGS_MAX_MEMORY) -settingsMinRAMRange.setAttribute('min', SETTINGS_MIN_MEMORY ) - // Bind on change event for min memory container. settingsMinRAMRange.onchange = (e) => { @@ -1178,7 +1168,7 @@ settingsMinRAMRange.onchange = (e) => { // Get reference to range bar. const bar = e.target.getElementsByClassName('rangeSliderBar')[0] // Calculate effective total memory. - const max = (os.totalmem()-1000000000)/1000000000 + const max = os.totalmem()/1073741824 // Change range bar color based on the selected value. if(sMinV >= max/2){ @@ -1210,7 +1200,7 @@ settingsMaxRAMRange.onchange = (e) => { // Get reference to range bar. const bar = e.target.getElementsByClassName('rangeSliderBar')[0] // Calculate effective total memory. - const max = (os.totalmem()-1000000000)/1000000000 + const max = os.totalmem()/1073741824 // Change range bar color based on the selected value. if(sMaxV >= max/2){ @@ -1338,8 +1328,8 @@ function updateRangedSlider(element, value, notch){ * Display the total and available RAM. */ function populateMemoryStatus(){ - settingsMemoryTotal.innerHTML = Number((os.totalmem()-1000000000)/1000000000).toFixed(1) + 'G' - settingsMemoryAvail.innerHTML = Number(os.freemem()/1000000000).toFixed(1) + 'G' + settingsMemoryTotal.innerHTML = Number((os.totalmem()-1073741824)/1073741824).toFixed(1) + 'G' + settingsMemoryAvail.innerHTML = Number(os.freemem()/1073741824).toFixed(1) + 'G' } /** @@ -1360,15 +1350,12 @@ async function populateJavaExecDetails(execPath){ } } -// TODO Update to use semver range -async function populateJavaReqDesc() { - const server = (await DistroAPI.getDistribution()).getServerById(ConfigManager.getSelectedServer()) +function populateJavaReqDesc(server) { settingsJavaReqDesc.innerHTML = `Requires Java ${server.effectiveJavaOptions.suggestedMajor} x64.` } // TODO Update to use semver range -async function populateJvmOptsLink() { - const server = (await DistroAPI.getDistribution()).getServerById(ConfigManager.getSelectedServer()) +function populateJvmOptsLink(server) { const major = server.effectiveJavaOptions.suggestedMajor settingsJvmOptsLink.innerHTML = `Available Options for Java ${major} (HotSpot VM)` if(major >= 12) { @@ -1385,14 +1372,28 @@ async function populateJvmOptsLink() { } } +function bindMinMaxRam(server) { + // Store maximum memory values. + const SETTINGS_MAX_MEMORY = ConfigManager.getAbsoluteMaxRAM(server.rawServer.javaOptions?.ram) + const SETTINGS_MIN_MEMORY = ConfigManager.getAbsoluteMinRAM(server.rawServer.javaOptions?.ram) + + // Set the max and min values for the ranged sliders. + settingsMaxRAMRange.setAttribute('max', SETTINGS_MAX_MEMORY) + settingsMaxRAMRange.setAttribute('min', SETTINGS_MIN_MEMORY) + settingsMinRAMRange.setAttribute('max', SETTINGS_MAX_MEMORY) + settingsMinRAMRange.setAttribute('min', SETTINGS_MIN_MEMORY) +} + /** * Prepare the Java tab for display. */ async function prepareJavaTab(){ - bindRangeSlider() + const server = (await DistroAPI.getDistribution()).getServerById(ConfigManager.getSelectedServer()) + bindMinMaxRam(server) + bindRangeSlider(server) populateMemoryStatus() - await populateJavaReqDesc() - await populateJvmOptsLink() + populateJavaReqDesc(server) + populateJvmOptsLink(server) } /** diff --git a/app/assets/js/scripts/uibinder.js b/app/assets/js/scripts/uibinder.js index 71b6067..a1cf7eb 100644 --- a/app/assets/js/scripts/uibinder.js +++ b/app/assets/js/scripts/uibinder.js @@ -234,7 +234,7 @@ function ensureJavaSettings(data) { // Nothing too fancy for now. for(const serv of data.servers){ - ConfigManager.ensureJavaConfig(serv.rawServer.id, serv.rawServer.minecraftVersion) + ConfigManager.ensureJavaConfig(serv.rawServer.id, serv.effectiveJavaOptions, serv.rawServer.javaOptions?.ram) } ConfigManager.save()