launchprocess.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. const mojang = require('mojang')
  2. const uuidV4 = require('uuid/v4')
  3. const path = require('path')
  4. const child_process = require('child_process')
  5. const ag = require('./assetguard.js')
  6. const AdmZip = require('adm-zip')
  7. const fs = require('fs')
  8. const mkpath = require('mkdirp');
  9. function launchMinecraft(versionData, forgeData, basePath){
  10. const authPromise = mojang.auth('email', 'pass', uuidV4(), {
  11. name: 'Minecraft',
  12. version: 1
  13. })
  14. authPromise.then(function(data){
  15. console.log(data)
  16. const args = finalizeArgumentsForge(versionData, forgeData, data, basePath)
  17. //BRUTEFORCE for testing
  18. //args.push('-mods modstore\\chatbubbles\\chatbubbles\\1.0.1_for_1.11.2\\mod_chatBubbles-1.0.1_for_1.11.2.litemod,modstore\\com\\westeroscraft\\westerosblocks\\3.0.0-beta-71\\westerosblocks-3.0.0-beta-71.jar,modstore\\mezz\\jei\\1.11.2-4.3.5.277\\jei-1.11.2-4.3.5.277.jar,modstore\\net\\optifine\\optifine\\1.11.2_HD_U_B9\\optifine-1.11.2_HD_U_B9.jar')
  19. //args.push('--modListFile absolute:C:\\Users\\Asus\\Desktop\\LauncherElectron\\app\\assets\\WesterosCraft-1.11.2.json')
  20. //TODO make this dynamic
  21. const child = child_process.spawn('C:\\Program Files\\Java\\jre1.8.0_131\\bin\\javaw.exe', args)
  22. child.stdout.on('data', (data) => {
  23. console.log('Minecraft:', data.toString('utf8'))
  24. })
  25. child.stderr.on('data', (data) => {
  26. console.log('Minecraft:', data.toString('utf8'))
  27. })
  28. child.on('close', (code, signal) => {
  29. console.log('Exited with code', code)
  30. })
  31. })
  32. }
  33. function finalizeArgumentsForge(versionData, forgeData, authData, basePath){
  34. const mcArgs = forgeData['minecraftArguments']
  35. const gameProfile = authData['selectedProfile']
  36. const regex = new RegExp('\\${*(.*)}')
  37. const argArr = mcArgs.split(' ')
  38. const staticArgs = ['-Xmx4G',
  39. '-XX:+UseConcMarkSweepGC',
  40. '-XX:+CMSIncrementalMode',
  41. '-XX:-UseAdaptiveSizePolicy',
  42. '-Xmn128M',
  43. '-Djava.library.path=' + path.join(basePath, 'natives'),
  44. '-cp',
  45. classpathArg(versionData, basePath).concat(forgeClasspathArg(forgeData, basePath)).join(';'),
  46. forgeData.mainClass]
  47. for(let i=0; i<argArr.length; i++){
  48. if(regex.test(argArr[i])){
  49. const identifier = argArr[i].match(regex)[1]
  50. let newVal = argArr[i]
  51. switch(identifier){
  52. case 'auth_player_name':
  53. newVal = gameProfile['name']
  54. break
  55. case 'version_name':
  56. //newVal = versionData['id']
  57. newVal = 'WesterosCraft-1.11.2'
  58. break
  59. case 'game_directory':
  60. newVal = basePath
  61. break
  62. case 'assets_root':
  63. newVal = path.join(basePath, 'assets')
  64. break
  65. case 'assets_index_name':
  66. newVal = versionData['assets']
  67. break
  68. case 'auth_uuid':
  69. newVal = gameProfile['id']
  70. break
  71. case 'auth_access_token':
  72. newVal = authData['accessToken']
  73. break
  74. case 'user_type':
  75. newVal = 'MOJANG'
  76. break
  77. case 'version_type':
  78. newVal = versionData['type']
  79. break
  80. }
  81. argArr[i] = newVal
  82. }
  83. }
  84. return staticArgs.concat(argArr)
  85. }
  86. function finalizeArguments(versionData, authData, basePath){
  87. const mcArgs = versionData['minecraftArguments']
  88. const gameProfile = authData['selectedProfile']
  89. const regex = new RegExp('\\${*(.*)}')
  90. const argArr = mcArgs.split(' ')
  91. const staticArgs = ['-Xmx1G',
  92. '-XX:+UseConcMarkSweepGC',
  93. '-XX:+CMSIncrementalMode',
  94. '-XX:-UseAdaptiveSizePolicy',
  95. '-Xmn128M',
  96. '-Djava.library.path=' + path.join(basePath, 'natives'),
  97. '-cp',
  98. classpathArg(versionData, basePath).join(';'),
  99. versionData.mainClass]
  100. for(let i=0; i<argArr.length; i++){
  101. if(regex.test(argArr[i])){
  102. const identifier = argArr[i].match(regex)[1]
  103. let newVal = argArr[i]
  104. switch(identifier){
  105. case 'auth_player_name':
  106. newVal = gameProfile['name']
  107. break
  108. case 'version_name':
  109. newVal = versionData['id']
  110. break
  111. case 'game_directory':
  112. newVal = basePath
  113. break
  114. case 'assets_root':
  115. newVal = path.join(basePath, 'assets')
  116. break
  117. case 'assets_index_name':
  118. newVal = versionData['assets']
  119. break
  120. case 'auth_uuid':
  121. newVal = gameProfile['id']
  122. break
  123. case 'auth_access_token':
  124. newVal = authData['accessToken']
  125. break
  126. case 'user_type':
  127. newVal = 'MOJANG'
  128. break
  129. case 'version_type':
  130. newVal = versionData['type']
  131. break
  132. }
  133. argArr[i] = newVal
  134. }
  135. }
  136. return staticArgs.concat(argArr)
  137. }
  138. function forgeClasspathArg(forgeData, basePath){
  139. const libArr = forgeData['libraries']
  140. const libPath = path.join(basePath, 'libraries')
  141. const cpArgs = []
  142. for(let i=0; i<libArr.length; i++){
  143. const lib = libArr[i]
  144. const to = path.join(libPath, ag._resolvePath(lib.name, '.jar'))
  145. cpArgs.push(to)
  146. }
  147. return cpArgs
  148. }
  149. function classpathArg(versionData, basePath){
  150. const libArr = versionData['libraries']
  151. const libPath = path.join(basePath, 'libraries')
  152. const nativePath = path.join(basePath, 'natives')
  153. const version = versionData['id']
  154. const cpArgs = [path.join(basePath, 'versions', version, version + '.jar')]
  155. libArr.forEach(function(lib){
  156. if(ag.Library.validateRules(lib['rules'])){
  157. if(lib['natives'] == null){
  158. const dlInfo = lib['downloads']
  159. const artifact = dlInfo['artifact']
  160. const to = path.join(libPath, artifact['path'])
  161. cpArgs.push(to)
  162. } else {
  163. //Now we need to extract natives.
  164. const natives = lib['natives']
  165. const extractInst = lib['extract']
  166. const exclusionArr = extractInst['exclude']
  167. const opSys = ag.Library.mojangFriendlyOS()
  168. const indexId = natives[opSys]
  169. const dlInfo = lib['downloads']
  170. const classifiers = dlInfo['classifiers']
  171. const artifact = classifiers[indexId]
  172. const to = path.join(libPath, artifact['path'])
  173. let zip = new AdmZip(to)
  174. let zipEntries = zip.getEntries()
  175. for(let i=0; i<zipEntries.length; i++){
  176. const fileName = zipEntries[i].entryName
  177. let shouldExclude = false
  178. exclusionArr.forEach(function(exclusion){
  179. if(exclusion.indexOf(fileName) > -1){
  180. shouldExclude = true
  181. }
  182. })
  183. if(!shouldExclude){
  184. mkpath.sync(path.join(nativePath, fileName, '..'))
  185. fs.writeFile(path.join(nativePath, fileName), zipEntries[i].getData())
  186. }
  187. }
  188. cpArgs.push(to)
  189. }
  190. }
  191. })
  192. //BRUTEFORCE LIB INJECTION
  193. //FOR TESTING ONLY
  194. cpArgs.push(path.join(libPath, 'com', 'mumfrey', 'liteloader', '1.11.2-SNAPSHOT', 'liteloader-1.11.2-SNAPSHOT.jar'))
  195. return cpArgs
  196. }
  197. module.exports = {
  198. launchMinecraft
  199. }