| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- #!/usr/bin/env python3
- """
- Minecraft 基岩版角色导入工具
- 输入: .mcworld 文件 + .dat 角色文件
- 输出: 新的 .mcworld 文件
- """
- import os
- import sys
- import zipfile
- import tempfile
- import shutil
- from datetime import datetime
- def import_player(mcworld_path, player_dat, output_path=None):
- """将角色数据导入到 .mcworld 文件"""
-
- if not os.path.exists(mcworld_path):
- print(f"错误: 文件不存在 - {mcworld_path}")
- return None
-
- if not os.path.exists(player_dat):
- print(f"错误: 角色文件不存在 - {player_dat}")
- return None
-
- # 读取角色数据
- with open(player_dat, 'rb') as f:
- player_data = f.read()
- print(f"读取角色数据: {len(player_data)} bytes")
-
- # 默认输出路径
- if output_path is None:
- base = os.path.splitext(mcworld_path)[0]
- output_path = f"{base}_imported.mcworld"
-
- # 创建临时目录
- temp_dir = tempfile.mkdtemp()
-
- try:
- print(f"正在解压: {mcworld_path}")
- with zipfile.ZipFile(mcworld_path, 'r') as zip_ref:
- zip_ref.extractall(temp_dir)
-
- # 查找 db 目录
- db_path = os.path.join(temp_dir, 'db')
- world_root = temp_dir
-
- if not os.path.exists(db_path):
- for root, dirs, files in os.walk(temp_dir):
- if 'db' in dirs:
- db_path = os.path.join(root, 'db')
- world_root = root
- break
-
- if not os.path.exists(db_path):
- print("错误: 找不到 db 目录")
- return None
-
- # 写入玩家数据
- import leveldb
- db = leveldb.LevelDB(db_path)
- db.put(b'~local_player', player_data)
- del db
-
- print("✓ 角色数据已写入")
-
- # 重新打包
- print(f"正在打包: {output_path}")
- with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
- for root, dirs, files in os.walk(world_root):
- for file in files:
- file_path = os.path.join(root, file)
- arc_name = os.path.relpath(file_path, world_root)
- zipf.write(file_path, arc_name)
-
- print(f"\n✓ 导入成功!")
- print(f" 输出文件: {output_path}")
- return output_path
-
- finally:
- shutil.rmtree(temp_dir, ignore_errors=True)
- def main():
- if len(sys.argv) < 3:
- print("""
- Minecraft 基岩版角色导入工具
- ============================
- 用法:
- python import_player.py <.mcworld文件> <.dat角色文件> [输出文件]
- 示例:
- python import_player.py "World.mcworld" "player.dat"
- python import_player.py "World.mcworld" "player.dat" "NewWorld.mcworld"
- """)
- return
-
- mcworld_path = sys.argv[1]
- player_dat = sys.argv[2]
- output_path = sys.argv[3] if len(sys.argv) > 3 else None
-
- import_player(mcworld_path, player_dat, output_path)
- if __name__ == '__main__':
- main()
|