launchprocess.js 8.3 KB

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