125 lines
4.1 KiB
TypeScript
125 lines
4.1 KiB
TypeScript
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}`;
|
||
}
|