launchprocess.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. launchMinecraft = function(versionData, basePath){
  10. const authPromise = mojang.auth('EMAIL', 'PASS', uuidV4(), {
  11. name: 'Minecraft',
  12. version: 1
  13. })
  14. authPromise.then(function(data){
  15. const args = finalizeArguments(versionData, 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. finalizeArguments = function(versionData, authData, basePath){
  30. const mcArgs = versionData['minecraftArguments']
  31. const gameProfile = authData['selectedProfile']
  32. const regex = new RegExp('\\${*(.*)}')
  33. const argArr = mcArgs.split(' ')
  34. argArr.unshift('net.minecraft.client.main.Main')
  35. argArr.unshift(classpathArg(versionData, basePath))
  36. argArr.unshift('-cp')
  37. argArr.unshift('-Djava.library.path=' + path.join(basePath, 'natives'))
  38. argArr.unshift('-Xmn128M')
  39. argArr.unshift('-XX:-UseAdaptiveSizePolicy')
  40. argArr.unshift('-XX:+CMSIncrementalMode')
  41. argArr.unshift('-XX:+UseConcMarkSweepGC')
  42. argArr.unshift('-Xmx1G')
  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 argArr
  80. }
  81. classpathArg = function(versionData, basePath){
  82. const libArr = versionData['libraries']
  83. const libPath = path.join(basePath, 'libraries')
  84. const nativePath = path.join(basePath, 'natives')
  85. const version = versionData['id']
  86. const cpArgs = [path.join(basePath, 'versions', version, version + '.jar')]
  87. libArr.forEach(function(lib){
  88. if(ag.Library.validateRules(lib['rules'])){
  89. if(lib['natives'] == null){
  90. const dlInfo = lib['downloads']
  91. const artifact = dlInfo['artifact']
  92. const to = path.join(libPath, artifact['path'])
  93. cpArgs.push(to)
  94. } else {
  95. //Now we need to extract natives.
  96. const natives = lib['natives']
  97. const extractInst = lib['extract']
  98. const exclusionArr = extractInst['exclude']
  99. const opSys = ag.Library.mojangFriendlyOS()
  100. const indexId = natives[opSys]
  101. const dlInfo = lib['downloads']
  102. const classifiers = dlInfo['classifiers']
  103. const artifact = classifiers[indexId]
  104. const to = path.join(libPath, artifact['path'])
  105. let zip = new AdmZip(to)
  106. let zipEntries = zip.getEntries()
  107. for(let i=0; i<zipEntries.length; i++){
  108. const fileName = zipEntries[i].entryName
  109. let shouldExclude = false
  110. exclusionArr.forEach(function(exclusion){
  111. if(exclusion.indexOf(fileName) > -1){
  112. shouldExclude = true
  113. }
  114. })
  115. if(!shouldExclude){
  116. mkpath.sync(path.join(nativePath, fileName, '..'))
  117. fs.writeFile(path.join(nativePath, fileName), zipEntries[i].getData())
  118. }
  119. }
  120. cpArgs.push(to)
  121. }
  122. }
  123. })
  124. return cpArgs.join(';')
  125. }
  126. module.exports = {
  127. launchMinecraft
  128. }