UNPKG

@furox/minecraft-java-core

Version:

A library starting minecraft game NW.js and Electron.js

155 lines (154 loc) 7.67 kB
"use strict"; /** * @author Luuxis * @license CC-BY-NC 4.0 - https://creativecommons.org/licenses/by-nc/4.0/ */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const events_1 = require("events"); const path_1 = __importDefault(require("path")); const child_process_1 = require("child_process"); const Minecraft_Json_js_1 = __importDefault(require("./Minecraft/Minecraft-Json.js")); const Minecraft_Libraries_js_1 = __importDefault(require("./Minecraft/Minecraft-Libraries.js")); const Minecraft_Assets_js_1 = __importDefault(require("./Minecraft/Minecraft-Assets.js")); const Minecraft_Loader_js_1 = __importDefault(require("./Minecraft/Minecraft-Loader.js")); const Minecraft_Java_js_1 = __importDefault(require("./Minecraft/Minecraft-Java.js")); const Minecraft_Bundle_js_1 = __importDefault(require("./Minecraft/Minecraft-Bundle.js")); const Minecraft_Arguments_js_1 = __importDefault(require("./Minecraft/Minecraft-Arguments.js")); const Index_js_1 = require("./utils/Index.js"); const Downloader_js_1 = __importDefault(require("./utils/Downloader.js")); class Launch { constructor() { this.on = events_1.EventEmitter.prototype.on; this.emit = events_1.EventEmitter.prototype.emit; } async Launch(opt) { this.options = { url: opt?.url || null, authenticator: opt?.authenticator || null, timeout: opt?.timeout || 10000, path: path_1.default.resolve(opt?.path || '.Minecraft').replace(/\\/g, '/'), version: opt?.version || 'latest_release', instance: opt?.instance || null, detached: opt?.detached || false, downloadFileMultiple: opt?.downloadFileMultiple || 3, loader: { type: opt?.loader?.type || null, build: opt?.loader?.build || 'latest', enable: opt?.loader?.enable || false, }, verify: opt?.verify || false, ignored: opt?.ignored || [], args: opt?.args || [], javaPath: opt?.javaPath || null, java: true, screen: { width: opt?.screen?.width || null, height: opt?.screen?.height || null, fullscreen: opt?.screen?.fullscreen || false, }, memory: { min: opt?.memory?.min || '1G', max: opt?.memory?.max || '2G' } }; if (!this.options.loader.enable) this.options.loader = false; if (this.options.javaPath) this.options.java = false; this.start(); } async start() { let data = await this.DownloadGame(); if (data.error) return this.emit('error', data); let { minecraftJson, minecraftLoader, minecraftVersion, minecraftJava } = data; let minecraftArguments = await new Minecraft_Arguments_js_1.default(this.options).GetArguments(minecraftJson, minecraftLoader); if (minecraftArguments.error) return this.emit('error', minecraftArguments); let loaderArguments = await new Minecraft_Loader_js_1.default(this.options).GetArguments(minecraftLoader, minecraftVersion); if (loaderArguments.error) return this.emit('error', loaderArguments); let Arguments = [ ...minecraftArguments.jvm, ...loaderArguments.jvm, ...minecraftArguments.classpath, ...loaderArguments.game, ...minecraftArguments.game ]; let java = this.options.javaPath ? this.options.javaPath : minecraftJava.path; let logs = this.options.instance ? `${this.options.path}/instances/${this.options.instance}` : this.options.path; let minecraftDebug = (0, child_process_1.spawn)(java, Arguments, { cwd: logs, detached: this.options.detached }); this.emit('data', `Launching with arguments ${Arguments.join(' ')}`); minecraftDebug.stdout.on('data', (data) => this.emit('data', data.toString('utf-8'))); minecraftDebug.stderr.on('data', (data) => this.emit('data', data.toString('utf-8'))); minecraftDebug.on('close', (code) => this.emit('close', 'Minecraft closed')); } async DownloadGame() { let InfoVersion = await new Minecraft_Json_js_1.default(this.options).GetInfoVersion(); let loaderJson = null; if (InfoVersion.error) return InfoVersion; let { json, version } = InfoVersion; let libraries = new Minecraft_Libraries_js_1.default(this.options); let gameLibraries = await libraries.Getlibraries(json); let gameAssetsOther = await libraries.GetAssetsOthers(this.options.url); let gameAssets = await new Minecraft_Assets_js_1.default(this.options).GetAssets(json); let gameJava = this.options.java ? await new Minecraft_Java_js_1.default(this.options).GetJsonJava(json) : { files: [] }; let bundle = [...gameLibraries, ...gameAssetsOther, ...gameAssets, ...gameJava.files]; let filesList = await new Minecraft_Bundle_js_1.default(this.options).checkBundle(bundle); if (filesList.length > 0) { let downloader = new Downloader_js_1.default(); let totsize = await new Minecraft_Bundle_js_1.default(this.options).getTotalSize(filesList); downloader.on("progress", (DL, totDL, element) => { this.emit("progress", DL, totDL, element); }); downloader.on("speed", (speed) => { this.emit("speed", speed); }); downloader.on("estimated", (time) => { this.emit("estimated", time); }); await downloader.downloadFileMultiple(filesList, totsize, this.options.downloadFileMultiple, this.options.timeout); } if (this.options.loader) { let loaderInstall = new Minecraft_Loader_js_1.default(this.options); loaderInstall.on('extract', (extract) => { this.emit('extract', extract); }); loaderInstall.on('progress', (progress, size, element) => { this.emit('progress', progress, size, element); }); loaderInstall.on('check', (progress, size, element) => { this.emit('check', progress, size, element); }); loaderInstall.on('patch', (patch) => { this.emit('patch', patch); }); let jsonLoader = await loaderInstall.GetLoader(version, this.options.javaPath ? this.options.javaPath : gameJava.path) .then((data) => data) .catch((err) => err); if (jsonLoader.error) return jsonLoader; loaderJson = jsonLoader; } if (this.options.verify) await libraries.checkFiles(bundle); let natives = await libraries.natives(bundle); if (natives.length === 0) json.nativesList = false; else json.nativesList = true; if ((0, Index_js_1.isold)(json)) new Minecraft_Assets_js_1.default(this.options).copyAssets(json); return { minecraftJson: json, minecraftLoader: loaderJson, minecraftVersion: version, minecraftJava: gameJava }; } } exports.default = Launch;