import_player.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #!/usr/bin/env python3
  2. """
  3. Minecraft 基岩版角色导入工具
  4. 输入: .mcworld 文件 + .dat 角色文件
  5. 输出: 新的 .mcworld 文件
  6. """
  7. import os
  8. import sys
  9. import zipfile
  10. import tempfile
  11. import shutil
  12. from datetime import datetime
  13. def import_player(mcworld_path, player_dat, output_path=None):
  14. """将角色数据导入到 .mcworld 文件"""
  15. if not os.path.exists(mcworld_path):
  16. print(f"错误: 文件不存在 - {mcworld_path}")
  17. return None
  18. if not os.path.exists(player_dat):
  19. print(f"错误: 角色文件不存在 - {player_dat}")
  20. return None
  21. # 读取角色数据
  22. with open(player_dat, 'rb') as f:
  23. player_data = f.read()
  24. print(f"读取角色数据: {len(player_data)} bytes")
  25. # 默认输出路径
  26. if output_path is None:
  27. base = os.path.splitext(mcworld_path)[0]
  28. output_path = f"{base}_imported.mcworld"
  29. # 创建临时目录
  30. temp_dir = tempfile.mkdtemp()
  31. try:
  32. print(f"正在解压: {mcworld_path}")
  33. with zipfile.ZipFile(mcworld_path, 'r') as zip_ref:
  34. zip_ref.extractall(temp_dir)
  35. # 查找 db 目录
  36. db_path = os.path.join(temp_dir, 'db')
  37. world_root = temp_dir
  38. if not os.path.exists(db_path):
  39. for root, dirs, files in os.walk(temp_dir):
  40. if 'db' in dirs:
  41. db_path = os.path.join(root, 'db')
  42. world_root = root
  43. break
  44. if not os.path.exists(db_path):
  45. print("错误: 找不到 db 目录")
  46. return None
  47. # 写入玩家数据
  48. import leveldb
  49. db = leveldb.LevelDB(db_path)
  50. db.put(b'~local_player', player_data)
  51. del db
  52. print("✓ 角色数据已写入")
  53. # 重新打包
  54. print(f"正在打包: {output_path}")
  55. with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
  56. for root, dirs, files in os.walk(world_root):
  57. for file in files:
  58. file_path = os.path.join(root, file)
  59. arc_name = os.path.relpath(file_path, world_root)
  60. zipf.write(file_path, arc_name)
  61. print(f"\n✓ 导入成功!")
  62. print(f" 输出文件: {output_path}")
  63. return output_path
  64. finally:
  65. shutil.rmtree(temp_dir, ignore_errors=True)
  66. def main():
  67. if len(sys.argv) < 3:
  68. print("""
  69. Minecraft 基岩版角色导入工具
  70. ============================
  71. 用法:
  72. python import_player.py <.mcworld文件> <.dat角色文件> [输出文件]
  73. 示例:
  74. python import_player.py "World.mcworld" "player.dat"
  75. python import_player.py "World.mcworld" "player.dat" "NewWorld.mcworld"
  76. """)
  77. return
  78. mcworld_path = sys.argv[1]
  79. player_dat = sys.argv[2]
  80. output_path = sys.argv[3] if len(sys.argv) > 3 else None
  81. import_player(mcworld_path, player_dat, output_path)
  82. if __name__ == '__main__':
  83. main()