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
@@ -152,6 +152,22 @@ void FGameplayHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
152
152
  // New handlers
153
153
  Registry.RegisterHandler(TEXT("get_behavior_tree_info"), &GetBehaviorTreeInfo);
154
154
  Registry.RegisterHandler(TEXT("read_behavior_tree_graph"), &ReadBehaviorTreeGraph);
155
+ // #919: pick BT nodes and read only their own UPROPERTY values.
156
+ Registry.RegisterHandler(TEXT("read_bt_node_properties"), &ReadBTNodeProperties);
157
+ // #940: inventory BTTask nodes, FilterClass included.
158
+ Registry.RegisterHandler(TEXT("list_bt_tasks"), &ListBTTasks);
159
+ // #919/#940: one scoped write onto an owned BT node subobject. Registered
160
+ // under both names because a caller reaching for the task-specific one
161
+ // should not have to know it is the general node setter.
162
+ Registry.RegisterHandler(TEXT("set_bt_node_property"), &SetBTNodeProperty);
163
+ Registry.RegisterHandler(TEXT("set_bt_task_property"), &SetBTNodeProperty);
164
+ // #889/#947: author the BT editor graph and recompile it into the runnable
165
+ // tree. Reading and writing node properties only reaches nodes that already
166
+ // exist; these are what put nodes there, reconnect them and reorder them.
167
+ Registry.RegisterHandler(TEXT("list_bt_graph_nodes"), &ListBTGraphNodes);
168
+ Registry.RegisterHandler(TEXT("add_bt_node"), &AddBTNode);
169
+ Registry.RegisterHandler(TEXT("move_bt_node"), &MoveBTNode);
170
+ Registry.RegisterHandler(TEXT("remove_bt_node"), &RemoveBTNode);
155
171
  Registry.RegisterHandler(TEXT("add_perception_component"), &AddPerceptionComponent);
156
172
  Registry.RegisterHandler(TEXT("configure_ai_perception_sense"), &ConfigureAiPerceptionSense);
157
173
  Registry.RegisterHandler(TEXT("add_state_tree_component"), &AddStateTreeComponent);
@@ -877,13 +893,18 @@ TSharedPtr<FJsonValue> FGameplayHandlers::CreateStateTree(const TSharedPtr<FJson
877
893
  TSharedPtr<FJsonValue> FGameplayHandlers::GetStateTreeRuntime(const TSharedPtr<FJsonObject>& Params)
878
894
  {
879
895
  FString ActorLabel;
880
- if (auto Err = RequireString(Params, TEXT("actorLabel"), ActorLabel)) return Err;
896
+ if (auto Err = RequireStringAlt(Params, TEXT("actorLabel"), TEXT("actorPath"), ActorLabel)) return Err;
881
897
  const FString WorldScope = OptionalString(Params, TEXT("world"), TEXT("pie"));
882
898
  UWorld* World = ResolveWorldFromParams(Params, *WorldScope);
883
899
  if (!World) return MCPError(FString::Printf(TEXT("World not available for scope '%s'"), *WorldScope));
884
900
 
885
- AActor* Actor = FindActorByLabelNameOrPath(World, ActorLabel);
886
- if (!Actor) return MCPError(FString::Printf(TEXT("Actor not found: %s"), *ActorLabel));
901
+ FMCPActorSelector ActorSel;
902
+ ActorSel.Match = EMCPActorMatch::LabelNameOrPath;
903
+ ActorSel.WorldLabel = World->IsGameWorld() ? TEXT("PIE") : TEXT("editor");
904
+ TSharedPtr<FJsonValue> ActorErr;
905
+ AActor* Actor = MCPResolveActor(World, Params, ActorErr, ActorSel);
906
+ if (!Actor) return ActorErr;
907
+ ActorLabel = Actor->GetActorLabel();
887
908
 
888
909
  // Find a component that carries StateTree runtime data (by having an
889
910
  // InstanceData property of type FStateTreeInstanceData + a StateTreeRef).
@@ -1232,7 +1253,18 @@ TSharedPtr<FJsonValue> FGameplayHandlers::FindNavPath(const TSharedPtr<FJsonObje
1232
1253
  // matching navigation filter / agent.
1233
1254
  AActor* Context = nullptr;
1234
1255
  FString ContextLabel = OptionalString(Params, TEXT("pathfindingContext"));
1235
- if (!ContextLabel.IsEmpty()) Context = FindActorByLabel(World, ContextLabel);
1256
+ if (!ContextLabel.IsEmpty() || Params->HasField(TEXT("pathfindingContextPath")))
1257
+ {
1258
+ // #983: the context actor decides which navigation filter and agent
1259
+ // answer the query, so picking the wrong namesake changes the path.
1260
+ FMCPActorSelector ContextSel;
1261
+ ContextSel.LabelKey = TEXT("pathfindingContext");
1262
+ ContextSel.PathKey = TEXT("pathfindingContextPath");
1263
+ ContextSel.Match = EMCPActorMatch::LabelNameOrPath;
1264
+ TSharedPtr<FJsonValue> ContextErr;
1265
+ Context = MCPResolveActor(World, Params, ContextErr, ContextSel);
1266
+ if (!Context && MCPIsAmbiguousActorError(ContextErr)) return ContextErr;
1267
+ }
1236
1268
 
1237
1269
  UNavigationPath* Path = NavSys->FindPathToLocationSynchronously(World, Start, End, Context);
1238
1270
  auto Result = MCPSuccess();
@@ -1815,72 +1847,9 @@ TSharedPtr<FJsonValue> FGameplayHandlers::SetBehaviorTreeBlackboard(const TShare
1815
1847
  return MCPResult(Result);
1816
1848
  }
1817
1849
 
1818
- TSharedPtr<FJsonValue> FGameplayHandlers::GetBehaviorTreeInfo(const TSharedPtr<FJsonObject>& Params)
1819
- {
1820
- FString AssetPath;
1821
- if (auto Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), AssetPath)) return Err;
1822
-
1823
- UObject* Asset = UEditorAssetLibrary::LoadAsset(AssetPath);
1824
- if (!Asset)
1825
- {
1826
- return MCPError(FString::Printf(TEXT("BehaviorTree not found: %s"), *AssetPath));
1827
- }
1828
-
1829
- auto Result = MCPSuccess();
1830
- Result->SetStringField(TEXT("path"), AssetPath);
1831
- Result->SetStringField(TEXT("name"), Asset->GetName());
1832
- Result->SetStringField(TEXT("className"), Asset->GetClass()->GetName());
1833
-
1834
- // Try to read blackboard asset
1835
- FProperty* BBProp = Asset->GetClass()->FindPropertyByName(TEXT("BlackboardAsset"));
1836
- if (BBProp)
1837
- {
1838
- FObjectProperty* ObjProp = CastField<FObjectProperty>(BBProp);
1839
- if (ObjProp)
1840
- {
1841
- UObject* BB = ObjProp->GetObjectPropertyValue(BBProp->ContainerPtrToValuePtr<void>(Asset));
1842
- if (BB)
1843
- {
1844
- Result->SetStringField(TEXT("blackboardAsset"), BB->GetPathName());
1845
-
1846
- // Try to read blackboard keys
1847
- TArray<TSharedPtr<FJsonValue>> KeysArray;
1848
- FProperty* KeysProp = BB->GetClass()->FindPropertyByName(TEXT("Keys"));
1849
- if (KeysProp)
1850
- {
1851
- FArrayProperty* ArrProp = CastField<FArrayProperty>(KeysProp);
1852
- if (ArrProp)
1853
- {
1854
- FScriptArrayHelper ArrayHelper(ArrProp, ArrProp->ContainerPtrToValuePtr<void>(BB));
1855
- for (int32 i = 0; i < ArrayHelper.Num(); i++)
1856
- {
1857
- TSharedPtr<FJsonObject> KeyObj = MakeShared<FJsonObject>();
1858
- UObject* KeyEntry = *reinterpret_cast<UObject**>(ArrayHelper.GetRawPtr(i));
1859
- if (KeyEntry)
1860
- {
1861
- FProperty* NameProp = KeyEntry->GetClass()->FindPropertyByName(TEXT("EntryName"));
1862
- if (NameProp)
1863
- {
1864
- FString EntryName;
1865
- NameProp->ExportTextItem_Direct(EntryName, NameProp->ContainerPtrToValuePtr<void>(KeyEntry), nullptr, KeyEntry, PPF_None);
1866
- KeyObj->SetStringField(TEXT("name"), EntryName);
1867
- }
1868
- else
1869
- {
1870
- KeyObj->SetStringField(TEXT("name"), KeyEntry->GetName());
1871
- }
1872
- }
1873
- KeysArray.Add(MakeShared<FJsonValueObject>(KeyObj));
1874
- }
1875
- }
1876
- }
1877
- Result->SetArrayField(TEXT("blackboardKeys"), KeysArray);
1878
- }
1879
- }
1880
- }
1881
-
1882
- return MCPResult(Result);
1883
- }
1850
+ // get_behavior_tree_info and read_behavior_tree_graph moved to
1851
+ // GameplayHandlers_BehaviorTree.cpp, alongside the node-level BT reads and
1852
+ // writes they now share their walker and property reflection with.
1884
1853
 
1885
1854
  TSharedPtr<FJsonValue> FGameplayHandlers::AddPerceptionComponent(const TSharedPtr<FJsonObject>& Params)
1886
1855
  {
@@ -2256,97 +2225,6 @@ TSharedPtr<FJsonValue> FGameplayHandlers::AddSmartObjectComponent(const TSharedP
2256
2225
 
2257
2226
  return MCPResult(Result);
2258
2227
  }
2259
- TSharedPtr<FJsonValue> FGameplayHandlers::ReadBehaviorTreeGraph(const TSharedPtr<FJsonObject>& Params)
2260
- {
2261
- FString AssetPath;
2262
- if (auto Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), AssetPath)) return Err;
2263
-
2264
- UBehaviorTree* BT = LoadObject<UBehaviorTree>(nullptr, *AssetPath);
2265
- if (!BT) return MCPError(FString::Printf(TEXT("BehaviorTree not found: %s"), *AssetPath));
2266
-
2267
- TFunction<TSharedPtr<FJsonObject>(UBTNode*)> Walk;
2268
- Walk = [&](UBTNode* Node) -> TSharedPtr<FJsonObject>
2269
- {
2270
- if (!Node) return nullptr;
2271
- TSharedPtr<FJsonObject> NObj = MakeShared<FJsonObject>();
2272
- NObj->SetStringField(TEXT("class"), Node->GetClass()->GetName());
2273
- NObj->SetStringField(TEXT("name"), Node->GetName());
2274
- FProperty* NameProp = Node->GetClass()->FindPropertyByName(TEXT("NodeName"));
2275
- if (NameProp)
2276
- {
2277
- FString NodeDisplay;
2278
- NameProp->ExportText_Direct(NodeDisplay, NameProp->ContainerPtrToValuePtr<void>(Node), nullptr, Node, PPF_None);
2279
- NObj->SetStringField(TEXT("nodeName"), NodeDisplay);
2280
- }
2281
-
2282
- if (UBTCompositeNode* Comp = Cast<UBTCompositeNode>(Node))
2283
- {
2284
- NObj->SetStringField(TEXT("kind"), TEXT("composite"));
2285
-
2286
- TArray<TSharedPtr<FJsonValue>> ChildrenArr;
2287
- for (const FBTCompositeChild& Child : Comp->Children)
2288
- {
2289
- TSharedPtr<FJsonObject> ChildEntry = MakeShared<FJsonObject>();
2290
- if (Child.ChildComposite)
2291
- ChildEntry->SetObjectField(TEXT("child"), Walk(Child.ChildComposite));
2292
- else if (Child.ChildTask)
2293
- ChildEntry->SetObjectField(TEXT("child"), Walk(Child.ChildTask));
2294
-
2295
- TArray<TSharedPtr<FJsonValue>> Decs;
2296
- for (UBTDecorator* D : Child.Decorators)
2297
- {
2298
- if (!D) continue;
2299
- TSharedPtr<FJsonObject> DObj = MakeShared<FJsonObject>();
2300
- DObj->SetStringField(TEXT("class"), D->GetClass()->GetName());
2301
- DObj->SetStringField(TEXT("name"), D->GetName());
2302
- Decs.Add(MakeShared<FJsonValueObject>(DObj));
2303
- }
2304
- ChildEntry->SetArrayField(TEXT("decorators"), Decs);
2305
- ChildrenArr.Add(MakeShared<FJsonValueObject>(ChildEntry));
2306
- }
2307
- NObj->SetArrayField(TEXT("children"), ChildrenArr);
2308
-
2309
- TArray<TSharedPtr<FJsonValue>> Services;
2310
- for (UBTService* S : Comp->Services)
2311
- {
2312
- if (!S) continue;
2313
- TSharedPtr<FJsonObject> SObj = MakeShared<FJsonObject>();
2314
- SObj->SetStringField(TEXT("class"), S->GetClass()->GetName());
2315
- SObj->SetStringField(TEXT("name"), S->GetName());
2316
- Services.Add(MakeShared<FJsonValueObject>(SObj));
2317
- }
2318
- NObj->SetArrayField(TEXT("services"), Services);
2319
- }
2320
- else if (Cast<UBTTaskNode>(Node))
2321
- {
2322
- NObj->SetStringField(TEXT("kind"), TEXT("task"));
2323
- }
2324
- return NObj;
2325
- };
2326
-
2327
- auto Result = MCPSuccess();
2328
- Result->SetStringField(TEXT("assetPath"), AssetPath);
2329
- Result->SetStringField(TEXT("name"), BT->GetName());
2330
- if (BT->BlackboardAsset)
2331
- {
2332
- Result->SetStringField(TEXT("blackboardAsset"), BT->BlackboardAsset->GetPathName());
2333
- }
2334
- if (BT->RootNode)
2335
- {
2336
- Result->SetObjectField(TEXT("root"), Walk(BT->RootNode));
2337
- }
2338
- TArray<TSharedPtr<FJsonValue>> RootDecs;
2339
- for (UBTDecorator* D : BT->RootDecorators)
2340
- {
2341
- if (!D) continue;
2342
- TSharedPtr<FJsonObject> DObj = MakeShared<FJsonObject>();
2343
- DObj->SetStringField(TEXT("class"), D->GetClass()->GetName());
2344
- DObj->SetStringField(TEXT("name"), D->GetName());
2345
- RootDecs.Add(MakeShared<FJsonValueObject>(DObj));
2346
- }
2347
- Result->SetArrayField(TEXT("rootDecorators"), RootDecs);
2348
- return MCPResult(Result);
2349
- }
2350
2228
 
2351
2229
  // ─────────────────────────────────────────────────────────────
2352
2230
  // #163 get_navmesh_details - Detailed ARecastNavMesh configuration
@@ -4,11 +4,55 @@
4
4
  #include "Dom/JsonValue.h"
5
5
  #include "Dom/JsonObject.h"
6
6
 
7
+ class UBehaviorTree;
8
+ class UBlackboardData;
9
+ class UBTNode;
10
+
7
11
  class FGameplayHandlers
8
12
  {
9
13
  public:
10
14
  static void RegisterHandlers(class FMCPHandlerRegistry& Registry);
11
15
 
16
+ // BehaviorTree introspection primitives, shared by the BT handlers and
17
+ // exercised directly by the automation tests in Private/Tests, which build
18
+ // nodes in memory rather than round-tripping an asset through disk.
19
+ // Definitions live in GameplayHandlers_BehaviorTree.cpp.
20
+
21
+ /** Every key on a Blackboard asset: name, type, sync flag, description. */
22
+ static TArray<TSharedPtr<FJsonValue>> DescribeBlackboardKeys(const UBlackboardData* Blackboard);
23
+
24
+ /** One BT node as JSON: identity, decorator configuration (#888), and the
25
+ * node's own UPROPERTY values when asked for (#919). PropertyFilter holds
26
+ * lowercased property names; empty means "everything the node class adds". */
27
+ static TSharedPtr<FJsonObject> DescribeBTNode(
28
+ UBTNode* Node,
29
+ const FString& NodePath,
30
+ const FString& ParentPath,
31
+ bool bIncludeProperties,
32
+ bool bIncludeInherited,
33
+ const TSet<FString>& PropertyFilter);
34
+
35
+ /** Read one dotted/indexed property path off a BT node. A UE 5.8
36
+ * FValueOrBBKey_* field comes back unpacked into defaultValue + key. */
37
+ static TSharedPtr<FJsonValue> ReadBTNodeProperty(UBTNode* Node, const FString& PropertyPath, FString& OutError);
38
+
39
+ /** Write one dotted/indexed property path on a BT node. A scalar aimed at a
40
+ * FValueOrBBKey_* field lands on its DefaultValue; a class-valued leaf
41
+ * accepts a short name, a /Script path or a Blueprint asset path. */
42
+ static bool WriteBTNodeProperty(UBTNode* Node, const FString& PropertyPath, const TSharedPtr<FJsonValue>& Value, FString& OutError);
43
+
44
+ /** Load a BehaviorTree from a caller-supplied asset path, or null. */
45
+ static UBehaviorTree* LoadBehaviorTree(const FString& AssetPath);
46
+
47
+ /** Every runtime node in a compiled tree, keyed by the structural address
48
+ * the read surface reports ("Root.Children[0].Decorators[1]").
49
+ *
50
+ * #889 authoring addresses editor-graph nodes by guid, but a caller who
51
+ * just read the tree holds these addresses instead, so both surfaces walk
52
+ * this one map rather than growing a second scheme. Defined next to the
53
+ * walker it wraps in GameplayHandlers_BehaviorTree.cpp. */
54
+ static void MapBTNodeAddresses(UBehaviorTree* Tree, TMap<UBTNode*, FString>& OutAddresses);
55
+
12
56
  private:
13
57
  static TSharedPtr<FJsonValue> CreateSmartObjectDefinition(const TSharedPtr<FJsonObject>& Params);
14
58
  // #778: per-player Enhanced Input applied mapping contexts, per PIE world.
@@ -77,9 +121,30 @@ private:
77
121
  // Helper to create a blueprint with a given parent class
78
122
  static TSharedPtr<FJsonValue> CreateBlueprintWithParent(const FString& Name, const FString& PackagePath, const FString& ParentClassPath, const FString& FriendlyTypeName);
79
123
 
80
- // v0.7.11 - BT graph traversal (#124)
124
+ // v0.7.11 - BT graph traversal (#124), decorator configuration added (#888)
81
125
  static TSharedPtr<FJsonValue> ReadBehaviorTreeGraph(const TSharedPtr<FJsonObject>& Params);
82
126
 
127
+ // #919: pick BT nodes by class/name/path/kind and return their UPROPERTY
128
+ // values, instead of an unfiltered whole-asset property dump.
129
+ static TSharedPtr<FJsonValue> ReadBTNodeProperties(const TSharedPtr<FJsonObject>& Params);
130
+
131
+ // #940: inventory BTTask nodes across one asset or a directory, including
132
+ // the UE 5.8 FValueOrBBKey_Class shape of BTTask_MoveTo::FilterClass.
133
+ static TSharedPtr<FJsonValue> ListBTTasks(const TSharedPtr<FJsonObject>& Params);
134
+
135
+ // #919/#940: scoped nested write onto one owned BT node subobject.
136
+ // Registered as both set_bt_node_property and set_bt_task_property.
137
+ static TSharedPtr<FJsonValue> SetBTNodeProperty(const TSharedPtr<FJsonObject>& Params);
138
+
139
+ // #889/#947: BehaviorTree editor-graph authoring. These drive
140
+ // UBehaviorTreeGraph and its node classes, then recompile the graph into
141
+ // the runnable UBTCompositeNode tree, which is the step no reflected
142
+ // runtime API can perform. Definitions in GameplayHandlers_BTAuthoring.cpp.
143
+ static TSharedPtr<FJsonValue> ListBTGraphNodes(const TSharedPtr<FJsonObject>& Params);
144
+ static TSharedPtr<FJsonValue> AddBTNode(const TSharedPtr<FJsonObject>& Params);
145
+ static TSharedPtr<FJsonValue> MoveBTNode(const TSharedPtr<FJsonObject>& Params);
146
+ static TSharedPtr<FJsonValue> RemoveBTNode(const TSharedPtr<FJsonObject>& Params);
147
+
83
148
  // #163 - detailed navmesh configuration
84
149
  static TSharedPtr<FJsonValue> GetNavmeshDetails(const TSharedPtr<FJsonObject>& Params);
85
150