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