mirror of
https://github.com/dscalzi/HeliosLauncher.git
synced 2024-12-22 03:32:12 -08:00
Compare commits
4 Commits
4636f7200c
...
3837588ecd
Author | SHA1 | Date | |
---|---|---|---|
|
3837588ecd | ||
|
21756de784 | ||
|
8e76d6a2b9 | ||
|
a6e3d2b85c |
@ -5,7 +5,7 @@
|
|||||||
},
|
},
|
||||||
"extends": "eslint:recommended",
|
"extends": "eslint:recommended",
|
||||||
"parserOptions": {
|
"parserOptions": {
|
||||||
"ecmaVersion": 2019,
|
"ecmaVersion": 2021,
|
||||||
"sourceType": "module"
|
"sourceType": "module"
|
||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
|
@ -118,7 +118,7 @@ class Module {
|
|||||||
* @returns {Module} The parsed Module.
|
* @returns {Module} The parsed Module.
|
||||||
*/
|
*/
|
||||||
static fromJSON(json, serverid){
|
static fromJSON(json, serverid){
|
||||||
return new Module(json.id, json.name, json.type, json.required, json.artifact, json.subModules, serverid)
|
return new Module(json.id, json.name, json.type, json.classpath, json.required, json.artifact, json.subModules, serverid)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -143,9 +143,10 @@ class Module {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(id, name, type, required, artifact, subModules, serverid) {
|
constructor(id, name, type, classpath, required, artifact, subModules, serverid) {
|
||||||
this.identifier = id
|
this.identifier = id
|
||||||
this.type = type
|
this.type = type
|
||||||
|
this.classpath = classpath
|
||||||
this._resolveMetaData()
|
this._resolveMetaData()
|
||||||
this.name = name
|
this.name = name
|
||||||
this.required = Required.fromJSON(required)
|
this.required = Required.fromJSON(required)
|
||||||
@ -306,6 +307,13 @@ class Module {
|
|||||||
return this.type
|
return this.type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {boolean} Whether or not this library should be on the classpath.
|
||||||
|
*/
|
||||||
|
getClasspath(){
|
||||||
|
return this.classpath ?? true
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
exports.Module
|
exports.Module
|
||||||
|
|
||||||
|
@ -709,6 +709,7 @@ class ProcessBuilder {
|
|||||||
* @returns {{[id: string]: string}} An object containing the paths of each library mojang declares.
|
* @returns {{[id: string]: string}} An object containing the paths of each library mojang declares.
|
||||||
*/
|
*/
|
||||||
_resolveMojangLibraries(tempNativePath){
|
_resolveMojangLibraries(tempNativePath){
|
||||||
|
const nativesRegex = /.+:natives-([^-]+)(?:-(.+))?/
|
||||||
const libs = {}
|
const libs = {}
|
||||||
|
|
||||||
const libArr = this.versionData.libraries
|
const libArr = this.versionData.libraries
|
||||||
@ -716,27 +717,23 @@ class ProcessBuilder {
|
|||||||
for(let i=0; i<libArr.length; i++){
|
for(let i=0; i<libArr.length; i++){
|
||||||
const lib = libArr[i]
|
const lib = libArr[i]
|
||||||
if(Library.validateRules(lib.rules, lib.natives)){
|
if(Library.validateRules(lib.rules, lib.natives)){
|
||||||
if(lib.natives == null){
|
|
||||||
const dlInfo = lib.downloads
|
// Pre-1.19 has a natives object.
|
||||||
const artifact = dlInfo.artifact
|
if(lib.natives != null) {
|
||||||
const to = path.join(this.libPath, artifact.path)
|
|
||||||
const versionIndependentId = lib.name.substring(0, lib.name.lastIndexOf(':'))
|
|
||||||
libs[versionIndependentId] = to
|
|
||||||
} else {
|
|
||||||
// Extract the native library.
|
// Extract the native library.
|
||||||
const exclusionArr = lib.extract != null ? lib.extract.exclude : ['META-INF/']
|
const exclusionArr = lib.extract != null ? lib.extract.exclude : ['META-INF/']
|
||||||
const artifact = lib.downloads.classifiers[lib.natives[Library.mojangFriendlyOS()].replace('${arch}', process.arch.replace('x', ''))]
|
const artifact = lib.downloads.classifiers[lib.natives[Library.mojangFriendlyOS()].replace('${arch}', process.arch.replace('x', ''))]
|
||||||
|
|
||||||
// Location of native zip.
|
// Location of native zip.
|
||||||
const to = path.join(this.libPath, artifact.path)
|
const to = path.join(this.libPath, artifact.path)
|
||||||
|
|
||||||
let zip = new AdmZip(to)
|
let zip = new AdmZip(to)
|
||||||
let zipEntries = zip.getEntries()
|
let zipEntries = zip.getEntries()
|
||||||
|
|
||||||
// Unzip the native zip.
|
// Unzip the native zip.
|
||||||
for(let i=0; i<zipEntries.length; i++){
|
for(let i=0; i<zipEntries.length; i++){
|
||||||
const fileName = zipEntries[i].entryName
|
const fileName = zipEntries[i].entryName
|
||||||
|
|
||||||
let shouldExclude = false
|
let shouldExclude = false
|
||||||
|
|
||||||
// Exclude noted files.
|
// Exclude noted files.
|
||||||
@ -754,9 +751,68 @@ class ProcessBuilder {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 1.19+ logic
|
||||||
|
else if(lib.name.includes('natives-')) {
|
||||||
|
|
||||||
|
const regexTest = nativesRegex.exec(lib.name)
|
||||||
|
// const os = regexTest[1]
|
||||||
|
const arch = regexTest[2] ?? 'x64'
|
||||||
|
|
||||||
|
if(arch != process.arch) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract the native library.
|
||||||
|
const exclusionArr = lib.extract != null ? lib.extract.exclude : ['META-INF/', '.git', '.sha1']
|
||||||
|
const artifact = lib.downloads.artifact
|
||||||
|
|
||||||
|
// Location of native zip.
|
||||||
|
const to = path.join(this.libPath, artifact.path)
|
||||||
|
|
||||||
|
let zip = new AdmZip(to)
|
||||||
|
let zipEntries = zip.getEntries()
|
||||||
|
|
||||||
|
// Unzip the native zip.
|
||||||
|
for(let i=0; i<zipEntries.length; i++){
|
||||||
|
if(zipEntries[i].isDirectory) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
const fileName = zipEntries[i].entryName
|
||||||
|
|
||||||
|
let shouldExclude = false
|
||||||
|
|
||||||
|
// Exclude noted files.
|
||||||
|
exclusionArr.forEach(function(exclusion){
|
||||||
|
if(fileName.indexOf(exclusion) > -1){
|
||||||
|
shouldExclude = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const extractName = fileName.includes('/') ? fileName.substring(fileName.lastIndexOf('/')) : fileName
|
||||||
|
|
||||||
|
// Extract the file.
|
||||||
|
if(!shouldExclude){
|
||||||
|
fs.writeFile(path.join(tempNativePath, extractName), zipEntries[i].getData(), (err) => {
|
||||||
|
if(err){
|
||||||
|
logger.error('Error while extracting native library:', err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// No natives
|
||||||
|
else {
|
||||||
|
const dlInfo = lib.downloads
|
||||||
|
const artifact = dlInfo.artifact
|
||||||
|
const to = path.join(this.libPath, artifact.path)
|
||||||
|
const versionIndependentId = lib.name.substring(0, lib.name.lastIndexOf(':'))
|
||||||
|
libs[versionIndependentId] = to
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -816,15 +872,9 @@ class ProcessBuilder {
|
|||||||
for(let sm of mdl.getSubModules()){
|
for(let sm of mdl.getSubModules()){
|
||||||
if(sm.getType() === DistroManager.Types.Library){
|
if(sm.getType() === DistroManager.Types.Library){
|
||||||
|
|
||||||
// TODO Add as file or something.
|
if(sm.getClasspath()) {
|
||||||
const x = sm.getIdentifier()
|
libs.push(sm.getArtifact().getPath())
|
||||||
console.log(x)
|
|
||||||
if(x.includes(':universal') || x.includes(':slim') || x.includes(':extra') || x.includes(':srg') || x.includes(':client')) {
|
|
||||||
console.log('SKIPPING ' + x)
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
libs.push(sm.getArtifact().getPath())
|
|
||||||
}
|
}
|
||||||
// If this module has submodules, we need to resolve the libraries for those.
|
// If this module has submodules, we need to resolve the libraries for those.
|
||||||
// To avoid unnecessary recursive calls, base case is checked here.
|
// To avoid unnecessary recursive calls, base case is checked here.
|
||||||
|
@ -138,8 +138,8 @@ function initSettingsValues(){
|
|||||||
if(v.type === 'number' || v.type === 'text'){
|
if(v.type === 'number' || v.type === 'text'){
|
||||||
// Special Conditions
|
// Special Conditions
|
||||||
if(cVal === 'JavaExecutable'){
|
if(cVal === 'JavaExecutable'){
|
||||||
populateJavaExecDetails(v.value)
|
|
||||||
v.value = gFn.apply(null, gFnOpts)
|
v.value = gFn.apply(null, gFnOpts)
|
||||||
|
populateJavaExecDetails(v.value)
|
||||||
} else if (cVal === 'DataDirectory'){
|
} else if (cVal === 'DataDirectory'){
|
||||||
v.value = gFn.apply(null, gFnOpts)
|
v.value = gFn.apply(null, gFnOpts)
|
||||||
} else if(cVal === 'JVMOptions'){
|
} else if(cVal === 'JVMOptions'){
|
||||||
@ -1380,7 +1380,6 @@ function prepareJavaTab(){
|
|||||||
bindRangeSlider()
|
bindRangeSlider()
|
||||||
populateMemoryStatus()
|
populateMemoryStatus()
|
||||||
populateJavaReqDesc()
|
populateJavaReqDesc()
|
||||||
populateJavaExecDetails()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -208,6 +208,12 @@ The name of the module. Used on the UI.
|
|||||||
|
|
||||||
The type of the module.
|
The type of the module.
|
||||||
|
|
||||||
|
### `Module.classpath: boolean`
|
||||||
|
|
||||||
|
**OPTIONAL**
|
||||||
|
|
||||||
|
If the module is of type `Library`, whether the library should be added to the classpath. Defaults to true.
|
||||||
|
|
||||||
### `Module.required: Required`
|
### `Module.required: Required`
|
||||||
|
|
||||||
**OPTIONAL**
|
**OPTIONAL**
|
||||||
|
Loading…
Reference in New Issue
Block a user