launchprocess.js 4.8 KB

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