launchprocess.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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 fs = require('fs')
  7. const unzip = require('unzip')
  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. })
  19. }
  20. finalizeArguments = function(versionData, authData, basePath){
  21. const mcArgs = versionData['minecraftArguments']
  22. const gameProfile = authData['selectedProfile']
  23. const regex = new RegExp('\\${*(.*)}')
  24. const argArr = mcArgs.split(' ')
  25. argArr.unshift('net.minecraft.client.main.Main')
  26. argArr.unshift(classpathArg(versionData, basePath))
  27. argArr.unshift('-cp')
  28. argArr.unshift('-Djava.library.path=' + path.join(basePath, 'natives'))
  29. argArr.unshift('-Xmn128M')
  30. argArr.unshift('-XX:-UseAdaptiveSizePolicy')
  31. argArr.unshift('-XX:+CMSIncrementalMode')
  32. argArr.unshift('-XX:+UseConcMarkSweepGC')
  33. argArr.unshift('-Xmx1G')
  34. for(let i=0; i<argArr.length; i++){
  35. if(regex.test(argArr[i])){
  36. const identifier = argArr[i].match(regex)[1]
  37. let newVal = argArr[i]
  38. switch(identifier){
  39. case 'auth_player_name':
  40. newVal = gameProfile['name']
  41. break
  42. case 'version_name':
  43. newVal = versionData['id']
  44. break
  45. case 'game_directory':
  46. newVal = basePath
  47. break
  48. case 'assets_root':
  49. newVal = path.join(basePath, 'assets')
  50. break
  51. case 'assets_index_name':
  52. newVal = versionData['assets']
  53. break
  54. case 'auth_uuid':
  55. newVal = gameProfile['id']
  56. break
  57. case 'auth_access_token':
  58. newVal = authData['accessToken']
  59. break
  60. case 'user_type':
  61. newVal = 'MOJANG'
  62. break
  63. case 'version_type':
  64. newVal = versionData['type']
  65. break
  66. }
  67. argArr[i] = newVal
  68. }
  69. }
  70. return argArr
  71. }
  72. classpathArg = function(versionData, basePath){
  73. const libArr = versionData['libraries']
  74. const libPath = path.join(basePath, 'libraries')
  75. const nativePath = path.join(basePath, 'natives')
  76. const version = versionData['id']
  77. const cpArgs = [path.join(basePath, 'versions', version, version + '.jar')]
  78. libArr.forEach(function(lib){
  79. if(ag.Library.validateRules(lib['rules'])){
  80. if(lib['natives'] == null){
  81. const dlInfo = lib['downloads']
  82. const artifact = dlInfo['artifact']
  83. const to = path.join(libPath, artifact['path'])
  84. cpArgs.push(to)
  85. } else {
  86. //Now we need to extract natives.
  87. const natives = lib['natives']
  88. const extractInst = lib['extract']
  89. const exclusionArr = extractInst['exclude']
  90. const opSys = ag.Library.mojangFriendlyOS()
  91. const indexId = natives[opSys]
  92. const dlInfo = lib['downloads']
  93. const classifiers = dlInfo['classifiers']
  94. const artifact = classifiers[indexId]
  95. const to = path.join(libPath, artifact['path'])
  96. fs.createReadStream(to).pipe(unzip.Parse()).on('entry', function(entry){
  97. const fileName = entry.path
  98. const type = entry.type
  99. const size = entry.size
  100. console.log(fileName)
  101. let shouldExclude = false
  102. exclusionArr.forEach(function(exclusion){
  103. if(exclusion.indexOf(fileName) > -1){
  104. shouldExclude = true
  105. }
  106. })
  107. if(shouldExclude){
  108. entry.autodrain()
  109. }
  110. else {
  111. mkpath.sync(path.join(nativePath, fileName, '..'))
  112. entry.pipe(fs.createWriteStream(path.join(nativePath, fileName)))
  113. }
  114. })
  115. cpArgs.push(to)
  116. }
  117. }
  118. })
  119. return cpArgs.join(';')
  120. }
  121. module.exports = {
  122. launchMinecraft
  123. }