From ea758aee1f7ec2fc84e05f2f825247693593b0b2 Mon Sep 17 00:00:00 2001 From: Daniel Scalzi Date: Sat, 28 Apr 2018 23:34:23 -0400 Subject: [PATCH] Various optimizations related to library extraction. Updated PackXZExtract to v1.0.1. If no files are queued for extraction, the step is skipped. The UI now shows some indication that the extraction is in progress. --- app/assets/js/assetguard.js | 12 ++++++---- app/assets/js/scripts/landing.js | 37 +++++++++++++++++++++++++++++-- libraries/java/PackXZExtract.jar | Bin 109732 -> 109811 bytes 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/app/assets/js/assetguard.js b/app/assets/js/assetguard.js index 10c4fed5..62989e1a 100644 --- a/app/assets/js/assetguard.js +++ b/app/assets/js/assetguard.js @@ -1574,11 +1574,15 @@ class AssetGuard extends EventEmitter { self.progress -= self[identifier].dlsize self[identifier] = new DLTracker([], 0) if(self.totaldlsize === 0) { - self.emit('extracting') - AssetGuard._extractPackXZ(self.extractQueue, self.javaexec).then(() => { - self.extractQueue = [] + if(self.extractQueue.length > 0){ + self.emit('extracting') + AssetGuard._extractPackXZ(self.extractQueue, self.javaexec).then(() => { + self.extractQueue = [] + self.emit('dlcomplete') + }) + } else { self.emit('dlcomplete') - }) + } } }) return true diff --git a/app/assets/js/scripts/landing.js b/app/assets/js/scripts/landing.js index 599fedca..6a6088cb 100644 --- a/app/assets/js/scripts/landing.js +++ b/app/assets/js/scripts/landing.js @@ -216,6 +216,8 @@ let serverStatusListener = setInterval(() => refreshServerStatus(true), 300000) let sysAEx let scanAt +let extractListener + function asyncSystemScan(launchAfter = true){ setLaunchDetails('Please wait..') @@ -315,7 +317,17 @@ function asyncSystemScan(launchAfter = true){ remote.getCurrentWindow().setProgressBar(-1) // Wait for extration to complete. - setLaunchDetails('Extracting..') + const eLStr = 'Extracting' + let dotStr = '' + setLaunchDetails(eLStr) + extractListener = setInterval(() => { + if(dotStr.length >= 3){ + dotStr = '' + } else { + dotStr += '.' + } + setLaunchDetails(eLStr + dotStr) + }, 750) } else if(m.task === 2){ @@ -323,6 +335,11 @@ function asyncSystemScan(launchAfter = true){ ConfigManager.setJavaExecutable(m.jPath) ConfigManager.save() + if(extractListener != null){ + clearInterval(extractListener) + extractListener = null + } + setLaunchDetails('Java Installed!') if(launchAfter){ @@ -356,6 +373,8 @@ let serv let versionData let forgeData +let progressListener + function dlAsync(login = true){ // Login parameter is temporary for debug purposes. Allows testing the validation/downloads without @@ -443,12 +462,26 @@ function dlAsync(login = true){ } else if(m.task === 0.7){ // Download done, extracting. - setLaunchDetails('Extracting libraries..') + const eLStr = 'Extracting libraries' + let dotStr = '' + setLaunchDetails(eLStr) + progressListener = setInterval(() => { + if(dotStr.length >= 3){ + dotStr = '' + } else { + dotStr += '.' + } + setLaunchDetails(eLStr + dotStr) + }, 750) } else if(m.task === 1){ // Download will be at 100%, remove the loading from the OS progress bar. remote.getCurrentWindow().setProgressBar(-1) + if(progressListener != null){ + clearInterval(progressListener) + progressListener = null + } setLaunchDetails('Preparing to launch..') aEx.send({task: 0, content: 'loadForgeData', argsArr: [serv.id]}) diff --git a/libraries/java/PackXZExtract.jar b/libraries/java/PackXZExtract.jar index 5994c154287029932cbf755b9db592b704a4fd7d..e0c4a7d476afa4c3d4fe8900d05adef2e80d5371 100644 GIT binary patch delta 10201 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