115 lines
4.2 KiB
Python
115 lines
4.2 KiB
Python
import os
|
|
import sys
|
|
import json
|
|
import zipfile
|
|
import tempfile
|
|
import shutil
|
|
import argparse
|
|
|
|
# 支持的Minecraft版本
|
|
MINECRAFT_VERSIONS = [
|
|
"1.18.1", "1.18.2", "1.19.0", "1.19.1", "1.19.2", "1.19.3", "1.19.4",
|
|
"1.20.0", "1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5", "1.20.6",
|
|
"1.21.0", "1.21.1", "1.21.2", "1.21.3", "1.21.4", "1.21.5", "1.21.6",
|
|
"1.21.7", "1.21.8", "1.21.9", "1.21.10"
|
|
]
|
|
|
|
def modify_jar_for_version(input_jar, output_dir, mc_version):
|
|
"""为特定Minecraft版本修改jar文件"""
|
|
# 构建输出文件名
|
|
base_name = os.path.basename(input_jar)
|
|
name_parts = base_name.split('.')
|
|
output_name = f"{name_parts[0]}-{mc_version}.{'_'.join(name_parts[1:])}"
|
|
output_jar = os.path.join(output_dir, output_name)
|
|
|
|
# 读取原始fabric.mod.json
|
|
original_json = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
|
"src/main/resources/fabric.mod.json")
|
|
|
|
if not os.path.exists(original_json):
|
|
print(f"Error: Could not find fabric.mod.json at {original_json}")
|
|
return False
|
|
|
|
try:
|
|
# 读取并修改fabric.mod.json
|
|
with open(original_json, 'r', encoding='utf-8') as f:
|
|
mod_data = json.load(f)
|
|
|
|
# 修改版本约束
|
|
mod_data['depends']['minecraft'] = f'[{mc_version}]'
|
|
|
|
# 创建临时目录
|
|
temp_dir = tempfile.mkdtemp()
|
|
|
|
try:
|
|
# 解压jar文件
|
|
if not os.path.exists(input_jar):
|
|
print(f"Error: Input jar not found: {input_jar}")
|
|
return False
|
|
|
|
with zipfile.ZipFile(input_jar, 'r') as zip_ref:
|
|
zip_ref.extractall(temp_dir)
|
|
|
|
# 写入修改后的fabric.mod.json
|
|
meta_inf_dir = os.path.join(temp_dir, 'META-INF')
|
|
os.makedirs(meta_inf_dir, exist_ok=True)
|
|
|
|
mod_json_path = os.path.join(meta_inf_dir, 'fabric.mod.json')
|
|
with open(mod_json_path, 'w', encoding='utf-8') as f:
|
|
json.dump(mod_data, f, indent=2)
|
|
|
|
# 创建输出jar文件
|
|
os.makedirs(output_dir, exist_ok=True)
|
|
with zipfile.ZipFile(output_jar, 'w', zipfile.ZIP_DEFLATED) as zip_out:
|
|
for root, dirs, files in os.walk(temp_dir):
|
|
for file in files:
|
|
file_path = os.path.join(root, file)
|
|
arcname = os.path.relpath(file_path, temp_dir).replace('\\', '/')
|
|
zip_out.write(file_path, arcname)
|
|
|
|
print(f"Successfully created: {output_jar}")
|
|
return True
|
|
|
|
finally:
|
|
# 清理临时目录
|
|
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
|
|
except Exception as e:
|
|
print(f"Error processing version {mc_version}: {e}")
|
|
return False
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Create version-specific JAR files for Minecraft mods")
|
|
parser.add_argument("--input-jar", required=True, help="Path to the input JAR file")
|
|
parser.add_argument("--output-dir", default="./build/libs", help="Output directory for version-specific JARs")
|
|
parser.add_argument("--version", help="Specific Minecraft version to target (optional)")
|
|
parser.add_argument("--all", action="store_true", help="Generate JARs for all supported versions")
|
|
|
|
args = parser.parse_args()
|
|
|
|
# 确保输出目录存在
|
|
os.makedirs(args.output_dir, exist_ok=True)
|
|
|
|
# 确定要处理的版本列表
|
|
versions_to_process = []
|
|
if args.version:
|
|
versions_to_process = [args.version]
|
|
elif args.all:
|
|
versions_to_process = MINECRAFT_VERSIONS
|
|
else:
|
|
print("Error: You must specify either --version or --all")
|
|
parser.print_help()
|
|
return 1
|
|
|
|
# 处理每个版本
|
|
success_count = 0
|
|
for version in versions_to_process:
|
|
if modify_jar_for_version(args.input_jar, args.output_dir, version):
|
|
success_count += 1
|
|
|
|
print(f"\nProcessing complete. Successfully created {success_count} of {len(versions_to_process)} JAR files.")
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|