ue-mcp 1.2.4 → 1.3.0

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.
Files changed (243) hide show
  1. package/README.md +4 -3
  2. package/dist/action-class.js +56 -3
  3. package/dist/action-class.js.map +1 -1
  4. package/dist/bridge-timeouts.d.ts +64 -0
  5. package/dist/bridge-timeouts.js +118 -0
  6. package/dist/bridge-timeouts.js.map +1 -0
  7. package/dist/bridge.js +10 -2
  8. package/dist/bridge.js.map +1 -1
  9. package/dist/editor-control.d.ts +72 -5
  10. package/dist/editor-control.js +164 -140
  11. package/dist/editor-control.js.map +1 -1
  12. package/dist/editor-target.d.ts +55 -1
  13. package/dist/editor-target.js +107 -10
  14. package/dist/editor-target.js.map +1 -1
  15. package/dist/engine-observer.d.ts +59 -5
  16. package/dist/engine-observer.js +249 -29
  17. package/dist/engine-observer.js.map +1 -1
  18. package/dist/engine-root.d.ts +91 -0
  19. package/dist/engine-root.js +448 -0
  20. package/dist/engine-root.js.map +1 -0
  21. package/dist/epic-enrich.js +16 -1
  22. package/dist/epic-enrich.js.map +1 -1
  23. package/dist/feedback-cli.js +4 -0
  24. package/dist/feedback-cli.js.map +1 -1
  25. package/dist/feedback-deferred.d.ts +9 -0
  26. package/dist/feedback-deferred.js +2 -0
  27. package/dist/feedback-deferred.js.map +1 -1
  28. package/dist/feedback-fallback.d.ts +99 -0
  29. package/dist/feedback-fallback.js +173 -0
  30. package/dist/feedback-fallback.js.map +1 -0
  31. package/dist/flow/write-methods.js +20 -0
  32. package/dist/flow/write-methods.js.map +1 -1
  33. package/dist/lean-context.js +8 -3
  34. package/dist/lean-context.js.map +1 -1
  35. package/dist/locking.js +11 -2
  36. package/dist/locking.js.map +1 -1
  37. package/dist/project.d.ts +11 -0
  38. package/dist/project.js +23 -2
  39. package/dist/project.js.map +1 -1
  40. package/dist/python-gate.d.ts +95 -0
  41. package/dist/python-gate.js +175 -0
  42. package/dist/python-gate.js.map +1 -0
  43. package/dist/tool-counts.json +16 -16
  44. package/dist/tools/animation.js +288 -24
  45. package/dist/tools/animation.js.map +1 -1
  46. package/dist/tools/asset.js +79 -14
  47. package/dist/tools/asset.js.map +1 -1
  48. package/dist/tools/audio.js +59 -5
  49. package/dist/tools/audio.js.map +1 -1
  50. package/dist/tools/blueprint.js +29 -12
  51. package/dist/tools/blueprint.js.map +1 -1
  52. package/dist/tools/chooser.js +4 -1
  53. package/dist/tools/chooser.js.map +1 -1
  54. package/dist/tools/editor.js +81 -43
  55. package/dist/tools/editor.js.map +1 -1
  56. package/dist/tools/feedback.js +214 -48
  57. package/dist/tools/feedback.js.map +1 -1
  58. package/dist/tools/foliage.js +27 -1
  59. package/dist/tools/foliage.js.map +1 -1
  60. package/dist/tools/gameplay.js +38 -11
  61. package/dist/tools/gameplay.js.map +1 -1
  62. package/dist/tools/gas.js +17 -5
  63. package/dist/tools/gas.js.map +1 -1
  64. package/dist/tools/landscape.js +22 -7
  65. package/dist/tools/landscape.js.map +1 -1
  66. package/dist/tools/level.js +322 -51
  67. package/dist/tools/level.js.map +1 -1
  68. package/dist/tools/material.js +10 -4
  69. package/dist/tools/material.js.map +1 -1
  70. package/dist/tools/niagara.js +3 -2
  71. package/dist/tools/niagara.js.map +1 -1
  72. package/dist/tools/pcg.js +6 -5
  73. package/dist/tools/pcg.js.map +1 -1
  74. package/dist/tools/project.js +47 -20
  75. package/dist/tools/project.js.map +1 -1
  76. package/dist/types.d.ts +21 -0
  77. package/dist/types.js +46 -3
  78. package/dist/types.js.map +1 -1
  79. package/dist/ue-mcp.default.yml +493 -125
  80. package/package.json +2 -2
  81. package/plugin/ue_mcp_bridge/NATIVE_RUNTIME_VISIBILITY.md +53 -0
  82. package/plugin/ue_mcp_bridge/NATIVE_STATIC_MESH_USAGE_PROGRESS.md +115 -0
  83. package/plugin/ue_mcp_bridge/README_MassHandlers.md +97 -0
  84. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +14 -0
  85. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +21 -4
  86. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +9 -0
  87. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerJsonProperty.h +395 -69
  88. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +79 -3
  89. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +25 -0
  90. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRig.cpp +3 -3
  91. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRigSequencer.cpp +3061 -0
  92. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRetargeterAuthoring.cpp +961 -0
  93. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRigAuthoring.cpp +900 -0
  94. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Pose.cpp +769 -0
  95. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp +44 -3
  96. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_SkeletalLive.cpp +217 -11
  97. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_StateMachine.cpp +551 -24
  98. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Validation.cpp +735 -0
  99. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +352 -73
  100. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +8 -0
  101. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkProperties.cpp +1 -1
  102. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.cpp +503 -0
  103. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.h +21 -0
  104. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkUpsert.cpp +2 -2
  105. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Enum.cpp +2 -2
  106. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.cpp +902 -0
  107. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.h +33 -0
  108. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Import.cpp +478 -134
  109. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Mesh.cpp +5 -5
  110. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.cpp +933 -0
  111. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.h +35 -0
  112. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Redirectors.cpp +478 -0
  113. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_RenderTarget.cpp +1 -1
  114. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Sockets.cpp +4 -4
  115. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Struct.cpp +2 -2
  116. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Subobject.cpp +319 -0
  117. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers_SoundCue.cpp +3 -3
  118. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +482 -35
  119. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +10 -0
  120. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.cpp +502 -0
  121. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.h +43 -0
  122. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Functions.cpp +89 -7
  123. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Graph.cpp +17 -51
  124. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Internal.h +107 -0
  125. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Properties.cpp +10 -10
  126. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Search.cpp +648 -0
  127. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +5 -1
  128. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.cpp +252 -1
  129. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.h +10 -2
  130. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +252 -41
  131. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +4 -0
  132. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_Build.cpp +250 -27
  133. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIE.cpp +303 -125
  134. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIERuntime.cpp +73 -50
  135. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_RuntimeVisibility.cpp +757 -0
  136. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +11 -2
  137. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.h +3 -0
  138. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers_Batch.cpp +419 -0
  139. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +39 -161
  140. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +66 -1
  141. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BTAuthoring.cpp +1323 -0
  142. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BehaviorTree.cpp +1211 -0
  143. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +2 -0
  144. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.h +60 -0
  145. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers_Runtime.cpp +363 -12
  146. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/HandlerEditorState.h +84 -0
  147. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +1288 -36
  148. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +3 -0
  149. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers_Sculpt.cpp +41 -16
  150. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +959 -213
  151. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +66 -0
  152. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_BatchWrite.cpp +1571 -0
  153. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Convert.cpp +316 -0
  154. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Inspection.cpp +280 -0
  155. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection.cpp +666 -0
  156. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection_Internal.h +63 -0
  157. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Lights.cpp +43 -12
  158. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_MultiLevel.cpp +13 -47
  159. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_PostProcess.cpp +527 -0
  160. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Query.cpp +1169 -0
  161. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Refresh.cpp +723 -0
  162. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Save.cpp +325 -0
  163. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Spatial.cpp +360 -0
  164. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Trace.cpp +178 -58
  165. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Transient.cpp +337 -0
  166. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Volumes.cpp +25 -12
  167. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartition.cpp +10 -9
  168. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartitionSettings.cpp +686 -0
  169. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.cpp +467 -0
  170. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.h +22 -0
  171. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +452 -175
  172. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +5 -0
  173. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers_Build.cpp +597 -0
  174. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +17 -15
  175. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +38 -168
  176. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +39 -30
  177. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +392 -78
  178. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.h +2 -0
  179. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers_Internal.h +83 -0
  180. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.cpp +200 -0
  181. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.h +15 -0
  182. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +19 -12
  183. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/StateTreeHandlers.cpp +31 -1
  184. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +307 -69
  185. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.h +84 -0
  186. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Extraction.cpp +8 -41
  187. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Properties.cpp +33 -52
  188. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/ActorSelectorTests.cpp +344 -0
  189. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationControlRigTimelineTests.cpp +60 -0
  190. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationPoseTests.cpp +115 -0
  191. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetBulkReadTests.cpp +177 -0
  192. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetDeleteGuardTests.cpp +276 -0
  193. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPathResolutionTests.cpp +243 -0
  194. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPropertyPersistTests.cpp +213 -0
  195. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetSubobjectTests.cpp +235 -0
  196. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AutomationRunnerTests.cpp +72 -0
  197. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeAuthoringTests.cpp +526 -0
  198. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeNodeTests.cpp +334 -0
  199. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BlueprintHandlerSurfaceTests.cpp +362 -0
  200. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BridgeProtocolTests.cpp +14 -0
  201. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/CollisionQueryTests.cpp +288 -0
  202. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/DataTableRowWriteTests.cpp +453 -0
  203. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/EditorFunctionCallTests.cpp +223 -0
  204. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/FoliageBatchTests.cpp +147 -0
  205. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GameThreadGateTests.cpp +82 -0
  206. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GasLiveAttributeTests.cpp +183 -0
  207. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LandscapeSampleTests.cpp +119 -0
  208. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelBatchWriteTests.cpp +176 -0
  209. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelComponentTreeInstanceCountTests.cpp +189 -0
  210. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelConvertBrushesTests.cpp +100 -0
  211. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelInstanceProjectionTests.cpp +265 -0
  212. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelPostProcessOverrideTests.cpp +258 -0
  213. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelQueryComponentsTests.cpp +195 -0
  214. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelRefreshTests.cpp +142 -0
  215. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelSaveReportTests.cpp +125 -0
  216. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelScriptHandlersTests.cpp +42 -0
  217. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelStaticMeshUsageTests.cpp +412 -0
  218. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTraceWorldScopeTests.cpp +133 -0
  219. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTransientActorTests.cpp +205 -0
  220. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelWorldPartitionSettingsTests.cpp +168 -0
  221. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTestTypes.h +51 -0
  222. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTests.cpp +379 -0
  223. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MaterialBuildTests.cpp +238 -0
  224. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshBooleanTests.cpp +170 -0
  225. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshGeometryTests.cpp +116 -0
  226. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageSaveExtensionTests.cpp +161 -0
  227. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageWriteGuardTests.cpp +253 -0
  228. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/RuntimeVisibilityTests.cpp +143 -0
  229. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerHandlerTests.cpp +660 -0
  230. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerScrubTests.cpp +50 -0
  231. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SkeletonDiffTests.cpp +685 -0
  232. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/WidgetBlueprintResolveTests.cpp +145 -0
  233. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +80 -0
  234. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerFunctionCall.h +509 -0
  235. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerQuery.h +407 -0
  236. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerUtils.h +1008 -77
  237. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +87 -0
  238. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/MCPEngineStatus.cpp +152 -14
  239. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/Tests/MCPEngineStatusTests.cpp +65 -0
  240. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Public/MCPEngineStatus.h +32 -1
  241. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/UE_MCP_BridgeStatus.Build.cs +2 -0
  242. package/skills/ue-mcp-animation/SKILL.md +154 -0
  243. package/skills/ue-mcp-blueprint/SKILL.md +71 -0
@@ -0,0 +1,83 @@
1
+ #pragma once
2
+
3
+ #include "CoreMinimal.h"
4
+ #include "Dom/JsonObject.h"
5
+ #include "Misc/FrameRate.h"
6
+ #include "MovieSceneTimeHelpers.h"
7
+
8
+ namespace UEMCP::SequencerInfo
9
+ {
10
+ inline constexpr int32 MaxDetailedSections = 256;
11
+ inline constexpr int32 MaxDetailedChannels = 1024;
12
+ inline constexpr int32 MaxDetailedKeyTimes = 4096;
13
+ inline constexpr int32 MaxKeyTimesPerChannel = 256;
14
+
15
+ struct FDetailBudget
16
+ {
17
+ int32 Sections = MaxDetailedSections;
18
+ int32 Channels = MaxDetailedChannels;
19
+ int32 KeyTimes = MaxDetailedKeyTimes;
20
+ bool bTruncated = false;
21
+ };
22
+
23
+ inline void SetFrameRateFields(FJsonObject& Json, const FFrameRate& Rate)
24
+ {
25
+ Json.SetNumberField(TEXT("numerator"), Rate.Numerator);
26
+ Json.SetNumberField(TEXT("denominator"), Rate.Denominator);
27
+ }
28
+
29
+ inline bool IsUsableFrameRate(const FFrameRate& Rate)
30
+ {
31
+ return Rate.Numerator > 0 && Rate.Denominator > 0;
32
+ }
33
+
34
+ inline double TickToDisplayFrame(
35
+ const FFrameNumber Tick,
36
+ const FFrameRate& TickResolution,
37
+ const FFrameRate& DisplayRate)
38
+ {
39
+ return FFrameRate::TransformTime(FFrameTime(Tick), TickResolution, DisplayRate).AsDecimal();
40
+ }
41
+
42
+ inline void SetTimingRangeFields(
43
+ FJsonObject& Json,
44
+ const TRange<FFrameNumber>& Range,
45
+ const FFrameRate& TickResolution,
46
+ const FFrameRate& DisplayRate)
47
+ {
48
+ const bool bHasStart = Range.HasLowerBound();
49
+ const bool bHasEnd = Range.HasUpperBound();
50
+ Json.SetBoolField(TEXT("hasStart"), bHasStart);
51
+ Json.SetBoolField(TEXT("hasEnd"), bHasEnd);
52
+
53
+ if (bHasStart)
54
+ {
55
+ const FFrameNumber StartTick = UE::MovieScene::DiscreteInclusiveLower(Range);
56
+ Json.SetBoolField(TEXT("startInclusive"), true);
57
+ Json.SetNumberField(TEXT("startTick"), StartTick.Value);
58
+ Json.SetNumberField(TEXT("startDisplayFrame"), TickToDisplayFrame(StartTick, TickResolution, DisplayRate));
59
+ Json.SetNumberField(TEXT("startSeconds"), TickResolution.AsSeconds(FFrameTime(StartTick)));
60
+ }
61
+
62
+ if (bHasEnd)
63
+ {
64
+ const FFrameNumber EndTick = UE::MovieScene::DiscreteExclusiveUpper(Range);
65
+ Json.SetBoolField(TEXT("endExclusive"), true);
66
+ Json.SetNumberField(TEXT("endTick"), EndTick.Value);
67
+ Json.SetNumberField(TEXT("endDisplayFrame"), TickToDisplayFrame(EndTick, TickResolution, DisplayRate));
68
+ Json.SetNumberField(TEXT("endSeconds"), TickResolution.AsSeconds(FFrameTime(EndTick)));
69
+ }
70
+ }
71
+
72
+ inline TSharedPtr<FJsonObject> MakeKeyTimeObject(
73
+ const FFrameNumber Tick,
74
+ const FFrameRate& TickResolution,
75
+ const FFrameRate& DisplayRate)
76
+ {
77
+ TSharedPtr<FJsonObject> KeyTime = MakeShared<FJsonObject>();
78
+ KeyTime->SetNumberField(TEXT("tick"), Tick.Value);
79
+ KeyTime->SetNumberField(TEXT("displayFrame"), TickToDisplayFrame(Tick, TickResolution, DisplayRate));
80
+ KeyTime->SetNumberField(TEXT("seconds"), TickResolution.AsSeconds(FFrameTime(Tick)));
81
+ return KeyTime;
82
+ }
83
+ }
@@ -0,0 +1,200 @@
1
+ #include "SkeletalMeshHandlers.h"
2
+
3
+ #include "HandlerRegistry.h"
4
+ #include "HandlerUtils.h"
5
+
6
+ #include "Engine/SkeletalMesh.h"
7
+ #include "SkeletalMeshEditorSubsystem.h"
8
+
9
+ namespace
10
+ {
11
+ struct FTargetLod
12
+ {
13
+ int32 Index = INDEX_NONE;
14
+ FSkeletalMeshBuildSettings Before;
15
+ };
16
+
17
+ TSharedPtr<FJsonValue> ResolveTargetLods(
18
+ const TSharedPtr<FJsonObject>& Params,
19
+ USkeletalMesh* Mesh,
20
+ TArray<FTargetLod>& OutLods)
21
+ {
22
+ if (!Mesh) return MCPError(TEXT("SkeletalMesh is null"));
23
+ const int32 LodCount = Mesh->GetLODNum();
24
+ if (LodCount <= 0) return MCPError(TEXT("SkeletalMesh has no LODs"));
25
+
26
+ const bool bAllLods = OptionalBool(Params, TEXT("allLods"), false);
27
+ if (bAllLods && Params->HasField(TEXT("lodIndex")))
28
+ {
29
+ return MCPError(TEXT("Specify either allLods=true or lodIndex, not both"));
30
+ }
31
+
32
+ TArray<int32> Indices;
33
+ if (bAllLods)
34
+ {
35
+ for (int32 Index = 0; Index < LodCount; ++Index) Indices.Add(Index);
36
+ }
37
+ else
38
+ {
39
+ int32 LodIndex = 0;
40
+ if (Params->HasField(TEXT("lodIndex")))
41
+ {
42
+ double LodNumber = 0.0;
43
+ if (!Params->TryGetNumberField(TEXT("lodIndex"), LodNumber)
44
+ || !FMath::IsFinite(LodNumber)
45
+ || !FMath::IsNearlyEqual(LodNumber, FMath::RoundToDouble(LodNumber)))
46
+ {
47
+ return MCPError(TEXT("lodIndex must be a finite integer"));
48
+ }
49
+ if (LodNumber < static_cast<double>(MIN_int32) || LodNumber > static_cast<double>(MAX_int32))
50
+ {
51
+ return MCPError(TEXT("lodIndex is outside the supported integer range"));
52
+ }
53
+ LodIndex = static_cast<int32>(LodNumber);
54
+ }
55
+ Indices.Add(LodIndex);
56
+ }
57
+
58
+ for (const int32 Index : Indices)
59
+ {
60
+ if (Index < 0 || Index >= LodCount)
61
+ {
62
+ return MCPError(FString::Printf(TEXT("Invalid lodIndex %d; mesh has %d LODs"), Index, LodCount));
63
+ }
64
+ FTargetLod& Target = OutLods.AddDefaulted_GetRef();
65
+ Target.Index = Index;
66
+ USkeletalMeshEditorSubsystem::GetLodBuildSettings(Mesh, Index, Target.Before);
67
+ }
68
+ return nullptr;
69
+ }
70
+
71
+ TSharedPtr<FJsonObject> SerializeBuildSettings(const FSkeletalMeshBuildSettings& Settings)
72
+ {
73
+ auto Out = MakeShared<FJsonObject>();
74
+ Out->SetBoolField(TEXT("bRecomputeNormals"), Settings.bRecomputeNormals);
75
+ Out->SetBoolField(TEXT("bRecomputeTangents"), Settings.bRecomputeTangents);
76
+ Out->SetBoolField(TEXT("bUseMikkTSpace"), Settings.bUseMikkTSpace);
77
+ Out->SetBoolField(TEXT("bComputeWeightedNormals"), Settings.bComputeWeightedNormals);
78
+ Out->SetBoolField(TEXT("bRemoveDegenerates"), Settings.bRemoveDegenerates);
79
+ Out->SetBoolField(TEXT("bUseHighPrecisionTangentBasis"), Settings.bUseHighPrecisionTangentBasis);
80
+ Out->SetBoolField(TEXT("bUseHighPrecisionSkinWeights"), Settings.bUseHighPrecisionSkinWeights);
81
+ Out->SetBoolField(TEXT("bUseFullPrecisionUVs"), Settings.bUseFullPrecisionUVs);
82
+ Out->SetBoolField(TEXT("bUseBackwardsCompatibleF16TruncUVs"), Settings.bUseBackwardsCompatibleF16TruncUVs);
83
+ Out->SetBoolField(TEXT("bOptimizeForInstancing"), Settings.bOptimizeForInstancing);
84
+ Out->SetNumberField(TEXT("thresholdPosition"), Settings.ThresholdPosition);
85
+ Out->SetNumberField(TEXT("thresholdTangentNormal"), Settings.ThresholdTangentNormal);
86
+ Out->SetNumberField(TEXT("thresholdUV"), Settings.ThresholdUV);
87
+ Out->SetNumberField(TEXT("morphThresholdPosition"), Settings.MorphThresholdPosition);
88
+ Out->SetNumberField(TEXT("boneInfluenceLimit"), Settings.BoneInfluenceLimit);
89
+ return Out;
90
+ }
91
+
92
+ TSharedPtr<FJsonObject> MakeLodResult(int32 Index, const FSkeletalMeshBuildSettings& Before, const FSkeletalMeshBuildSettings& After)
93
+ {
94
+ auto Lod = MakeShared<FJsonObject>();
95
+ Lod->SetNumberField(TEXT("lodIndex"), Index);
96
+ Lod->SetObjectField(TEXT("beforeBuildSettings"), SerializeBuildSettings(Before));
97
+ Lod->SetObjectField(TEXT("afterBuildSettings"), SerializeBuildSettings(After));
98
+ Lod->SetBoolField(TEXT("beforeOptimizeForInstancing"), Before.bOptimizeForInstancing);
99
+ Lod->SetBoolField(TEXT("afterOptimizeForInstancing"), After.bOptimizeForInstancing);
100
+ Lod->SetBoolField(TEXT("changed"), Before.bOptimizeForInstancing != After.bOptimizeForInstancing);
101
+ return Lod;
102
+ }
103
+ }
104
+ void FSkeletalMeshHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
105
+ {
106
+ Registry.RegisterHandler(TEXT("set_skeletal_mesh_optimize_for_instancing"), &SetOptimizeForInstancing);
107
+ Registry.RegisterHandler(TEXT("read_skeletal_mesh_build_settings"), &ReadBuildSettings);
108
+ }
109
+
110
+ TSharedPtr<FJsonValue> FSkeletalMeshHandlers::ReadBuildSettings(const TSharedPtr<FJsonObject>& Params)
111
+ {
112
+ FString AssetPath;
113
+ if (auto Err = RequireString(Params, TEXT("assetPath"), AssetPath)) return Err;
114
+ USkeletalMesh* Mesh = LoadAssetByPath<USkeletalMesh>(AssetPath);
115
+ if (!Mesh) return MCPError(FString::Printf(TEXT("SkeletalMesh not found: %s"), *AssetPath));
116
+
117
+ TArray<FTargetLod> Targets;
118
+ if (TSharedPtr<FJsonValue> Error = ResolveTargetLods(Params, Mesh, Targets)) return Error;
119
+
120
+ auto Result = MCPSuccess();
121
+ Result->SetStringField(TEXT("assetPath"), Mesh->GetPathName());
122
+ Result->SetNumberField(TEXT("lodCount"), Mesh->GetLODNum());
123
+ TArray<TSharedPtr<FJsonValue>> Lods;
124
+ for (const FTargetLod& Target : Targets)
125
+ {
126
+ Lods.Add(MakeShared<FJsonValueObject>(MakeLodResult(Target.Index, Target.Before, Target.Before)));
127
+ }
128
+ Result->SetArrayField(TEXT("lods"), Lods);
129
+ return MCPResult(Result);
130
+ }
131
+
132
+ TSharedPtr<FJsonValue> FSkeletalMeshHandlers::SetOptimizeForInstancing(const TSharedPtr<FJsonObject>& Params)
133
+ {
134
+ FString AssetPath;
135
+ if (auto Err = RequireString(Params, TEXT("assetPath"), AssetPath)) return Err;
136
+ bool bEnabled = false;
137
+ if (!Params->TryGetBoolField(TEXT("enabled"), bEnabled))
138
+ {
139
+ return MCPError(TEXT("Missing required parameter 'enabled'"));
140
+ }
141
+
142
+ USkeletalMesh* Mesh = LoadAssetByPath<USkeletalMesh>(AssetPath);
143
+ if (!Mesh) return MCPError(FString::Printf(TEXT("SkeletalMesh not found: %s"), *AssetPath));
144
+
145
+ TArray<FTargetLod> Targets;
146
+ if (TSharedPtr<FJsonValue> Error = ResolveTargetLods(Params, Mesh, Targets)) return Error;
147
+
148
+ bool bNeedsMutation = false;
149
+ for (const FTargetLod& Target : Targets)
150
+ {
151
+ if (Target.Before.bOptimizeForInstancing != bEnabled)
152
+ {
153
+ bNeedsMutation = true;
154
+ break;
155
+ }
156
+ }
157
+
158
+ TArray<TSharedPtr<FJsonValue>> Lods;
159
+ int32 ChangedLodCount = 0;
160
+ if (bNeedsMutation)
161
+ {
162
+ // Establish the transaction before the first setter. The subsystem also
163
+ // protects its scoped rebuild, but this preserves the handler's explicit
164
+ // mutation boundary for undo/redo and fail-closed preflight behavior.
165
+ Mesh->Modify();
166
+ for (const FTargetLod& Target : Targets)
167
+ {
168
+ if (Target.Before.bOptimizeForInstancing != bEnabled)
169
+ {
170
+ ++ChangedLodCount;
171
+ FSkeletalMeshBuildSettings Updated = Target.Before;
172
+ Updated.bOptimizeForInstancing = bEnabled;
173
+ USkeletalMeshEditorSubsystem::SetLodBuildSettings(Mesh, Target.Index, Updated);
174
+ }
175
+ FSkeletalMeshBuildSettings After;
176
+ USkeletalMeshEditorSubsystem::GetLodBuildSettings(Mesh, Target.Index, After);
177
+ Lods.Add(MakeShared<FJsonValueObject>(MakeLodResult(Target.Index, Target.Before, After)));
178
+ }
179
+ if (!SaveAssetPackage(Mesh))
180
+ {
181
+ return MCPError(FString::Printf(TEXT("Failed to save SkeletalMesh: %s"), *Mesh->GetPathName()));
182
+ }
183
+ }
184
+ else
185
+ {
186
+ for (const FTargetLod& Target : Targets)
187
+ {
188
+ Lods.Add(MakeShared<FJsonValueObject>(MakeLodResult(Target.Index, Target.Before, Target.Before)));
189
+ }
190
+ }
191
+
192
+ auto Result = MCPSuccess();
193
+ Result->SetStringField(TEXT("assetPath"), Mesh->GetPathName());
194
+ Result->SetBoolField(TEXT("enabled"), bEnabled);
195
+ Result->SetBoolField(TEXT("updated"), bNeedsMutation);
196
+ Result->SetBoolField(TEXT("saved"), bNeedsMutation);
197
+ Result->SetNumberField(TEXT("changedLods"), ChangedLodCount);
198
+ Result->SetArrayField(TEXT("lods"), Lods);
199
+ return MCPResult(Result);
200
+ }
@@ -0,0 +1,15 @@
1
+ #pragma once
2
+
3
+ #include "CoreMinimal.h"
4
+ #include "Dom/JsonValue.h"
5
+
6
+ /** Small, editor-only skeletal mesh build-settings handlers. */
7
+ class FSkeletalMeshHandlers
8
+ {
9
+ public:
10
+ static void RegisterHandlers(class FMCPHandlerRegistry& Registry);
11
+
12
+ private:
13
+ static TSharedPtr<FJsonValue> SetOptimizeForInstancing(const TSharedPtr<FJsonObject>& Params);
14
+ static TSharedPtr<FJsonValue> ReadBuildSettings(const TSharedPtr<FJsonObject>& Params);
15
+ };
@@ -19,18 +19,23 @@ void FSplineHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
19
19
  TSharedPtr<FJsonValue> FSplineHandlers::ReadSpline(const TSharedPtr<FJsonObject>& Params)
20
20
  {
21
21
  FString ActorLabel;
22
- if (auto Err = RequireString(Params, TEXT("actorLabel"), ActorLabel)) return Err;
22
+ if (auto Err = RequireStringAlt(Params, TEXT("actorLabel"), TEXT("actorPath"), ActorLabel)) return Err;
23
23
 
24
24
  // #553: support editor or PIE world so runtime spline state is readable.
25
25
  const FString WorldScope = OptionalString(Params, TEXT("world"), TEXT("editor"));
26
26
  UWorld* World = ResolveWorldFromParams(Params, *WorldScope);
27
27
  if (!World) return MCPError(TEXT("World not available"));
28
28
 
29
- AActor* Actor = FindActorByLabelOrName(World, ActorLabel);
30
- if (!Actor)
31
- {
32
- return MCPError(FString::Printf(TEXT("Actor not found: %s"), *ActorLabel));
33
- }
29
+ // #983: this is the action the report came in on. A level with several
30
+ // copy-pasted road Blueprints all labelled the same thing answered with
31
+ // whichever one the actor iterator reached first.
32
+ FMCPActorSelector ActorSel;
33
+ ActorSel.Match = EMCPActorMatch::LabelOrName;
34
+ ActorSel.WorldLabel = World->IsGameWorld() ? TEXT("PIE") : TEXT("editor");
35
+ TSharedPtr<FJsonValue> ActorErr;
36
+ AActor* Actor = MCPResolveActor(World, Params, ActorErr, ActorSel);
37
+ if (!Actor) return ActorErr;
38
+ ActorLabel = Actor->GetActorLabel();
34
39
 
35
40
  // #553: optional componentName to target a specific (custom) spline component
36
41
  // when an actor has more than one. Custom spline subclasses derive from
@@ -57,6 +62,7 @@ TSharedPtr<FJsonValue> FSplineHandlers::ReadSpline(const TSharedPtr<FJsonObject>
57
62
 
58
63
  auto Result = MCPSuccess();
59
64
  Result->SetStringField(TEXT("actorLabel"), ActorLabel);
65
+ Result->SetStringField(TEXT("actorPath"), Actor->GetPathName());
60
66
  Result->SetStringField(TEXT("componentName"), SplineComp->GetName());
61
67
  Result->SetStringField(TEXT("componentClass"), SplineComp->GetClass()->GetName());
62
68
  Result->SetNumberField(TEXT("splinePointCount"), SplineComp->GetNumberOfSplinePoints());
@@ -140,7 +146,7 @@ TSharedPtr<FJsonValue> FSplineHandlers::ReadSpline(const TSharedPtr<FJsonObject>
140
146
  TSharedPtr<FJsonValue> FSplineHandlers::SetSplinePoints(const TSharedPtr<FJsonObject>& Params)
141
147
  {
142
148
  FString ActorLabel;
143
- if (auto Err = RequireString(Params, TEXT("actorLabel"), ActorLabel)) return Err;
149
+ if (auto Err = RequireStringAlt(Params, TEXT("actorLabel"), TEXT("actorPath"), ActorLabel)) return Err;
144
150
 
145
151
  const TArray<TSharedPtr<FJsonValue>>* PointsArray = nullptr;
146
152
  if (!Params->TryGetArrayField(TEXT("points"), PointsArray))
@@ -150,11 +156,10 @@ TSharedPtr<FJsonValue> FSplineHandlers::SetSplinePoints(const TSharedPtr<FJsonOb
150
156
 
151
157
  REQUIRE_EDITOR_WORLD(World);
152
158
 
153
- AActor* Actor = FindActorByLabel(World, ActorLabel);
154
- if (!Actor)
155
- {
156
- return MCPError(FString::Printf(TEXT("Actor not found: %s"), *ActorLabel));
157
- }
159
+ TSharedPtr<FJsonValue> ActorErr;
160
+ AActor* Actor = MCPResolveActor(World, Params, ActorErr);
161
+ if (!Actor) return ActorErr;
162
+ ActorLabel = Actor->GetActorLabel();
158
163
 
159
164
  // Find spline component
160
165
  USplineComponent* SplineComp = Actor->FindComponentByClass<USplineComponent>();
@@ -204,12 +209,14 @@ TSharedPtr<FJsonValue> FSplineHandlers::SetSplinePoints(const TSharedPtr<FJsonOb
204
209
  auto Result = MCPSuccess();
205
210
  MCPSetUpdated(Result);
206
211
  Result->SetStringField(TEXT("actorLabel"), ActorLabel);
212
+ Result->SetStringField(TEXT("actorPath"), Actor->GetPathName());
207
213
  Result->SetNumberField(TEXT("splinePointCount"), SplineComp->GetNumberOfSplinePoints());
208
214
  Result->SetBoolField(TEXT("closedLoop"), SplineComp->IsClosedLoop());
209
215
  Result->SetNumberField(TEXT("splineLength"), SplineComp->GetSplineLength());
210
216
 
211
217
  TSharedPtr<FJsonObject> Payload = MakeShared<FJsonObject>();
212
218
  Payload->SetStringField(TEXT("actorLabel"), ActorLabel);
219
+ Payload->SetStringField(TEXT("actorPath"), Actor->GetPathName());
213
220
  Payload->SetArrayField(TEXT("points"), PrevPoints);
214
221
  Payload->SetBoolField(TEXT("closedLoop"), bPrevClosedLoop);
215
222
  MCPSetRollback(Result, TEXT("set_spline_points"), Payload);
@@ -458,9 +458,26 @@ TSharedPtr<FJsonObject> FStateTreeHandlers::SerializeStateHierarchy(const UState
458
458
  if (Trans.State.ID.IsValid())
459
459
  {
460
460
  TransObj->SetStringField(TEXT("targetStateId"), GuidToString(Trans.State.ID));
461
+ const UStateTreeEditorData* EditorData =
462
+ Cast<UStateTreeEditorData>(State->GetTypedOuter<UStateTreeEditorData>());
463
+ if (EditorData)
464
+ {
465
+ if (const UStateTreeState* TargetState =
466
+ EditorData->GetStateByID(Trans.State.ID))
467
+ {
468
+ TransObj->SetStringField(
469
+ TEXT("targetStatePath"),
470
+ GetStatePath(TargetState));
471
+ }
472
+ }
461
473
  }
462
474
 
463
475
  TransObj->SetBoolField(TEXT("bEnabled"), Trans.bTransitionEnabled);
476
+ TransObj->SetBoolField(TEXT("bDelayTransition"), Trans.bDelayTransition);
477
+ TransObj->SetNumberField(TEXT("delayDuration"), Trans.DelayDuration);
478
+ TransObj->SetNumberField(
479
+ TEXT("delayRandomVariance"),
480
+ Trans.DelayRandomVariance);
464
481
 
465
482
  TArray<TSharedPtr<FJsonValue>> TransCondArr;
466
483
  for (const FStateTreeEditorNode& TCond : Trans.Conditions)
@@ -685,7 +702,9 @@ TSharedPtr<FJsonValue> FStateTreeHandlers::ReadStateTree(const TSharedPtr<FJsonO
685
702
 
686
703
  if (EditorData->Schema)
687
704
  {
688
- Result->SetStringField(TEXT("schemaClass"), EditorData->Schema->GetClass()->GetPathName());
705
+ const FString SchemaPath = EditorData->Schema->GetClass()->GetPathName();
706
+ Result->SetStringField(TEXT("schemaClass"), SchemaPath);
707
+ Result->SetStringField(TEXT("schemaPath"), SchemaPath);
689
708
  }
690
709
 
691
710
  // SubTrees (state hierarchy)
@@ -2403,6 +2422,17 @@ TSharedPtr<FJsonValue> FStateTreeHandlers::ValidateStateTree(const TSharedPtr<FJ
2403
2422
  UStateTreeEditingSubsystem::ValidateStateTree(ST);
2404
2423
 
2405
2424
  auto Result = MCPSuccess();
2425
+ Result->SetStringField(TEXT("assetPath"), ST->GetPathName());
2426
+ if (UStateTreeEditorData* EditorData = GetEditorData(ST))
2427
+ {
2428
+ if (EditorData->Schema)
2429
+ {
2430
+ const FString SchemaPath =
2431
+ EditorData->Schema->GetClass()->GetPathName();
2432
+ Result->SetStringField(TEXT("schemaClass"), SchemaPath);
2433
+ Result->SetStringField(TEXT("schemaPath"), SchemaPath);
2434
+ }
2435
+ }
2406
2436
  Result->SetBoolField(TEXT("validated"), true);
2407
2437
  return MCPResult(Result);
2408
2438
  }