Minecraft-Recipe-Tools/extract_recipes.js

102 lines
2.8 KiB
JavaScript
Raw Normal View History

2024-12-10 01:49:42 +08:00
const fs = require("fs");
const path = require("path");
const AdmZip = require("adm-zip"); // 用于解压 .jar 文件
// 创建文件夹(如果不存在)
function createDirIfNotExist(dirPath) {
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath, { recursive: true });
}
}
/*// 写入 pack.mcmeta 文件
function writePackMcmeta() {
const packMcmetaPath = "./recipes/pack.mcmeta";
const packContent = {
pack: {
description: "通用了部分整合包模组的物品",
pack_format: 9,
},
};
if (!fs.existsSync(packMcmetaPath)) {
fs.writeFileSync(
packMcmetaPath,
JSON.stringify(packContent, null, 2),
"utf8"
);
console.log("创建并写入 pack.mcmeta 文件");
}
}*/
// 获取 .jar 文件列表
function getJarFiles(dirPath) {
const files = fs.readdirSync(dirPath);
return files.filter((file) => file.endsWith(".jar"));
}
// 解压 .jar 文件中的特定目录
function extractRecipesFromJar(jarPath, dir) {
const zip = new AdmZip(jarPath);
const recipesPath = `data/${dir}/recipes/`;
const entries = zip.getEntries();
// 查找并解压 recipes 文件夹中的内容
entries.forEach((entry) => {
if (/^data\/[^\/]+\/recipes\/.*$/.test(entry.entryName)) {
const targetFile = path.join(__dirname, entry.entryName);
const targetPath = path.dirname(targetFile)
if (entry.isDirectory){
createDirIfNotExist(targetFile);
} else {
createDirIfNotExist(targetPath);
fs.writeFileSync(targetFile, entry.getData());
}
// console.log(`解压文件到 ${targetFile}`);
}
});
}
// 处理 mods 目录下的所有 .jar 文件
function processMods() {
const modsDir = "./mods";
// const recipesDir = "./recipes";
if (fs.existsSync("./data")) {
fs.rmSync("./data", { recursive: true, force: true });
}
// createDirIfNotExist(recipesDir); // 确保 ./recipes 文件夹存在
// writePackMcmeta(); // 确保 ./recipes/pack.mcmeta 文件存在
const jarFiles = getJarFiles(modsDir);
jarFiles.forEach((jarFile) => {
const jarPath = path.join(modsDir, jarFile);
console.log(`正在读取 ${jarPath}`);
const zip = new AdmZip(jarPath);
const dataEntry = zip.getEntry("data/");
// console.log(zip.getEntries().map((v) => v.entryName).filter((v) => /data\/[a-zA-Z]+\/recipes\/.*/.test(v)));
if (!dataEntry) {
console.log(`未找到 data 目录: ${jarPath}`);
return;
}
// 获取 /data 文件夹内的所有子文件夹目录
const dirList = [];
const entries = zip.getEntries();
entries.forEach((entry) => {
const match = entry.entryName.match(/^data\/([^\/]+)/);
if (match && !dirList.includes(match[1])) {
dirList.push(match[1]);
}
});
// 遍历并解压每个目录下的 recipes 文件夹
dirList.forEach((dir) => {
extractRecipesFromJar(jarPath, dir);
});
});
}
processMods();