Files
DeEarthX-V2/src/ml_install/forge.ts
2025-08-14 13:44:53 +08:00

125 lines
4.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<any>;
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}`;
}