mcpywrap 0.2.1__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/PKG-INFO +1 -1
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/builders/file_merge.py +6 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/builders/project_builder.py +22 -5
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/build_cmd.py +6 -4
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap.egg-info/PKG-INFO +1 -1
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/pyproject.toml +1 -1
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/README.md +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/__init__.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/__main__.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/builders/AddonsPack.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/builders/MapPack.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/builders/__init__.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/builders/dependency_manager.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/builders/watcher.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/cli.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/__init__.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/add_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/default_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/dev_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/edit_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/init_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/mod_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/modsdk_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/publish_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/remove_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/run_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/commands/ui_cmd.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/config.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/custom_packaging.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/SimpleMonitor.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/__init__.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/editor.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/game.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/mcs.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/runtime_cppconfig.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/studio_server.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/studio_server_ui.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/symlink_helper_global.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/symlink_helper_map.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/mcstudio/symlinks.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/minecraft/__init__.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/minecraft/addons.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/minecraft/level_dat.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/minecraft/map.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/minecraft/netease_modsdk.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/minecraft/template/generate_mod_files.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/minecraft/template/mod_template.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/ui/__init__.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/ui/project_ui.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/utils/__init__.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/utils/print_guide.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/utils/project_setup.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/utils/py3to2_util.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap/utils/utils.py +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap.egg-info/SOURCES.txt +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap.egg-info/dependency_links.txt +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap.egg-info/entry_points.txt +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap.egg-info/requires.txt +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/mcpywrap.egg-info/top_level.txt +0 -0
- {mcpywrap-0.2.1 → mcpywrap-0.2.2}/setup.cfg +0 -0
|
@@ -121,6 +121,12 @@ def try_merge_file(source_file, target_file, source_dependency_name=None) -> Tup
|
|
|
121
121
|
_write_lang_file(target_file, merged_lang)
|
|
122
122
|
return True, f"成功合并 {base_name} 到 {os.path.basename(target_file)}"
|
|
123
123
|
|
|
124
|
+
if base_name.endswith('.png') or base_name.endswith('.jpg') or base_name.endswith('.jpeg') or base_name.endswith('.tga'):
|
|
125
|
+
# 直接覆盖,并给出警告
|
|
126
|
+
shutil.copy2(source_file, target_file)
|
|
127
|
+
click.secho(f"⚠️ 警告: {base_name} 图片文件重复,正在覆盖", fg="yellow")
|
|
128
|
+
return True, f"强制覆盖 {base_name} 到 {os.path.basename(target_file)}"
|
|
129
|
+
|
|
124
130
|
# 读取源文件和目标文件的JSON内容
|
|
125
131
|
source_json = _read_json_file(source_file)
|
|
126
132
|
target_json = _read_json_file(target_file)
|
|
@@ -127,9 +127,10 @@ class AddonProjectBuilder:
|
|
|
127
127
|
|
|
128
128
|
class MapProjectBuilder:
|
|
129
129
|
"""项目构建器"""
|
|
130
|
-
def __init__(self, source_dir: str, target_dir: str):
|
|
130
|
+
def __init__(self, source_dir: str, target_dir: str, merge: bool = False):
|
|
131
131
|
self.source_dir = source_dir
|
|
132
132
|
self.target_dir = target_dir
|
|
133
|
+
self.merge = merge
|
|
133
134
|
self.config = read_config(os.path.join(source_dir, CONFIG_FILE))
|
|
134
135
|
self.project_name = self.config.get('project', {}).get('name', 'current_project')
|
|
135
136
|
self.dependency_manager = DependencyManager()
|
|
@@ -189,11 +190,19 @@ class MapProjectBuilder:
|
|
|
189
190
|
# 复制地图核心数据
|
|
190
191
|
click.secho('📦 复制地图核心数据...', fg="yellow")
|
|
191
192
|
source_map.copy_level_data_to(self.target_dir)
|
|
193
|
+
|
|
194
|
+
main_behavior_pack_dir = None
|
|
195
|
+
main_resource_pack_dir = None
|
|
192
196
|
|
|
193
197
|
# 复制原始行为包和资源包
|
|
194
198
|
click.secho('📦 复制地图行为包和资源包...', fg="yellow")
|
|
195
199
|
source_map.copy_behavior_packs_to(self.target_dir)
|
|
196
200
|
source_map.copy_resource_packs_to(self.target_dir)
|
|
201
|
+
|
|
202
|
+
if source_map.behavior_packs:
|
|
203
|
+
main_behavior_pack_dir = os.path.join(self.target_dir, "behavior_packs", os.path.basename(source_map.behavior_packs[0]))
|
|
204
|
+
if source_map.resource_packs:
|
|
205
|
+
main_resource_pack_dir = os.path.join(self.target_dir, "resource_packs", os.path.basename(source_map.resource_packs[0]))
|
|
197
206
|
|
|
198
207
|
# 处理依赖
|
|
199
208
|
dependencies = self.dependency_manager.get_all_dependencies()
|
|
@@ -219,10 +228,18 @@ class MapProjectBuilder:
|
|
|
219
228
|
click.secho(f" 📦 {dep_node.name}: {dep_addon.path}", fg="green")
|
|
220
229
|
# 合并到地图特定的包目录结构
|
|
221
230
|
# 避免重名
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
231
|
+
if self.merge and main_behavior_pack_dir:
|
|
232
|
+
dep_addon.merge_behavior_into(main_behavior_pack_dir)
|
|
233
|
+
else:
|
|
234
|
+
rename_behavior = os.path.basename(dep_addon.behavior_pack_dir) + "_" + dep_addon.pkg_name if os.path.basename(dep_addon.behavior_pack_dir) == "behavior_pack" or os.path.basename(dep_addon.behavior_pack_dir) == "BehaviorPack" else None
|
|
235
|
+
dep_addon.copy_behavior_to(target_map.behavior_packs_dir, rename=rename_behavior)
|
|
236
|
+
main_behavior_pack_dir = os.path.join(target_map.behavior_packs_dir, rename_behavior if rename_behavior else os.path.basename(dep_addon.behavior_pack_dir))
|
|
237
|
+
if self.merge and main_resource_pack_dir:
|
|
238
|
+
dep_addon.merge_resource_into(main_resource_pack_dir)
|
|
239
|
+
else:
|
|
240
|
+
rename_resource = os.path.basename(dep_addon.resource_pack_dir) + "_" + dep_addon.pkg_name if os.path.basename(dep_addon.resource_pack_dir) == "resource_pack" or os.path.basename(dep_addon.resource_pack_dir) == "ResourcePack" else None
|
|
241
|
+
dep_addon.copy_resource_to(target_map.resource_packs_dir, rename=rename_resource)
|
|
242
|
+
main_resource_pack_dir = os.path.join(target_map.resource_packs_dir, rename_resource if rename_resource else os.path.basename(dep_addon.resource_pack_dir))
|
|
226
243
|
else:
|
|
227
244
|
# 如果没有依赖树(异常情况),则按照扁平方式处理
|
|
228
245
|
click.secho(f"⚠️ 警告: 无法构建依赖树,将按扁平方式处理依赖", fg="yellow")
|
|
@@ -11,7 +11,8 @@ from ..builders.project_builder import AddonProjectBuilder, MapProjectBuilder
|
|
|
11
11
|
base_dir = os.getcwd()
|
|
12
12
|
|
|
13
13
|
@click.command()
|
|
14
|
-
|
|
14
|
+
@click.option('--merge', '-m', is_flag=True, help='强制合并所有资源文件')
|
|
15
|
+
def build_cmd(merge):
|
|
15
16
|
"""构建为 MCStudio 工程"""
|
|
16
17
|
if not config_exists():
|
|
17
18
|
click.secho('❌ 错误: 未找到配置文件。请先运行 `mcpywrap init` 初始化项目。', fg="red")
|
|
@@ -30,16 +31,17 @@ def build_cmd():
|
|
|
30
31
|
target_dir = os.path.normpath(os.path.join(base_dir, target_dir))
|
|
31
32
|
|
|
32
33
|
# 实际构建
|
|
33
|
-
build(base_dir, target_dir)
|
|
34
|
+
build(base_dir, target_dir, force_merge=merge)
|
|
34
35
|
|
|
35
36
|
|
|
36
|
-
def build(source_dir, target_dir):
|
|
37
|
+
def build(source_dir, target_dir, force_merge: bool = False):
|
|
37
38
|
"""
|
|
38
39
|
执行项目构建
|
|
39
40
|
|
|
40
41
|
Args:
|
|
41
42
|
source_dir: 源代码目录
|
|
42
43
|
target_dir: 目标目录
|
|
44
|
+
force_merge: 是否强制合并资源文件
|
|
43
45
|
|
|
44
46
|
Returns:
|
|
45
47
|
bool: 是否构建成功
|
|
@@ -55,7 +57,7 @@ def build(source_dir, target_dir):
|
|
|
55
57
|
builder = AddonProjectBuilder(source_dir, target_dir)
|
|
56
58
|
success, error = builder.build()
|
|
57
59
|
elif project_type == "map":
|
|
58
|
-
builder = MapProjectBuilder(source_dir, target_dir)
|
|
60
|
+
builder = MapProjectBuilder(source_dir, target_dir, force_merge)
|
|
59
61
|
success, error = builder.build()
|
|
60
62
|
else:
|
|
61
63
|
click.secho('❌ 暂未支持: 当前仅支持Addons和Map项目的构建', fg="red")
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "mcpywrap"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.2"
|
|
8
8
|
description = "A wrapper for Minecraft China Edition Addons management"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{name = "boybook", email = "boybook@easecation.net"}]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|