launchprocess.js 4.9 KB

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