launchprocess.js 7.4 KB

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