ue-mcp 0.7.19 → 1.0.0-rc.2
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.
- package/LICENSE +93 -21
- package/README.md +7 -2
- package/dist/init.js +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js +1 -1
- package/dist/tools/animation.js +10 -0
- package/dist/tools/animation.js.map +1 -1
- package/dist/tools/asset.js +11 -0
- package/dist/tools/asset.js.map +1 -1
- package/dist/ue-mcp.default.yml +24 -0
- package/package.json +3 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +251 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +4 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +165 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +4 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +30 -35
package/LICENSE
CHANGED
|
@@ -1,21 +1,93 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
1
|
+
License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.
|
|
2
|
+
"Business Source License" is a trademark of MariaDB Corporation Ab.
|
|
3
|
+
|
|
4
|
+
Parameters
|
|
5
|
+
|
|
6
|
+
Licensor: David Bingham
|
|
7
|
+
|
|
8
|
+
Licensed Work: UE-MCP Version 1.0.0-rc.1 or later. The Licensed Work
|
|
9
|
+
is (c) 2026 David Bingham.
|
|
10
|
+
|
|
11
|
+
Additional Use Grant: You may make production use of the Licensed Work
|
|
12
|
+
without purchasing a commercial license only if You
|
|
13
|
+
fall into one of the following categories:
|
|
14
|
+
|
|
15
|
+
(a) You are an individual natural person using the
|
|
16
|
+
Licensed Work for personal, non-commercial
|
|
17
|
+
purposes.
|
|
18
|
+
|
|
19
|
+
(b) You are an enrolled student, or an accredited
|
|
20
|
+
educational institution (including bootcamps and
|
|
21
|
+
non-profit training programs), using the Licensed
|
|
22
|
+
Work for coursework, academic research, or student
|
|
23
|
+
projects that are not incorporated into any
|
|
24
|
+
commercial product or service.
|
|
25
|
+
|
|
26
|
+
Any other production use — including, without
|
|
27
|
+
limitation, use by a game studio, publisher, contract
|
|
28
|
+
developer, service provider, or commercial entity of
|
|
29
|
+
any size in connection with proprietary or commercial
|
|
30
|
+
products, internal pipelines, or paid services —
|
|
31
|
+
requires a paid commercial license from the Licensor.
|
|
32
|
+
|
|
33
|
+
"Production use" means any use of the Licensed Work
|
|
34
|
+
other than internal evaluation, development, or
|
|
35
|
+
testing not intended for commercial deployment.
|
|
36
|
+
|
|
37
|
+
For information about commercial licensing, see
|
|
38
|
+
COMMERCIAL-LICENSE.md or visit
|
|
39
|
+
https://ue-mcp.com/pricing.
|
|
40
|
+
|
|
41
|
+
Change Date: Four years from the date the Licensed Work is
|
|
42
|
+
published.
|
|
43
|
+
|
|
44
|
+
Change License: Apache License, Version 2.0
|
|
45
|
+
|
|
46
|
+
For information about alternative licensing arrangements for the Licensed
|
|
47
|
+
Work, please contact licensing@ue-mcp.com.
|
|
48
|
+
|
|
49
|
+
Notice
|
|
50
|
+
|
|
51
|
+
Business Source License 1.1
|
|
52
|
+
|
|
53
|
+
Terms
|
|
54
|
+
|
|
55
|
+
The Licensor hereby grants you the right to copy, modify, create derivative
|
|
56
|
+
works, redistribute, and make non-production use of the Licensed Work. The
|
|
57
|
+
Licensor may make an Additional Use Grant, above, permitting limited
|
|
58
|
+
production use.
|
|
59
|
+
|
|
60
|
+
Effective on the Change Date, or the fourth anniversary of the first publicly
|
|
61
|
+
available distribution of a specific version of the Licensed Work under this
|
|
62
|
+
License, whichever comes first, the Licensor hereby grants you rights under
|
|
63
|
+
the terms of the Change License, and the rights granted in the paragraph
|
|
64
|
+
above terminate.
|
|
65
|
+
|
|
66
|
+
If your use of the Licensed Work does not comply with the requirements
|
|
67
|
+
currently in effect as described in this License, you must purchase a
|
|
68
|
+
commercial license from the Licensor, its affiliated entities, or authorized
|
|
69
|
+
resellers, or you must refrain from using the Licensed Work.
|
|
70
|
+
|
|
71
|
+
All copies of the original and modified Licensed Work, and derivative works
|
|
72
|
+
of the Licensed Work, are subject to this License. This License applies
|
|
73
|
+
separately for each version of the Licensed Work and the Change Date may vary
|
|
74
|
+
for each version of the Licensed Work released by Licensor.
|
|
75
|
+
|
|
76
|
+
You must conspicuously display this License on each original or modified copy
|
|
77
|
+
of the Licensed Work. If you receive the Licensed Work in original or
|
|
78
|
+
modified form from a third party, the terms and conditions set forth in this
|
|
79
|
+
License apply to your use of that work.
|
|
80
|
+
|
|
81
|
+
Any use of the Licensed Work in violation of this License will automatically
|
|
82
|
+
terminate your rights under this License for the current and all other
|
|
83
|
+
versions of the Licensed Work.
|
|
84
|
+
|
|
85
|
+
This License does not grant you any right in any trademark or logo of
|
|
86
|
+
Licensor or its affiliates (provided that you may use a trademark or logo of
|
|
87
|
+
Licensor as expressly required by this License).
|
|
88
|
+
|
|
89
|
+
TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
|
|
90
|
+
AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
|
|
91
|
+
EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
|
|
92
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
|
|
93
|
+
TITLE.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# UE-MCP
|
|
2
2
|
|
|
3
|
-
**Unreal Engine Model Context Protocol Server** — gives AI assistants deep read/write access to the Unreal Editor through 19 category tools covering
|
|
3
|
+
**Unreal Engine Model Context Protocol Server** — gives AI assistants deep read/write access to the Unreal Editor through 19 category tools covering 425+ actions.
|
|
4
4
|
|
|
5
5
|
```mermaid
|
|
6
6
|
flowchart LR
|
|
@@ -96,4 +96,9 @@ Issues and pull requests welcome. If an AI agent had to fall back to `execute_py
|
|
|
96
96
|
|
|
97
97
|
## License
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
UE-MCP is licensed under the **Business Source License 1.1** with a **commercial license** available for production use outside the Additional Use Grant.
|
|
100
|
+
|
|
101
|
+
- **Individuals, students, and educational institutions** use UE-MCP free under BUSL-1.1's Additional Use Grant. Each release converts to Apache 2.0 after four years. See [LICENSE](LICENSE).
|
|
102
|
+
- **Game studios, publishers, contract developers, and commercial entities** using UE-MCP in proprietary products, internal pipelines, or paid services require a commercial license. See [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md) and [ue-mcp.com/pricing](https://ue-mcp.com/pricing).
|
|
103
|
+
|
|
104
|
+
Contributions are accepted under the terms of the Contributor License Agreement. See [CLA.md](CLA.md).
|
package/dist/init.js
CHANGED
|
@@ -442,7 +442,7 @@ async function init() {
|
|
|
442
442
|
" version: 1",
|
|
443
443
|
"",
|
|
444
444
|
"# Custom tasks — pre-fill options for built-in actions",
|
|
445
|
-
"# All
|
|
445
|
+
"# All 425+ built-in actions are available without listing them here.",
|
|
446
446
|
"#",
|
|
447
447
|
"# tasks:",
|
|
448
448
|
"# import_hero:",
|
package/dist/instructions.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SERVER_INSTRUCTIONS = "UE-MCP: Unreal Engine editor bridge (C++ plugin) \u2014 19 category tools covering
|
|
1
|
+
export declare const SERVER_INSTRUCTIONS = "UE-MCP: Unreal Engine editor bridge (C++ plugin) \u2014 19 category tools covering 425+ actions.\n\nEvery tool takes an \"action\" parameter that selects the operation. Call project(action=\"get_status\") first.\n\n\u2550\u2550\u2550 QUICK START \u2550\u2550\u2550\n1. project(action=\"get_status\") \u2014 check if the editor is connected\n2. If not connected: editor(action=\"start_editor\") to launch UE\n3. level(action=\"get_outliner\") \u2014 see what's in the current level\n4. asset(action=\"list\") \u2014 browse project assets\n5. reflection(action=\"reflect_class\", className=\"StaticMeshActor\") \u2014 understand any UE class\n6. demo(action=\"step\", stepIndex=1) through 19 \u2014 run the Neon Shrine demo to see the bridge in action\n7. demo(action=\"cleanup\") \u2014 clean up after the demo\n\n\u2550\u2550\u2550 TOOLS & ACTIONS \u2550\u2550\u2550\n\nproject \u2014 Project status, config INI, C++ source\n get_status, set_project, get_info, read_config, search_config, list_config_tags,\n set_config, read_cpp_header, read_module, list_modules, search_cpp\n\nasset \u2014 Assets: list, search, CRUD, import, export, datatables, textures\n list, search, read, read_properties, duplicate, rename, move, delete, save,\n import_static_mesh, import_skeletal_mesh, import_animation, import_texture,\n read_datatable, create_datatable, reimport_datatable, list_textures,\n get_texture_info, set_texture_settings,\n add_socket, remove_socket, list_sockets\n\nblueprint \u2014 Blueprint reading, authoring, compilation\n read, list_variables, list_functions, read_graph, create, add_variable,\n set_variable_properties, create_function, delete_function, rename_function,\n add_node, delete_node, set_node_property, connect_pins, add_component,\n compile, list_node_types, search_node_types, create_interface, add_interface,\n add_event_dispatcher, list_graphs\n\nlevel \u2014 Level actors, selection, components, volumes, lights, splines\n get_outliner, place_actor, delete_actor, get_actor_details, move_actor,\n select, get_selected, add_component, set_component_property,\n get_current, load, save, list, create,\n spawn_volume, list_volumes, set_volume_properties,\n spawn_light, set_light_properties, build_lighting,\n get_spline_info, set_spline_points\n\nmaterial \u2014 Materials, shading, and graph authoring\n read, list_parameters, set_parameter, create_instance, create,\n set_shading_model, set_base_color, connect_texture,\n add_expression, connect_expressions, connect_to_property,\n list_expressions, delete_expression, list_expression_types, recompile\n\nanimation \u2014 Anim assets, skeletons, montages, blendspaces\n read_anim_blueprint, read_montage, read_sequence, read_blendspace, list,\n create_montage, create_anim_blueprint, create_blendspace, add_notify,\n get_skeleton_info, list_sockets, list_skeletal_meshes, get_physics_asset,\n create_sequence, set_bone_keyframes, get_bone_transforms,\n set_montage_sequence, set_montage_properties\n\nlandscape \u2014 Terrain sculpting, painting, layers\n get_info, list_layers, sample, list_splines, get_component,\n sculpt, paint_layer, set_material, add_layer_info, import_heightmap\n\npcg \u2014 Procedural Content Generation graphs\n list_graphs, read_graph, read_node_settings, get_components,\n get_component_details, create_graph, add_node, connect_nodes,\n set_node_settings, remove_node, execute, add_volume\n\nfoliage \u2014 Foliage painting and types\n list_types, get_settings, sample, paint, erase, create_type, set_settings\n\nniagara \u2014 VFX systems and graph authoring\n list, get_info, spawn, set_parameter, create,\n create_emitter, add_emitter, list_emitters, set_emitter_property,\n list_modules, get_emitter_info\n\naudio \u2014 Sound assets and playback\n list, play_at_location, spawn_ambient, create_cue, create_metasound\n\nwidget \u2014 UMG widgets and editor utilities\n read_tree, get_details, set_property (slot.* for layout), list, read_animations,\n create, add_widget, remove_widget, move_widget, list_classes,\n create_utility_widget, run_utility_widget,\n create_utility_blueprint, run_utility_blueprint\n\neditor \u2014 Console, Python, PIE, viewport, sequencer, perf, build pipeline, logs\n execute_command, execute_python, set_property, play_in_editor,\n get_runtime_value, hot_reload, undo, redo,\n get_perf_stats, run_stat, set_scalability, capture_screenshot,\n get_viewport, set_viewport, focus_on_actor,\n create_sequence, get_sequence_info, add_sequence_track, play_sequence,\n build_all, build_geometry, build_hlod, validate_assets,\n get_build_status, cook_content,\n get_log, search_log, get_message_log,\n set_dialog_policy, clear_dialog_policy, get_dialog_policy,\n list_dialogs, respond_to_dialog\n\nreflection \u2014 UE class/struct/enum reflection, gameplay tags\n reflect_class, reflect_struct, reflect_enum, list_classes,\n list_tags, create_tag\n\ngameplay \u2014 Physics, collision, navigation, input, behavior trees, AI, game framework\n set_collision_profile, set_simulate_physics, set_collision_enabled,\n set_physics_properties, rebuild_navigation, get_navmesh_info,\n project_to_nav, spawn_nav_modifier,\n create_input_action, create_input_mapping, list_input_assets, set_mapping_modifiers,\n list_behavior_trees, get_behavior_tree_info,\n create_blackboard, create_behavior_tree,\n create_eqs_query, list_eqs_queries,\n add_perception, configure_sense,\n create_state_tree, list_state_trees, add_state_tree_component,\n create_smart_object_def, add_smart_object_component,\n create_game_mode, create_game_state, create_player_controller,\n create_player_state, create_hud, set_world_game_mode, get_framework_info\n\ngas \u2014 Gameplay Ability System\n add_asc, create_attribute_set, add_attribute,\n create_ability, set_ability_tags,\n create_effect, set_effect_modifier,\n create_cue, get_info\n\nnetworking \u2014 Replication and networking\n set_replicates, set_property_replicated, configure_net_frequency,\n set_dormancy, set_net_load_on_client, set_always_relevant,\n set_only_relevant_to_owner, configure_cull_distance,\n set_priority, set_replicate_movement, get_info\n\ndemo \u2014 Neon Shrine demo scene\n step, cleanup\n\nfeedback \u2014 Agent feedback submission\n submit\n\n\u2550\u2550\u2550 TIPS \u2550\u2550\u2550\n\u2022 Start with level(action=\"get_outliner\") or asset(action=\"list\") to discover what's in the project.\n\u2022 Use reflection(action=\"reflect_class\") to understand any UE class's properties.\n\u2022 asset(action=\"search\", query=\"/Game/Characters/*\") accepts wildcards.\n\u2022 For BP scripting: blueprint(action=\"search_node_types\") \u2192 blueprint(action=\"add_node\") \u2192 blueprint(action=\"connect_pins\").\n\u2022 editor(action=\"execute_python\") is the escape hatch for any Unreal Python API call.\n\u2022 Animation tools need a skeleton path \u2014 use animation(action=\"list_skeletal_meshes\") to find it.\n\u2022 Editor lifecycle: editor(action=\"stop_editor\") / editor(action=\"start_editor\") / editor(action=\"restart_editor\") manage the UE process.\n\u2022 editor(action=\"hot_reload\") triggers Live Coding compilation without restarting the editor.\n\u2022 editor(action=\"focus_on_actor\", actorLabel=\"MyActor\") snaps the viewport to any actor.\n\u2022 Log output: editor(action=\"get_log\", category=\"LogMCPBridge\") to see bridge-specific logs.\n\n\u2550\u2550\u2550 FEEDBACK \u2550\u2550\u2550\nIf you had to use editor(action=\"execute_python\") as a workaround because a native tool\ncouldn't handle the task, keep a mental note of what you did and why. When your task is\ncomplete, tell the user:\n \"I had to use custom Python scripts to [describe what]. Would you like to submit\n feedback to help improve ue-mcp?\"\nIf the user agrees, call feedback(action=\"submit\") with:\n \u2022 title \u2014 short, generic description of the gap (no project-specific details)\n \u2022 summary \u2014 what was attempted and why the native tool fell short\n \u2022 pythonWorkaround \u2014 the Python code that was used\n \u2022 idealTool \u2014 what tool/action should handle this natively\nThis creates a GitHub issue so the maintainers can add proper support.\n";
|
package/dist/instructions.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const SERVER_INSTRUCTIONS = `UE-MCP: Unreal Engine editor bridge (C++ plugin) — 19 category tools covering
|
|
1
|
+
export const SERVER_INSTRUCTIONS = `UE-MCP: Unreal Engine editor bridge (C++ plugin) — 19 category tools covering 425+ actions.
|
|
2
2
|
|
|
3
3
|
Every tool takes an "action" parameter that selects the operation. Call project(action="get_status") first.
|
|
4
4
|
|
package/dist/tools/animation.js
CHANGED
|
@@ -46,6 +46,9 @@ export const animationTool = categoryTool("animation", "Animation assets, skelet
|
|
|
46
46
|
add_pose_search_sequence: bp("Append an AnimSequence/AnimComposite/AnimMontage/BlendSpace to a PoseSearchDatabase. Params: assetPath, sequencePath", "add_pose_search_sequence", (p) => ({ assetPath: p.assetPath, sequencePath: p.sequencePath })),
|
|
47
47
|
build_pose_search_index: bp("Build (or rebuild) the search index. Params: assetPath, wait? (default true)", "build_pose_search_index", (p) => ({ assetPath: p.assetPath, wait: p.wait })),
|
|
48
48
|
read_pose_search_database: bp("Inspect a PoseSearchDatabase: schema, animation entries, cost biases, tags. Params: assetPath", "read_pose_search_database", (p) => ({ assetPath: p.assetPath })),
|
|
49
|
+
// v1.0.0-rc.2 — #153, #154 (animation authoring gaps)
|
|
50
|
+
set_sequence_properties: bp("Batch-set properties on AnimSequence assets. If a path is a Montage and resolveFromMontages is true (default), resolves to its first AnimSequence. Params: assetPaths[], properties{enableRootMotion?, forceRootLock?, useNormalizedRootMotionScale?, rootMotionRootLock?}, resolveFromMontages?", "set_sequence_properties"),
|
|
51
|
+
bake_root_motion_from_bone: bp("Bake delta translation from a source bone (e.g. pelvis) onto the root bone across the whole sequence; compensates the source bone so world-space position is unchanged. Params: assetPath, sourceBone, rootBone? (default 'root'), axes? (default ['x','y']), interpolation? ('linear'|'per_frame', default 'linear')", "bake_root_motion_from_bone"),
|
|
49
52
|
}, undefined, {
|
|
50
53
|
assetPath: z.string().optional(),
|
|
51
54
|
directory: z.string().optional(),
|
|
@@ -116,5 +119,12 @@ export const animationTool = categoryTool("animation", "Animation assets, skelet
|
|
|
116
119
|
schemaPath: z.string().optional().describe("Path to a UPoseSearchSchema asset"),
|
|
117
120
|
sequencePath: z.string().optional().describe("Animation asset path to add to a PoseSearchDatabase"),
|
|
118
121
|
wait: z.boolean().optional().describe("build_pose_search_index: block until the async build resolves (default true)"),
|
|
122
|
+
// #153 / #154
|
|
123
|
+
assetPaths: z.array(z.string()).optional().describe("Asset paths (batch) for set_sequence_properties"),
|
|
124
|
+
properties: z.record(z.any()).optional().describe("Property dict for set_sequence_properties"),
|
|
125
|
+
resolveFromMontages: z.boolean().optional().describe("Resolve AnimMontage inputs to first anim reference (default true)"),
|
|
126
|
+
rootBone: z.string().optional().describe("Root bone name for bake_root_motion_from_bone (default 'root')"),
|
|
127
|
+
axes: z.array(z.string()).optional().describe("Axes to bake ('x','y','z') for bake_root_motion_from_bone"),
|
|
128
|
+
interpolation: z.string().optional().describe("bake_root_motion_from_bone: 'linear' (default) or 'per_frame'"),
|
|
119
129
|
});
|
|
120
130
|
//# sourceMappingURL=animation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animation.js","sourceRoot":"","sources":["../../src/tools/animation.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"animation.js","sourceRoot":"","sources":["../../src/tools/animation.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/asset.js
CHANGED
|
@@ -114,6 +114,9 @@ export const assetTool = categoryTool("asset", "Asset management: list, search,
|
|
|
114
114
|
search_fts: bp("Ranked asset search (token-scored over name/class/path). Params: query, maxResults?, classFilter?", "search_assets_fts", (p) => ({ query: p.query, maxResults: p.maxResults, classFilter: p.classFilter })),
|
|
115
115
|
reindex_fts: bp("Rebuild the SQLite FTS5 asset index. Params: directory?", "reindex_assets_fts", (p) => ({ directory: p.directory })),
|
|
116
116
|
get_referencers: bp("Reverse dependency lookup. Params: packages[] OR packagePath (#150). Returns {referencersByPackage, totalReferencers}.", "get_asset_referencers", (p) => ({ packages: p.packages, packagePath: p.packagePath })),
|
|
117
|
+
// v1.0.0-rc.2 — #155 (asset gaps)
|
|
118
|
+
set_sk_material_slots: bp("Set materials on a USkeletalMesh by slot name or slotIndex (bypasses the blueprint override-materials path that UE's ICH silently reverts). Params: assetPath, slots[{slotName?|slotIndex?, materialPath}]", "set_sk_material_slots"),
|
|
119
|
+
diagnose_registry: bp("Scan a content path and compare disk vs AssetRegistry (including in-memory pending-kill entries). Returns onDiskCount, inMemoryIncludedCount, ghostCount and paths. Params: path, recursive? (default true), reconcile? (forceRescan=true)", "diagnose_registry"),
|
|
117
120
|
}, undefined, {
|
|
118
121
|
assetPath: z.string().optional().describe("Asset path"),
|
|
119
122
|
directory: z.string().optional(), query: z.string().optional(),
|
|
@@ -152,5 +155,13 @@ export const assetTool = categoryTool("asset", "Asset management: list, search,
|
|
|
152
155
|
className: z.string().optional().describe("UClass path (/Script/Module.ClassName) or loaded class name for create_data_asset"),
|
|
153
156
|
properties: z.record(z.unknown()).optional().describe("Key/value property overrides for create_data_asset"),
|
|
154
157
|
packages: z.array(z.string()).optional().describe("Package paths for get_referencers"),
|
|
158
|
+
// #155
|
|
159
|
+
slots: z.array(z.object({
|
|
160
|
+
slotName: z.string().optional(),
|
|
161
|
+
slotIndex: z.number().optional(),
|
|
162
|
+
materialPath: z.string(),
|
|
163
|
+
})).optional().describe("Per-slot material assignments for set_sk_material_slots"),
|
|
164
|
+
path: z.string().optional().describe("Content path for diagnose_registry (e.g. /Game/Foo)"),
|
|
165
|
+
reconcile: z.boolean().optional().describe("diagnose_registry: force synchronous rescan (evicts pending-kill ghosts)"),
|
|
155
166
|
});
|
|
156
167
|
//# sourceMappingURL=asset.js.map
|
package/dist/tools/asset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/tools/asset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,EAAE,EAAgB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,MAAM,SAAS,GAAY,YAAY,CAC5C,OAAO,EACP,iFAAiF,EACjF;IACE,IAAI,EAAE;QACJ,WAAW,EAAE,uEAAuE;QACpF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAW,CAAC;YACzG,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC;YACxC,MAAM,UAAU,GAAI,CAAC,CAAC,UAAiC,EAAE,WAAW,EAAE,CAAC;YACvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;YACxE,MAAM,MAAM,GAA6E,EAAE,CAAC;YAC5F,SAAS,IAAI,CAAC,CAAS;gBACrB,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBAAC,IAAI,SAAS;4BAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBAAC,CAAC;yBAClD,CAAC;wBACJ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;wBAC5D,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM;4BAAE,SAAS;wBACjD,IAAI,UAAU,IAAI,GAAG,KAAK,UAAU;4BAAE,SAAS;wBAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;oBAChM,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,MAAM,MAAM,GAA4B,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YACpJ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC9C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,UAAU,GAAG,sBAAsB,CAAC,CAAC,SAAS,IAAI,QAAQ,iEAAiE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClL,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF;IACD,MAAM,EAAE;QACN,WAAW,EAAE,+EAA+E;QAC5F,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;YAC9C,oFAAoF;YACpF,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,UAAU,GAAI,CAAC,CAAC,UAAqB,IAAI,EAAE,CAAC;gBAClD,MAAM,UAAU,GAAmC,EAAE,CAAC;gBACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAA4B,CAAC;oBAC5G,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC9C,UAAU,CAAC,IAAI,CAAC,GAAI,GAAG,CAAC,OAA0C,CAAC,CAAC;oBACtE,CAAC;oBACD,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU;wBAAE,MAAM;gBAC7C,CAAC;gBACD,OAAO;oBACL,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;oBACpB,WAAW,EAAE,KAAK;oBAClB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC;oBACpD,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;oBACxC,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;KACF;IACD,IAAI,EAAY,EAAE,CAAC,8CAA8C,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAChH,eAAe,EAAE,EAAE,CAAC,qFAAqF,EAAE,uBAAuB,CAAC;IACnI,SAAS,EAAO,EAAE,CAAC,sDAAsD,EAAE,iBAAiB,CAAC;IAC7F,MAAM,EAAU,EAAE,CAAC,gMAAgM,EAAE,cAAc,CAAC;IACpO,WAAW,EAAK,EAAE,CAAC,0RAA0R,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACrW,IAAI,EAAY,EAAE,CAAC,iDAAiD,EAAE,YAAY,CAAC;IACnF,MAAM,EAAU,EAAE,CAAC,iCAAiC,EAAE,cAAc,CAAC;IACrE,YAAY,EAAI,EAAE,CAAC,6FAA6F,EAAE,oBAAoB,CAAC;IACvI,iBAAiB,EAAE,EAAE,CAAC,0JAA0J,EAAE,mBAAmB,CAAC;IACtM,IAAI,EAAY,EAAE,CAAC,mCAAmC,EAAE,YAAY,CAAC;IACrE,iBAAiB,EAAK,EAAE,CAAC,kFAAkF,EAAE,mBAAmB,CAAC;IACjI,cAAc,EAAQ,EAAE,WAAW,EAAE,4EAA4E,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YAC5J,MAAM,KAAK,GAAG,CAAC,CAAC,UAAkC,CAAC;YACnD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;YAC5D,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QACpC,CAAC,EAAC;IACF,kBAAkB,EAAI,EAAE,CAAC,qIAAqI,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,mBAAmB,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC7Z,oBAAoB,EAAE,EAAE,CAAC,wHAAwH,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IACpW,gBAAgB,EAAM,EAAE,CAAC,2EAA2E,EAAE,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7O,cAAc,EAAQ,EAAE,CAAC,qDAAqD,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvL,QAAQ,EAAc,EAAE,CAAC,+DAA+D,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtK,cAAc,EAAQ,EAAE,CAAC,oDAAoD,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACxJ,gBAAgB,EAAM,EAAE,CAAC,yDAAyD,EAAE,kBAAkB,CAAC;IACvG,kBAAkB,EAAI,EAAE,CAAC,yEAAyE,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IACzM,aAAa,EAAS,EAAE,CAAC,+CAA+C,EAAE,eAAe,CAAC;IAC1F,gBAAgB,EAAM,EAAE,CAAC,wCAAwC,EAAE,kBAAkB,CAAC;IACtF,oBAAoB,EAAE,EAAE,CAAC,iKAAiK,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1N,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,CAAC,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC,CAAC;IACH,UAAU,EAAY,EAAE,CAAC,0IAA0I,EAAE,YAAY,CAAC;IAClL,aAAa,EAAS,EAAE,CAAC,sDAAsD,EAAE,eAAe,CAAC;IACjG,YAAY,EAAU,EAAE,CAAC,2CAA2C,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1H,cAAc,EAAQ,EAAE,CAAC,4DAA4D,EAAE,gBAAgB,CAAC;IACxG,MAAM,EAAgB,EAAE,CAAC,oGAAoG,EAAE,cAAc,CAAC;IAC9I,UAAU,EAAY,EAAE,CAAC,mGAAmG,EAAE,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACrO,WAAW,EAAW,EAAE,CAAC,yDAAyD,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9I,eAAe,EAAO,EAAE,CAAC,wHAAwH,EAAE,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;CAC3O,EACD,SAAS,EACT;IACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACvD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;IAChH,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACzF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC5E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC1E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACzE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IAC3F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IACjI,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/E,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC5F,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1C,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4JAA4J,CAAC;IACjN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kFAAkF,CAAC;IAC5H,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mFAAmF,CAAC;IACxI,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0GAA0G,CAAC;IACvK,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;IACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACjF,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACtE,gBAAgB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACzE,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAChE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;IACxG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;IACrH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mFAAmF,CAAC;IAC9H,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;IAC3G,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CACvF,CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/tools/asset.ts"],"names":[],"mappings":"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"}
|
package/dist/ue-mcp.default.yml
CHANGED
|
@@ -313,6 +313,18 @@ tasks:
|
|
|
313
313
|
description: "Reverse dependency lookup. Params: packages[] OR packagePath (#150). Returns {referencersByPackage, totalReferencers}."
|
|
314
314
|
options:
|
|
315
315
|
method: get_asset_referencers
|
|
316
|
+
asset.set_sk_material_slots:
|
|
317
|
+
class_path: ue-mcp.bridge
|
|
318
|
+
group: asset
|
|
319
|
+
description: "Set materials on a USkeletalMesh by slot name or slotIndex (bypasses the blueprint override-materials path that UE's ICH silently reverts). Params: assetPath, slots[{slotName?|slotIndex?, materialPath}]"
|
|
320
|
+
options:
|
|
321
|
+
method: set_sk_material_slots
|
|
322
|
+
asset.diagnose_registry:
|
|
323
|
+
class_path: ue-mcp.bridge
|
|
324
|
+
group: asset
|
|
325
|
+
description: "Scan a content path and compare disk vs AssetRegistry (including in-memory pending-kill entries). Returns onDiskCount, inMemoryIncludedCount, ghostCount and paths. Params: path, recursive? (default true), reconcile? (forceRescan=true)"
|
|
326
|
+
options:
|
|
327
|
+
method: diagnose_registry
|
|
316
328
|
|
|
317
329
|
# ── blueprint ──
|
|
318
330
|
blueprint.read:
|
|
@@ -1185,6 +1197,18 @@ tasks:
|
|
|
1185
1197
|
description: "Inspect a PoseSearchDatabase: schema, animation entries, cost biases, tags. Params: assetPath"
|
|
1186
1198
|
options:
|
|
1187
1199
|
method: read_pose_search_database
|
|
1200
|
+
animation.set_sequence_properties:
|
|
1201
|
+
class_path: ue-mcp.bridge
|
|
1202
|
+
group: animation
|
|
1203
|
+
description: "Batch-set properties on AnimSequence assets. If a path is a Montage and resolveFromMontages is true (default), resolves to its first AnimSequence. Params: assetPaths[], properties{enableRootMotion?, forceRootLock?, useNormalizedRootMotionScale?, rootMotionRootLock?}, resolveFromMontages?"
|
|
1204
|
+
options:
|
|
1205
|
+
method: set_sequence_properties
|
|
1206
|
+
animation.bake_root_motion_from_bone:
|
|
1207
|
+
class_path: ue-mcp.bridge
|
|
1208
|
+
group: animation
|
|
1209
|
+
description: "Bake delta translation from a source bone (e.g. pelvis) onto the root bone across the whole sequence; compensates the source bone so world-space position is unchanged. Params: assetPath, sourceBone, rootBone? (default 'root'), axes? (default ['x','y']), interpolation? ('linear'|'per_frame', default 'linear')"
|
|
1210
|
+
options:
|
|
1211
|
+
method: bake_root_motion_from_bone
|
|
1188
1212
|
|
|
1189
1213
|
# ── landscape ──
|
|
1190
1214
|
landscape.get_info:
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ue-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Unreal Engine MCP server — 19 tools,
|
|
3
|
+
"version": "1.0.0-rc.2",
|
|
4
|
+
"description": "Unreal Engine MCP server — 19 tools, 425+ actions for AI-driven editor control",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"ue5"
|
|
28
28
|
],
|
|
29
29
|
"author": "David Lyon",
|
|
30
|
-
"license": "
|
|
30
|
+
"license": "BUSL-1.1",
|
|
31
31
|
"repository": {
|
|
32
32
|
"type": "git",
|
|
33
33
|
"url": "https://github.com/db-lyon/ue-mcp.git"
|
|
@@ -117,6 +117,10 @@ void FAnimationHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
|
117
117
|
Registry.RegisterHandler(TEXT("set_anim_blueprint_skeleton"), &SetAnimBlueprintSkeleton);
|
|
118
118
|
Registry.RegisterHandler(TEXT("read_bone_track"), &ReadBoneTrack);
|
|
119
119
|
|
|
120
|
+
// v1.0.0-rc.2 — animation authoring gaps (#153, #154)
|
|
121
|
+
Registry.RegisterHandler(TEXT("set_sequence_properties"), &SetSequenceProperties);
|
|
122
|
+
Registry.RegisterHandler(TEXT("bake_root_motion_from_bone"), &BakeRootMotionFromBone);
|
|
123
|
+
|
|
120
124
|
// v0.7.15 — PoseSearch (motion matching)
|
|
121
125
|
Registry.RegisterHandler(TEXT("create_pose_search_database"), &CreatePoseSearchDatabase);
|
|
122
126
|
Registry.RegisterHandler(TEXT("set_pose_search_schema"), &SetPoseSearchSchema);
|
|
@@ -2917,6 +2921,253 @@ TSharedPtr<FJsonValue> FAnimationHandlers::ReadBoneTrack(const TSharedPtr<FJsonO
|
|
|
2917
2921
|
return MCPResult(Result);
|
|
2918
2922
|
}
|
|
2919
2923
|
|
|
2924
|
+
// ===========================================================================
|
|
2925
|
+
// v1.0.0-rc.2 — animation authoring gaps
|
|
2926
|
+
// ===========================================================================
|
|
2927
|
+
|
|
2928
|
+
// #153: batch-set properties on AnimSequence assets, optionally resolving
|
|
2929
|
+
// montage inputs to their first underlying sequence. Saves each mutated
|
|
2930
|
+
// sequence; returns per-path results so callers can diagnose mixed outcomes.
|
|
2931
|
+
TSharedPtr<FJsonValue> FAnimationHandlers::SetSequenceProperties(const TSharedPtr<FJsonObject>& Params)
|
|
2932
|
+
{
|
|
2933
|
+
const TArray<TSharedPtr<FJsonValue>>* PathsArr = nullptr;
|
|
2934
|
+
if (!Params->TryGetArrayField(TEXT("assetPaths"), PathsArr))
|
|
2935
|
+
{
|
|
2936
|
+
return MCPError(TEXT("Missing 'assetPaths' array parameter"));
|
|
2937
|
+
}
|
|
2938
|
+
|
|
2939
|
+
const TSharedPtr<FJsonObject>* PropsObj = nullptr;
|
|
2940
|
+
if (!Params->TryGetObjectField(TEXT("properties"), PropsObj) || !PropsObj || !(*PropsObj).IsValid())
|
|
2941
|
+
{
|
|
2942
|
+
return MCPError(TEXT("Missing 'properties' object parameter"));
|
|
2943
|
+
}
|
|
2944
|
+
const TSharedPtr<FJsonObject>& Props = *PropsObj;
|
|
2945
|
+
|
|
2946
|
+
const bool bResolveMontages = OptionalBool(Params, TEXT("resolveFromMontages"), true);
|
|
2947
|
+
|
|
2948
|
+
TArray<TSharedPtr<FJsonValue>> Results;
|
|
2949
|
+
int32 UpdatedCount = 0;
|
|
2950
|
+
int32 SkippedCount = 0;
|
|
2951
|
+
|
|
2952
|
+
for (const TSharedPtr<FJsonValue>& PathVal : *PathsArr)
|
|
2953
|
+
{
|
|
2954
|
+
FString Path;
|
|
2955
|
+
if (!PathVal.IsValid() || !PathVal->TryGetString(Path)) continue;
|
|
2956
|
+
|
|
2957
|
+
TSharedPtr<FJsonObject> Entry = MakeShared<FJsonObject>();
|
|
2958
|
+
Entry->SetStringField(TEXT("assetPath"), Path);
|
|
2959
|
+
|
|
2960
|
+
UObject* Loaded = UEditorAssetLibrary::LoadAsset(Path);
|
|
2961
|
+
UAnimSequence* Seq = Cast<UAnimSequence>(Loaded);
|
|
2962
|
+
FString ResolvedPath = Path;
|
|
2963
|
+
if (!Seq && bResolveMontages)
|
|
2964
|
+
{
|
|
2965
|
+
if (UAnimMontage* Montage = Cast<UAnimMontage>(Loaded))
|
|
2966
|
+
{
|
|
2967
|
+
UAnimSequenceBase* FirstRef = Montage->GetFirstAnimReference();
|
|
2968
|
+
Seq = Cast<UAnimSequence>(FirstRef);
|
|
2969
|
+
if (Seq)
|
|
2970
|
+
{
|
|
2971
|
+
ResolvedPath = Seq->GetPathName();
|
|
2972
|
+
Entry->SetStringField(TEXT("resolvedFromMontage"), Path);
|
|
2973
|
+
Entry->SetStringField(TEXT("assetPath"), ResolvedPath);
|
|
2974
|
+
}
|
|
2975
|
+
}
|
|
2976
|
+
}
|
|
2977
|
+
|
|
2978
|
+
if (!Seq)
|
|
2979
|
+
{
|
|
2980
|
+
Entry->SetStringField(TEXT("status"), TEXT("skipped"));
|
|
2981
|
+
Entry->SetStringField(TEXT("reason"), TEXT("not an AnimSequence (or no resolvable sequence from montage)"));
|
|
2982
|
+
Results.Add(MakeShared<FJsonValueObject>(Entry));
|
|
2983
|
+
++SkippedCount;
|
|
2984
|
+
continue;
|
|
2985
|
+
}
|
|
2986
|
+
|
|
2987
|
+
Seq->Modify();
|
|
2988
|
+
|
|
2989
|
+
bool EnableRootMotion;
|
|
2990
|
+
if (Props->TryGetBoolField(TEXT("enableRootMotion"), EnableRootMotion))
|
|
2991
|
+
{
|
|
2992
|
+
Seq->bEnableRootMotion = EnableRootMotion;
|
|
2993
|
+
}
|
|
2994
|
+
bool ForceRootLock;
|
|
2995
|
+
if (Props->TryGetBoolField(TEXT("forceRootLock"), ForceRootLock))
|
|
2996
|
+
{
|
|
2997
|
+
Seq->bForceRootLock = ForceRootLock;
|
|
2998
|
+
}
|
|
2999
|
+
bool UseNormalizedRootMotionScale;
|
|
3000
|
+
if (Props->TryGetBoolField(TEXT("useNormalizedRootMotionScale"), UseNormalizedRootMotionScale))
|
|
3001
|
+
{
|
|
3002
|
+
Seq->bUseNormalizedRootMotionScale = UseNormalizedRootMotionScale;
|
|
3003
|
+
}
|
|
3004
|
+
FString RootMotionMode;
|
|
3005
|
+
if (Props->TryGetStringField(TEXT("rootMotionRootLock"), RootMotionMode))
|
|
3006
|
+
{
|
|
3007
|
+
if (RootMotionMode.Equals(TEXT("RefPose"), ESearchCase::IgnoreCase)) Seq->RootMotionRootLock = ERootMotionRootLock::RefPose;
|
|
3008
|
+
else if (RootMotionMode.Equals(TEXT("AnimFirstFrame"), ESearchCase::IgnoreCase)) Seq->RootMotionRootLock = ERootMotionRootLock::AnimFirstFrame;
|
|
3009
|
+
else if (RootMotionMode.Equals(TEXT("Zero"), ESearchCase::IgnoreCase)) Seq->RootMotionRootLock = ERootMotionRootLock::Zero;
|
|
3010
|
+
}
|
|
3011
|
+
|
|
3012
|
+
Seq->PostEditChange();
|
|
3013
|
+
UEditorAssetLibrary::SaveLoadedAsset(Seq, /*bOnlyIfIsDirty=*/false);
|
|
3014
|
+
|
|
3015
|
+
Entry->SetStringField(TEXT("status"), TEXT("updated"));
|
|
3016
|
+
Entry->SetBoolField(TEXT("enableRootMotion"), Seq->bEnableRootMotion);
|
|
3017
|
+
Entry->SetBoolField(TEXT("forceRootLock"), Seq->bForceRootLock);
|
|
3018
|
+
Results.Add(MakeShared<FJsonValueObject>(Entry));
|
|
3019
|
+
++UpdatedCount;
|
|
3020
|
+
}
|
|
3021
|
+
|
|
3022
|
+
auto Result = MCPSuccess();
|
|
3023
|
+
MCPSetUpdated(Result);
|
|
3024
|
+
Result->SetNumberField(TEXT("updated"), UpdatedCount);
|
|
3025
|
+
Result->SetNumberField(TEXT("skipped"), SkippedCount);
|
|
3026
|
+
Result->SetArrayField(TEXT("results"), Results);
|
|
3027
|
+
return MCPResult(Result);
|
|
3028
|
+
}
|
|
3029
|
+
|
|
3030
|
+
// #154: bake delta translation from a source bone (e.g. pelvis) onto the root
|
|
3031
|
+
// bone across the full sequence, compensating the source bone so world-space
|
|
3032
|
+
// position is unchanged. Default bakes X/Y (horizontal); Z is typically left
|
|
3033
|
+
// on the source bone for gravity. Linear interpolation from frame 0 delta.
|
|
3034
|
+
TSharedPtr<FJsonValue> FAnimationHandlers::BakeRootMotionFromBone(const TSharedPtr<FJsonObject>& Params)
|
|
3035
|
+
{
|
|
3036
|
+
FString AssetPath;
|
|
3037
|
+
if (auto Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), AssetPath)) return Err;
|
|
3038
|
+
|
|
3039
|
+
FString SourceBoneName;
|
|
3040
|
+
if (auto Err = RequireString(Params, TEXT("sourceBone"), SourceBoneName)) return Err;
|
|
3041
|
+
|
|
3042
|
+
const FString RootBoneName = OptionalString(Params, TEXT("rootBone"), TEXT("root"));
|
|
3043
|
+
const FString InterpMode = OptionalString(Params, TEXT("interpolation"), TEXT("linear"));
|
|
3044
|
+
|
|
3045
|
+
bool bBakeX = true, bBakeY = true, bBakeZ = false;
|
|
3046
|
+
const TArray<TSharedPtr<FJsonValue>>* AxesArr = nullptr;
|
|
3047
|
+
if (Params->TryGetArrayField(TEXT("axes"), AxesArr))
|
|
3048
|
+
{
|
|
3049
|
+
bBakeX = bBakeY = bBakeZ = false;
|
|
3050
|
+
for (const TSharedPtr<FJsonValue>& V : *AxesArr)
|
|
3051
|
+
{
|
|
3052
|
+
FString Ax; if (V.IsValid() && V->TryGetString(Ax))
|
|
3053
|
+
{
|
|
3054
|
+
Ax = Ax.ToLower();
|
|
3055
|
+
if (Ax == TEXT("x")) bBakeX = true;
|
|
3056
|
+
else if (Ax == TEXT("y")) bBakeY = true;
|
|
3057
|
+
else if (Ax == TEXT("z")) bBakeZ = true;
|
|
3058
|
+
}
|
|
3059
|
+
}
|
|
3060
|
+
}
|
|
3061
|
+
|
|
3062
|
+
UAnimSequence* Seq = Cast<UAnimSequence>(UEditorAssetLibrary::LoadAsset(AssetPath));
|
|
3063
|
+
if (!Seq) return MCPError(FString::Printf(TEXT("AnimSequence not found: %s"), *AssetPath));
|
|
3064
|
+
|
|
3065
|
+
USkeleton* Skeleton = Seq->GetSkeleton();
|
|
3066
|
+
if (!Skeleton) return MCPError(TEXT("AnimSequence has no Skeleton"));
|
|
3067
|
+
|
|
3068
|
+
const FReferenceSkeleton& RefSkeleton = Skeleton->GetReferenceSkeleton();
|
|
3069
|
+
const FName SourceFName(*SourceBoneName);
|
|
3070
|
+
const FName RootFName(*RootBoneName);
|
|
3071
|
+
if (RefSkeleton.FindBoneIndex(SourceFName) == INDEX_NONE)
|
|
3072
|
+
{
|
|
3073
|
+
return MCPError(FString::Printf(TEXT("Source bone '%s' not found in skeleton"), *SourceBoneName));
|
|
3074
|
+
}
|
|
3075
|
+
if (RefSkeleton.FindBoneIndex(RootFName) == INDEX_NONE)
|
|
3076
|
+
{
|
|
3077
|
+
return MCPError(FString::Printf(TEXT("Root bone '%s' not found in skeleton"), *RootBoneName));
|
|
3078
|
+
}
|
|
3079
|
+
|
|
3080
|
+
IAnimationDataModel* DataModel = Seq->GetDataModel();
|
|
3081
|
+
if (!DataModel) return MCPError(TEXT("Sequence has no data model"));
|
|
3082
|
+
|
|
3083
|
+
const int32 NumFrames = DataModel->GetNumberOfFrames();
|
|
3084
|
+
const int32 NumKeys = NumFrames + 1;
|
|
3085
|
+
if (NumKeys < 2) return MCPError(TEXT("Sequence must have at least 2 keys to bake root motion"));
|
|
3086
|
+
|
|
3087
|
+
const FFrameRate FrameRate = DataModel->GetFrameRate();
|
|
3088
|
+
|
|
3089
|
+
TArray<FVector> SourceLocIn, SourceLocOut, RootLocOut;
|
|
3090
|
+
TArray<FQuat> SourceRotIn, RootRotOut;
|
|
3091
|
+
TArray<FVector> SourceSclIn, RootSclOut;
|
|
3092
|
+
SourceLocIn.Reserve(NumKeys); SourceLocOut.Reserve(NumKeys); RootLocOut.Reserve(NumKeys);
|
|
3093
|
+
SourceRotIn.Reserve(NumKeys); RootRotOut.Reserve(NumKeys);
|
|
3094
|
+
SourceSclIn.Reserve(NumKeys); RootSclOut.Reserve(NumKeys);
|
|
3095
|
+
|
|
3096
|
+
for (int32 Key = 0; Key < NumKeys; ++Key)
|
|
3097
|
+
{
|
|
3098
|
+
const FFrameTime FT = FrameRate.AsFrameTime((double)Key / FrameRate.AsDecimal());
|
|
3099
|
+
const FTransform Xf = DataModel->EvaluateBoneTrackTransform(SourceFName, FT, EAnimInterpolationType::Linear);
|
|
3100
|
+
SourceLocIn.Add(Xf.GetLocation());
|
|
3101
|
+
SourceRotIn.Add(Xf.GetRotation());
|
|
3102
|
+
SourceSclIn.Add(Xf.GetScale3D());
|
|
3103
|
+
}
|
|
3104
|
+
|
|
3105
|
+
const FVector StartLoc = SourceLocIn[0];
|
|
3106
|
+
const FVector EndLoc = SourceLocIn.Last();
|
|
3107
|
+
const FVector TotalDelta(
|
|
3108
|
+
bBakeX ? (EndLoc.X - StartLoc.X) : 0.0,
|
|
3109
|
+
bBakeY ? (EndLoc.Y - StartLoc.Y) : 0.0,
|
|
3110
|
+
bBakeZ ? (EndLoc.Z - StartLoc.Z) : 0.0);
|
|
3111
|
+
|
|
3112
|
+
const bool bPerFrame = InterpMode.Equals(TEXT("per_frame"), ESearchCase::IgnoreCase);
|
|
3113
|
+
|
|
3114
|
+
for (int32 Key = 0; Key < NumKeys; ++Key)
|
|
3115
|
+
{
|
|
3116
|
+
FVector RootDelta = FVector::ZeroVector;
|
|
3117
|
+
if (bPerFrame)
|
|
3118
|
+
{
|
|
3119
|
+
const FVector Cur = SourceLocIn[Key] - StartLoc;
|
|
3120
|
+
RootDelta = FVector(bBakeX ? Cur.X : 0.0, bBakeY ? Cur.Y : 0.0, bBakeZ ? Cur.Z : 0.0);
|
|
3121
|
+
}
|
|
3122
|
+
else
|
|
3123
|
+
{
|
|
3124
|
+
const double T = (NumKeys > 1) ? ((double)Key / (double)(NumKeys - 1)) : 0.0;
|
|
3125
|
+
RootDelta = TotalDelta * T;
|
|
3126
|
+
}
|
|
3127
|
+
RootLocOut.Add(RootDelta);
|
|
3128
|
+
RootRotOut.Add(FQuat::Identity);
|
|
3129
|
+
RootSclOut.Add(FVector::OneVector);
|
|
3130
|
+
|
|
3131
|
+
FVector SrcLoc = SourceLocIn[Key];
|
|
3132
|
+
if (bBakeX) SrcLoc.X -= RootDelta.X;
|
|
3133
|
+
if (bBakeY) SrcLoc.Y -= RootDelta.Y;
|
|
3134
|
+
if (bBakeZ) SrcLoc.Z -= RootDelta.Z;
|
|
3135
|
+
SourceLocOut.Add(SrcLoc);
|
|
3136
|
+
}
|
|
3137
|
+
|
|
3138
|
+
IAnimationDataController& Controller = Seq->GetController();
|
|
3139
|
+
Controller.OpenBracket(NSLOCTEXT("MCP", "BakeRootMotion", "Bake Root Motion From Bone"));
|
|
3140
|
+
|
|
3141
|
+
if (!DataModel->IsValidBoneTrackName(RootFName)) Controller.AddBoneCurve(RootFName);
|
|
3142
|
+
if (!DataModel->IsValidBoneTrackName(SourceFName)) Controller.AddBoneCurve(SourceFName);
|
|
3143
|
+
|
|
3144
|
+
Controller.SetBoneTrackKeys(RootFName, RootLocOut, RootRotOut, RootSclOut);
|
|
3145
|
+
Controller.SetBoneTrackKeys(SourceFName, SourceLocOut, SourceRotIn, SourceSclIn);
|
|
3146
|
+
|
|
3147
|
+
Controller.CloseBracket(false);
|
|
3148
|
+
|
|
3149
|
+
GEditor->ResetTransaction(NSLOCTEXT("MCP", "BakeRootMotionReset", "Bake Root Motion Complete"));
|
|
3150
|
+
|
|
3151
|
+
Seq->bEnableRootMotion = true;
|
|
3152
|
+
Seq->PostEditChange();
|
|
3153
|
+
Seq->MarkPackageDirty();
|
|
3154
|
+
UEditorAssetLibrary::SaveLoadedAsset(Seq, /*bOnlyIfIsDirty=*/false);
|
|
3155
|
+
|
|
3156
|
+
auto Result = MCPSuccess();
|
|
3157
|
+
MCPSetUpdated(Result);
|
|
3158
|
+
Result->SetStringField(TEXT("assetPath"), AssetPath);
|
|
3159
|
+
Result->SetStringField(TEXT("sourceBone"), SourceBoneName);
|
|
3160
|
+
Result->SetStringField(TEXT("rootBone"), RootBoneName);
|
|
3161
|
+
Result->SetNumberField(TEXT("keys"), NumKeys);
|
|
3162
|
+
TSharedPtr<FJsonObject> Delta = MakeShared<FJsonObject>();
|
|
3163
|
+
Delta->SetNumberField(TEXT("x"), TotalDelta.X);
|
|
3164
|
+
Delta->SetNumberField(TEXT("y"), TotalDelta.Y);
|
|
3165
|
+
Delta->SetNumberField(TEXT("z"), TotalDelta.Z);
|
|
3166
|
+
Result->SetObjectField(TEXT("totalDelta"), Delta);
|
|
3167
|
+
Result->SetStringField(TEXT("interpolation"), bPerFrame ? TEXT("per_frame") : TEXT("linear"));
|
|
3168
|
+
return MCPResult(Result);
|
|
3169
|
+
}
|
|
3170
|
+
|
|
2920
3171
|
// ===========================================================================
|
|
2921
3172
|
// v0.7.15 — PoseSearch (motion matching)
|
|
2922
3173
|
// ===========================================================================
|
|
@@ -79,6 +79,10 @@ private:
|
|
|
79
79
|
static TSharedPtr<FJsonValue> SetAnimBlueprintSkeleton(const TSharedPtr<FJsonObject>& Params);
|
|
80
80
|
static TSharedPtr<FJsonValue> ReadBoneTrack(const TSharedPtr<FJsonObject>& Params);
|
|
81
81
|
|
|
82
|
+
// v1.0.0-rc.2 — animation authoring gaps (#153, #154)
|
|
83
|
+
static TSharedPtr<FJsonValue> SetSequenceProperties(const TSharedPtr<FJsonObject>& Params);
|
|
84
|
+
static TSharedPtr<FJsonValue> BakeRootMotionFromBone(const TSharedPtr<FJsonObject>& Params);
|
|
85
|
+
|
|
82
86
|
// v0.7.15 — PoseSearch (motion matching)
|
|
83
87
|
static TSharedPtr<FJsonValue> CreatePoseSearchDatabase(const TSharedPtr<FJsonObject>& Params);
|
|
84
88
|
static TSharedPtr<FJsonValue> SetPoseSearchSchema(const TSharedPtr<FJsonObject>& Params);
|
|
@@ -107,6 +107,10 @@ void FAssetHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
|
107
107
|
|
|
108
108
|
// v0.7.19 #150 — AssetRegistry referencers
|
|
109
109
|
Registry.RegisterHandler(TEXT("get_asset_referencers"), &GetReferencers);
|
|
110
|
+
|
|
111
|
+
// v1.0.0-rc.2 — #155 (asset gaps)
|
|
112
|
+
Registry.RegisterHandler(TEXT("set_sk_material_slots"), &SetSkeletalMeshMaterialSlots);
|
|
113
|
+
Registry.RegisterHandler(TEXT("diagnose_registry"), &DiagnoseRegistry);
|
|
110
114
|
}
|
|
111
115
|
|
|
112
116
|
// ---------------------------------------------------------------------------
|
|
@@ -2730,3 +2734,164 @@ TSharedPtr<FJsonValue> FAssetHandlers::GetReferencers(const TSharedPtr<FJsonObje
|
|
|
2730
2734
|
Result->SetNumberField(TEXT("queriedPackages"), Packages.Num());
|
|
2731
2735
|
return MCPResult(Result);
|
|
2732
2736
|
}
|
|
2737
|
+
|
|
2738
|
+
// ─── #155 asset(set_sk_material_slots) ──────────────────────────────
|
|
2739
|
+
// Blueprint component property writes to SkeletalMeshComponent.OverrideMaterials
|
|
2740
|
+
// are silently reverted by UE's ICH pipeline; the reliable path is to mutate
|
|
2741
|
+
// USkeletalMesh.Materials directly. Accepts either slotName or slotIndex per
|
|
2742
|
+
// entry. Missing slot names are reported, not skipped silently.
|
|
2743
|
+
TSharedPtr<FJsonValue> FAssetHandlers::SetSkeletalMeshMaterialSlots(const TSharedPtr<FJsonObject>& Params)
|
|
2744
|
+
{
|
|
2745
|
+
FString AssetPath;
|
|
2746
|
+
if (auto Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), AssetPath)) return Err;
|
|
2747
|
+
|
|
2748
|
+
const TArray<TSharedPtr<FJsonValue>>* SlotsArr = nullptr;
|
|
2749
|
+
if (!Params->TryGetArrayField(TEXT("slots"), SlotsArr))
|
|
2750
|
+
{
|
|
2751
|
+
return MCPError(TEXT("Missing 'slots' array parameter"));
|
|
2752
|
+
}
|
|
2753
|
+
|
|
2754
|
+
USkeletalMesh* Mesh = Cast<USkeletalMesh>(StaticLoadObject(USkeletalMesh::StaticClass(), nullptr, *AssetPath));
|
|
2755
|
+
if (!Mesh) return MCPError(FString::Printf(TEXT("SkeletalMesh not found: %s"), *AssetPath));
|
|
2756
|
+
|
|
2757
|
+
Mesh->Modify();
|
|
2758
|
+
TArray<FSkeletalMaterial> Materials = Mesh->GetMaterials();
|
|
2759
|
+
|
|
2760
|
+
TArray<TSharedPtr<FJsonValue>> Applied;
|
|
2761
|
+
TArray<FString> Errors;
|
|
2762
|
+
|
|
2763
|
+
for (const TSharedPtr<FJsonValue>& SlotVal : *SlotsArr)
|
|
2764
|
+
{
|
|
2765
|
+
const TSharedPtr<FJsonObject>* SlotObjPtr = nullptr;
|
|
2766
|
+
if (!SlotVal.IsValid() || !SlotVal->TryGetObject(SlotObjPtr)) continue;
|
|
2767
|
+
const TSharedPtr<FJsonObject>& Slot = *SlotObjPtr;
|
|
2768
|
+
|
|
2769
|
+
FString MaterialPath;
|
|
2770
|
+
if (!Slot->TryGetStringField(TEXT("materialPath"), MaterialPath))
|
|
2771
|
+
{
|
|
2772
|
+
Errors.Add(TEXT("slot entry missing 'materialPath'"));
|
|
2773
|
+
continue;
|
|
2774
|
+
}
|
|
2775
|
+
|
|
2776
|
+
UMaterialInterface* Material = Cast<UMaterialInterface>(StaticLoadObject(UMaterialInterface::StaticClass(), nullptr, *MaterialPath));
|
|
2777
|
+
if (!Material)
|
|
2778
|
+
{
|
|
2779
|
+
Errors.Add(FString::Printf(TEXT("material not found: %s"), *MaterialPath));
|
|
2780
|
+
continue;
|
|
2781
|
+
}
|
|
2782
|
+
|
|
2783
|
+
int32 Index = INDEX_NONE;
|
|
2784
|
+
double SlotIdxNum = 0;
|
|
2785
|
+
if (Slot->TryGetNumberField(TEXT("slotIndex"), SlotIdxNum))
|
|
2786
|
+
{
|
|
2787
|
+
Index = (int32)SlotIdxNum;
|
|
2788
|
+
}
|
|
2789
|
+
else
|
|
2790
|
+
{
|
|
2791
|
+
FString SlotName;
|
|
2792
|
+
if (Slot->TryGetStringField(TEXT("slotName"), SlotName))
|
|
2793
|
+
{
|
|
2794
|
+
const FName Target(*SlotName);
|
|
2795
|
+
for (int32 I = 0; I < Materials.Num(); ++I)
|
|
2796
|
+
{
|
|
2797
|
+
if (Materials[I].MaterialSlotName == Target)
|
|
2798
|
+
{
|
|
2799
|
+
Index = I; break;
|
|
2800
|
+
}
|
|
2801
|
+
}
|
|
2802
|
+
if (Index == INDEX_NONE)
|
|
2803
|
+
{
|
|
2804
|
+
Errors.Add(FString::Printf(TEXT("slotName '%s' not found on %s"), *SlotName, *AssetPath));
|
|
2805
|
+
continue;
|
|
2806
|
+
}
|
|
2807
|
+
}
|
|
2808
|
+
}
|
|
2809
|
+
|
|
2810
|
+
if (Index < 0 || Index >= Materials.Num())
|
|
2811
|
+
{
|
|
2812
|
+
Errors.Add(FString::Printf(TEXT("slotIndex %d out of range (mesh has %d slots)"), Index, Materials.Num()));
|
|
2813
|
+
continue;
|
|
2814
|
+
}
|
|
2815
|
+
|
|
2816
|
+
Materials[Index].MaterialInterface = Material;
|
|
2817
|
+
|
|
2818
|
+
TSharedPtr<FJsonObject> Entry = MakeShared<FJsonObject>();
|
|
2819
|
+
Entry->SetNumberField(TEXT("slotIndex"), Index);
|
|
2820
|
+
Entry->SetStringField(TEXT("slotName"), Materials[Index].MaterialSlotName.ToString());
|
|
2821
|
+
Entry->SetStringField(TEXT("materialPath"), MaterialPath);
|
|
2822
|
+
Applied.Add(MakeShared<FJsonValueObject>(Entry));
|
|
2823
|
+
}
|
|
2824
|
+
|
|
2825
|
+
Mesh->SetMaterials(Materials);
|
|
2826
|
+
Mesh->PostEditChange();
|
|
2827
|
+
Mesh->MarkPackageDirty();
|
|
2828
|
+
UEditorAssetLibrary::SaveLoadedAsset(Mesh, /*bOnlyIfIsDirty=*/false);
|
|
2829
|
+
|
|
2830
|
+
auto Result = MCPSuccess();
|
|
2831
|
+
MCPSetUpdated(Result);
|
|
2832
|
+
Result->SetStringField(TEXT("assetPath"), AssetPath);
|
|
2833
|
+
Result->SetNumberField(TEXT("slotCount"), Materials.Num());
|
|
2834
|
+
Result->SetArrayField(TEXT("applied"), Applied);
|
|
2835
|
+
if (Errors.Num() > 0)
|
|
2836
|
+
{
|
|
2837
|
+
TArray<TSharedPtr<FJsonValue>> ErrArr;
|
|
2838
|
+
for (const FString& E : Errors) ErrArr.Add(MakeShared<FJsonValueString>(E));
|
|
2839
|
+
Result->SetArrayField(TEXT("errors"), ErrArr);
|
|
2840
|
+
}
|
|
2841
|
+
return MCPResult(Result);
|
|
2842
|
+
}
|
|
2843
|
+
|
|
2844
|
+
// ─── #155 asset(diagnose_registry) ──────────────────────────────────
|
|
2845
|
+
// Explains the gap between disk state and the in-memory AssetRegistry.
|
|
2846
|
+
// Returns on-disk vs registry-including-memory counts so callers can
|
|
2847
|
+
// recognise pending-kill ghost entries after delete(). reconcile=true
|
|
2848
|
+
// forces a synchronous rescan (matches the Python workaround).
|
|
2849
|
+
TSharedPtr<FJsonValue> FAssetHandlers::DiagnoseRegistry(const TSharedPtr<FJsonObject>& Params)
|
|
2850
|
+
{
|
|
2851
|
+
FString Path;
|
|
2852
|
+
if (auto Err = RequireString(Params, TEXT("path"), Path)) return Err;
|
|
2853
|
+
|
|
2854
|
+
const bool bReconcile = OptionalBool(Params, TEXT("reconcile"), false);
|
|
2855
|
+
const bool bRecursive = OptionalBool(Params, TEXT("recursive"), true);
|
|
2856
|
+
|
|
2857
|
+
IAssetRegistry& AR = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")).Get();
|
|
2858
|
+
|
|
2859
|
+
if (bReconcile)
|
|
2860
|
+
{
|
|
2861
|
+
AR.ScanPathsSynchronous({ Path }, /*bForceRescan=*/true, /*bIgnoreDenyListScanFilters=*/true);
|
|
2862
|
+
}
|
|
2863
|
+
|
|
2864
|
+
FARFilter FilterDisk;
|
|
2865
|
+
FilterDisk.PackagePaths.Add(FName(*Path));
|
|
2866
|
+
FilterDisk.bRecursivePaths = bRecursive;
|
|
2867
|
+
FilterDisk.bIncludeOnlyOnDiskAssets = true;
|
|
2868
|
+
TArray<FAssetData> OnDisk;
|
|
2869
|
+
AR.GetAssets(FilterDisk, OnDisk);
|
|
2870
|
+
|
|
2871
|
+
FARFilter FilterAll = FilterDisk;
|
|
2872
|
+
FilterAll.bIncludeOnlyOnDiskAssets = false;
|
|
2873
|
+
TArray<FAssetData> InMemoryIncluded;
|
|
2874
|
+
AR.GetAssets(FilterAll, InMemoryIncluded);
|
|
2875
|
+
|
|
2876
|
+
TSet<FName> DiskSet;
|
|
2877
|
+
for (const FAssetData& D : OnDisk) DiskSet.Add(D.PackageName);
|
|
2878
|
+
|
|
2879
|
+
TArray<TSharedPtr<FJsonValue>> GhostArr;
|
|
2880
|
+
for (const FAssetData& A : InMemoryIncluded)
|
|
2881
|
+
{
|
|
2882
|
+
if (!DiskSet.Contains(A.PackageName))
|
|
2883
|
+
{
|
|
2884
|
+
GhostArr.Add(MakeShared<FJsonValueString>(A.GetObjectPathString()));
|
|
2885
|
+
}
|
|
2886
|
+
}
|
|
2887
|
+
|
|
2888
|
+
auto Result = MCPSuccess();
|
|
2889
|
+
Result->SetStringField(TEXT("path"), Path);
|
|
2890
|
+
Result->SetBoolField(TEXT("recursive"), bRecursive);
|
|
2891
|
+
Result->SetBoolField(TEXT("reconciled"), bReconcile);
|
|
2892
|
+
Result->SetNumberField(TEXT("onDiskCount"), OnDisk.Num());
|
|
2893
|
+
Result->SetNumberField(TEXT("inMemoryIncludedCount"), InMemoryIncluded.Num());
|
|
2894
|
+
Result->SetNumberField(TEXT("ghostCount"), GhostArr.Num());
|
|
2895
|
+
Result->SetArrayField(TEXT("ghostPaths"), GhostArr);
|
|
2896
|
+
return MCPResult(Result);
|
|
2897
|
+
}
|
|
@@ -67,4 +67,8 @@ private:
|
|
|
67
67
|
|
|
68
68
|
// v0.7.19 issue #150 — AssetRegistry referencers for a set of packages
|
|
69
69
|
static TSharedPtr<FJsonValue> GetReferencers(const TSharedPtr<FJsonObject>& Params);
|
|
70
|
+
|
|
71
|
+
// v1.0.0-rc.2 — #155 (asset gaps)
|
|
72
|
+
static TSharedPtr<FJsonValue> SetSkeletalMeshMaterialSlots(const TSharedPtr<FJsonObject>& Params);
|
|
73
|
+
static TSharedPtr<FJsonValue> DiagnoseRegistry(const TSharedPtr<FJsonObject>& Params);
|
|
70
74
|
};
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
#include "UObject/UnrealType.h"
|
|
31
31
|
#include "UObject/PropertyPortFlags.h"
|
|
32
32
|
#include "UObject/SoftObjectPtr.h"
|
|
33
|
+
#include "ScopedTransaction.h"
|
|
33
34
|
|
|
34
35
|
namespace
|
|
35
36
|
{
|
|
@@ -274,7 +275,7 @@ TSharedPtr<FJsonValue> FPCGHandlers::CreatePCGGraph(const TSharedPtr<FJsonObject
|
|
|
274
275
|
return MCPError(TEXT("Failed to create PCGGraph"));
|
|
275
276
|
}
|
|
276
277
|
|
|
277
|
-
UEditorAssetLibrary::
|
|
278
|
+
UEditorAssetLibrary::SaveLoadedAsset(NewAsset, /*bOnlyIfIsDirty=*/false);
|
|
278
279
|
|
|
279
280
|
auto Result = MCPSuccess();
|
|
280
281
|
MCPSetCreated(Result);
|
|
@@ -350,37 +351,38 @@ TSharedPtr<FJsonValue> FPCGHandlers::AddPCGNode(const TSharedPtr<FJsonObject>& P
|
|
|
350
351
|
return MCPError(FString::Printf(TEXT("PCG settings class not found or invalid: %s"), *NodeType));
|
|
351
352
|
}
|
|
352
353
|
|
|
353
|
-
// #
|
|
354
|
-
// the package
|
|
355
|
-
//
|
|
356
|
-
//
|
|
354
|
+
// #157: wrap mutation in a scoped transaction, outer settings to the graph
|
|
355
|
+
// (so they serialize with the package), and force SaveLoadedAsset on the
|
|
356
|
+
// exact Graph instance. The prior AddNode + SaveAsset(path) combination
|
|
357
|
+
// could silently drop mutations when save-by-path resolved to a different
|
|
358
|
+
// loaded instance than the one we mutated.
|
|
359
|
+
FScopedTransaction Transaction(NSLOCTEXT("UEMCPBridge", "AddPCGNode", "Add PCG Node"));
|
|
360
|
+
Graph->Modify();
|
|
361
|
+
|
|
357
362
|
UPCGSettings* DefaultSettings = NewObject<UPCGSettings>(Graph, SettingsClass, NAME_None, RF_Transactional);
|
|
358
363
|
if (!DefaultSettings)
|
|
359
364
|
{
|
|
360
365
|
return MCPError(TEXT("Failed to create PCG settings instance"));
|
|
361
366
|
}
|
|
362
367
|
|
|
363
|
-
//
|
|
364
|
-
|
|
368
|
+
// AddNodeInstance matches the proven Python path: wraps settings in a
|
|
369
|
+
// UPCGSettingsInstance parented to the new node. AddNode(UPCGSettings*)
|
|
370
|
+
// still persists but diverges from how the PCG editor authors nodes.
|
|
371
|
+
UPCGNode* NewNode = Graph->AddNodeInstance(DefaultSettings);
|
|
365
372
|
if (!NewNode)
|
|
366
373
|
{
|
|
367
374
|
return MCPError(TEXT("Failed to add node to PCG graph"));
|
|
368
375
|
}
|
|
369
376
|
|
|
370
|
-
//
|
|
371
|
-
//
|
|
372
|
-
//
|
|
373
|
-
if (
|
|
377
|
+
// Keep settings parented to the node so duplicate/rename of the graph
|
|
378
|
+
// carries settings with it. AddNodeInstance already does this for the
|
|
379
|
+
// SettingsInstance wrapper; we also reparent the underlying settings.
|
|
380
|
+
if (DefaultSettings->GetOuter() != NewNode && !DefaultSettings->GetOuter()->IsA<UPackage>())
|
|
374
381
|
{
|
|
375
|
-
|
|
376
|
-
if (Outer != NewNode && Outer != nullptr && !Outer->IsA<UPackage>())
|
|
377
|
-
{
|
|
378
|
-
NodeSettings->Rename(nullptr, NewNode, REN_DontCreateRedirectors | REN_DoNotDirty);
|
|
379
|
-
}
|
|
380
|
-
NodeSettings->PostEditChange();
|
|
382
|
+
DefaultSettings->Rename(nullptr, NewNode, REN_DontCreateRedirectors | REN_DoNotDirty);
|
|
381
383
|
}
|
|
384
|
+
DefaultSettings->PostEditChange();
|
|
382
385
|
|
|
383
|
-
// Set position if provided
|
|
384
386
|
double PosX = 0, PosY = 0;
|
|
385
387
|
if (Params->TryGetNumberField(TEXT("posX"), PosX) || Params->TryGetNumberField(TEXT("posY"), PosY))
|
|
386
388
|
{
|
|
@@ -388,15 +390,11 @@ TSharedPtr<FJsonValue> FPCGHandlers::AddPCGNode(const TSharedPtr<FJsonObject>& P
|
|
|
388
390
|
NewNode->PositionY = (int32)PosY;
|
|
389
391
|
}
|
|
390
392
|
|
|
391
|
-
// Notify open editor tabs and mark package dirty so Ctrl+S / autosave picks it up (#108)
|
|
392
|
-
// UE 5.7: NotifyGraphChanged is private. MarkPackageDirty + SaveAsset
|
|
393
|
-
// still persist changes; open editor tabs may need a reopen to refresh.
|
|
394
393
|
NewNode->PostEditChange();
|
|
395
394
|
Graph->PostEditChange();
|
|
396
395
|
if (UPackage* Pkg = Graph->GetOutermost()) { Pkg->MarkPackageDirty(); }
|
|
397
396
|
|
|
398
|
-
|
|
399
|
-
UEditorAssetLibrary::SaveAsset(AssetPath);
|
|
397
|
+
UEditorAssetLibrary::SaveLoadedAsset(Graph, /*bOnlyIfIsDirty=*/false);
|
|
400
398
|
|
|
401
399
|
auto Result = MCPSuccess();
|
|
402
400
|
MCPSetCreated(Result);
|
|
@@ -522,18 +520,19 @@ TSharedPtr<FJsonValue> FPCGHandlers::ConnectPCGNodes(const TSharedPtr<FJsonObjec
|
|
|
522
520
|
return MCPError(TEXT("No suitable input pin found on target node"));
|
|
523
521
|
}
|
|
524
522
|
|
|
523
|
+
FScopedTransaction Transaction(NSLOCTEXT("UEMCPBridge", "ConnectPCGNodes", "Connect PCG Nodes"));
|
|
524
|
+
Graph->Modify();
|
|
525
|
+
|
|
525
526
|
UPCGNode* ResultNode = Graph->AddEdge(SourceNode, ResolvedSourcePinLabel, TargetNode, ResolvedTargetPinLabel);
|
|
526
527
|
if (!ResultNode)
|
|
527
528
|
{
|
|
528
529
|
return MCPError(TEXT("Failed to connect pins - connection may already exist or be incompatible"));
|
|
529
530
|
}
|
|
530
531
|
|
|
531
|
-
// Notify editor and mark dirty (#108)
|
|
532
532
|
Graph->PostEditChange();
|
|
533
533
|
if (UPackage* Pkg = Graph->GetOutermost()) { Pkg->MarkPackageDirty(); }
|
|
534
534
|
|
|
535
|
-
|
|
536
|
-
UEditorAssetLibrary::SaveAsset(AssetPath);
|
|
535
|
+
UEditorAssetLibrary::SaveLoadedAsset(Graph, /*bOnlyIfIsDirty=*/false);
|
|
537
536
|
|
|
538
537
|
auto Result = MCPSuccess();
|
|
539
538
|
Result->SetStringField(TEXT("assetPath"), AssetPath);
|
|
@@ -580,17 +579,15 @@ TSharedPtr<FJsonValue> FPCGHandlers::RemovePCGNode(const TSharedPtr<FJsonObject>
|
|
|
580
579
|
return MCPResult(Noop);
|
|
581
580
|
}
|
|
582
581
|
|
|
583
|
-
|
|
582
|
+
FScopedTransaction Transaction(NSLOCTEXT("UEMCPBridge", "RemovePCGNode", "Remove PCG Node"));
|
|
583
|
+
Graph->Modify();
|
|
584
|
+
|
|
584
585
|
Graph->RemoveNode(FoundNode);
|
|
585
586
|
|
|
586
|
-
// Notify editor and mark dirty (#108)
|
|
587
|
-
// UE 5.7: NotifyGraphChanged is private. MarkPackageDirty + SaveAsset
|
|
588
|
-
// still persist changes; open editor tabs may need a reopen to refresh.
|
|
589
587
|
Graph->PostEditChange();
|
|
590
588
|
if (UPackage* Pkg = Graph->GetOutermost()) { Pkg->MarkPackageDirty(); }
|
|
591
589
|
|
|
592
|
-
|
|
593
|
-
UEditorAssetLibrary::SaveAsset(AssetPath);
|
|
590
|
+
UEditorAssetLibrary::SaveLoadedAsset(Graph, /*bOnlyIfIsDirty=*/false);
|
|
594
591
|
|
|
595
592
|
auto Result = MCPSuccess();
|
|
596
593
|
Result->SetStringField(TEXT("assetPath"), AssetPath);
|
|
@@ -692,12 +689,10 @@ TSharedPtr<FJsonValue> FPCGHandlers::SetPCGNodeSettings(const TSharedPtr<FJsonOb
|
|
|
692
689
|
|
|
693
690
|
Settings->PostEditChange();
|
|
694
691
|
|
|
695
|
-
// Notify editor and mark dirty (#108)
|
|
696
692
|
Graph->PostEditChange();
|
|
697
693
|
if (UPackage* Pkg = Graph->GetOutermost()) { Pkg->MarkPackageDirty(); }
|
|
698
694
|
|
|
699
|
-
|
|
700
|
-
UEditorAssetLibrary::SaveAsset(AssetPath);
|
|
695
|
+
UEditorAssetLibrary::SaveLoadedAsset(Graph, /*bOnlyIfIsDirty=*/false);
|
|
701
696
|
|
|
702
697
|
auto Result = MakeShared<FJsonObject>();
|
|
703
698
|
Result->SetStringField(TEXT("assetPath"), AssetPath);
|