import got from "got"; import fse from "fs-extra"; import AdmZip from "adm-zip"; import pMap from "p-map"; import pRetry from "p-retry"; import cp from "child_process"; import { xfastdownload } from "../utils/utils.js"; import { LOGGER } from "../utils/logger.js"; const gotx = got.extend({ prefixUrl: "https://bmclapi2.bangbang93.com", headers: { "User-Agent": "DeEarthX" }, }); interface mcinfoX { libraries: Array; downloads: any; } export default async function install( minecraftversion: string, loaderversion: string, path: string ) { //instance const mcinfo = (await gotx .get(`version/${minecraftversion}/json`,{ headers: { "User-Agent": "DeEarthX" } }) .json()) as mcinfoX; //获取Minecraft版本JSON const forgepath = path; const forgedata = ( await gotx.get( `forge/download?mcversion=${minecraftversion}&version=${loaderversion}&category=installer&format=jar`, ) ).rawBody; fse.outputFileSync( `${forgepath}/Forge-${minecraftversion}-${loaderversion}.jar`, forgedata ); //下载Installer.jar LOGGER.info(`下载Forge-${minecraftversion}-${loaderversion}.jar完成!`); const zip = new AdmZip( `${forgepath}/Forge-${minecraftversion}-${loaderversion}.jar` ).getEntries(); for (let x = 0; x < zip.length; x++) { //获取ZIP里的version.json信息 const e = zip[x]; if (e.entryName == "version.json") { const fvdata = JSON.parse(e.getData().toString("utf-8")).libraries; for (let c = 0; c < fvdata.length; c++) { //下载依赖1 const t = fvdata[c].downloads.artifact; await xfastdownload( `https://bmclapi2.bangbang93.com/maven${new URL(t.url).pathname}`, `${forgepath}/libraries/${t.path}`, 16 ); } } else if (e.entryName == "install_profile.json") { const json = JSON.parse(e.getData().toString("utf-8")); const fvdata = json.libraries; for (let c = 0; c < fvdata.length; c++) { //下载依赖2 const t = fvdata[c].downloads.artifact; await xfastdownload( `https://bmclapi2.bangbang93.com/maven${new URL(t.url).pathname}`, `${forgepath}/libraries/${t.path}`, 16 ); } //下载MAPPING与MOJMAPS /*MOJMAPS*/ await xfastdownload( `https://bmclapi2.bangbang93.com${new URL(mcinfo.downloads.server_mappings.url).pathname}`, `${forgepath}/libraries/${mavenToUrl( json.data.MOJMAPS.server.replace(/[[\]]/g, ""), "" )}` ); /*MAPPING*/ const tmp = `de/oceanlabs/mcp/mcp_config/${minecraftversion}-${json.data.MCP_VERSION.server.replace( /['"]/g, "" )}/mcp_config-${minecraftversion}-${json.data.MCP_VERSION.server.replace( /['"]/g, "" )}.zip`; await xfastdownload(`https://bmclapi2.bangbang93.com/maven/${tmp}`, `${forgepath}/libraries/${tmp}`); LOGGER.info("下载MAPPING与MOJMAPS完成!"); } } LOGGER.info(`下载Forge的libraries完成!`); for (let d = 0; d < mcinfo.libraries.length; d++) { const g = mcinfo.libraries[d].downloads.artifact; await xfastdownload( `https://bmclapi2.bangbang93.com/maven${new URL(g.url).pathname}`, `${forgepath}/libraries/${g.path}`, 16 ); } LOGGER.info(`下载Minecraft的Maven完成!`); await xfastdownload( `https://bmclapi2.bangbang93.com/version/${minecraftversion}/server`, `${forgepath}/libraries/net/minecraft/server/${minecraftversion}/server-${minecraftversion}.jar`, 1 ); try { cp.execSync( `java -jar Forge-${minecraftversion}-${loaderversion}.jar --installServer`, { cwd: forgepath, stdio: "ignore" } ); //执行Forge安装命令 } catch (e) {} LOGGER.info("Forge安装完成!!!"); } function mavenToUrl( coordinate: { split: (arg0: string) => [any, any, any, any] }, base = "maven" ) { const [g, a, v, ce] = coordinate.split(":"); const [c, e = "jar"] = (ce || "").split("@"); return `${base.replace(/\/$/, "")}/${g.replace( /\./g, "/" )}/${a}/${v}/${a}-${v}${c ? "-" + c : ""}.${e}`; }