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.
- package/README.md +4 -3
- package/dist/action-class.js +56 -3
- package/dist/action-class.js.map +1 -1
- package/dist/bridge-timeouts.d.ts +64 -0
- package/dist/bridge-timeouts.js +118 -0
- package/dist/bridge-timeouts.js.map +1 -0
- package/dist/bridge.js +10 -2
- package/dist/bridge.js.map +1 -1
- package/dist/editor-control.d.ts +72 -5
- package/dist/editor-control.js +164 -140
- package/dist/editor-control.js.map +1 -1
- package/dist/editor-target.d.ts +55 -1
- package/dist/editor-target.js +107 -10
- package/dist/editor-target.js.map +1 -1
- package/dist/engine-observer.d.ts +59 -5
- package/dist/engine-observer.js +249 -29
- package/dist/engine-observer.js.map +1 -1
- package/dist/engine-root.d.ts +91 -0
- package/dist/engine-root.js +448 -0
- package/dist/engine-root.js.map +1 -0
- package/dist/epic-enrich.js +16 -1
- package/dist/epic-enrich.js.map +1 -1
- package/dist/feedback-cli.js +4 -0
- package/dist/feedback-cli.js.map +1 -1
- package/dist/feedback-deferred.d.ts +9 -0
- package/dist/feedback-deferred.js +2 -0
- package/dist/feedback-deferred.js.map +1 -1
- package/dist/feedback-fallback.d.ts +99 -0
- package/dist/feedback-fallback.js +173 -0
- package/dist/feedback-fallback.js.map +1 -0
- package/dist/flow/write-methods.js +20 -0
- package/dist/flow/write-methods.js.map +1 -1
- package/dist/lean-context.js +8 -3
- package/dist/lean-context.js.map +1 -1
- package/dist/locking.js +11 -2
- package/dist/locking.js.map +1 -1
- package/dist/project.d.ts +11 -0
- package/dist/project.js +23 -2
- package/dist/project.js.map +1 -1
- package/dist/python-gate.d.ts +95 -0
- package/dist/python-gate.js +175 -0
- package/dist/python-gate.js.map +1 -0
- package/dist/tool-counts.json +16 -16
- package/dist/tools/animation.js +288 -24
- package/dist/tools/animation.js.map +1 -1
- package/dist/tools/asset.js +79 -14
- package/dist/tools/asset.js.map +1 -1
- package/dist/tools/audio.js +59 -5
- package/dist/tools/audio.js.map +1 -1
- package/dist/tools/blueprint.js +29 -12
- package/dist/tools/blueprint.js.map +1 -1
- package/dist/tools/chooser.js +4 -1
- package/dist/tools/chooser.js.map +1 -1
- package/dist/tools/editor.js +81 -43
- package/dist/tools/editor.js.map +1 -1
- package/dist/tools/feedback.js +214 -48
- package/dist/tools/feedback.js.map +1 -1
- package/dist/tools/foliage.js +27 -1
- package/dist/tools/foliage.js.map +1 -1
- package/dist/tools/gameplay.js +38 -11
- package/dist/tools/gameplay.js.map +1 -1
- package/dist/tools/gas.js +17 -5
- package/dist/tools/gas.js.map +1 -1
- package/dist/tools/landscape.js +22 -7
- package/dist/tools/landscape.js.map +1 -1
- package/dist/tools/level.js +322 -51
- package/dist/tools/level.js.map +1 -1
- package/dist/tools/material.js +10 -4
- package/dist/tools/material.js.map +1 -1
- package/dist/tools/niagara.js +3 -2
- package/dist/tools/niagara.js.map +1 -1
- package/dist/tools/pcg.js +6 -5
- package/dist/tools/pcg.js.map +1 -1
- package/dist/tools/project.js +47 -20
- package/dist/tools/project.js.map +1 -1
- package/dist/types.d.ts +21 -0
- package/dist/types.js +46 -3
- package/dist/types.js.map +1 -1
- package/dist/ue-mcp.default.yml +493 -125
- package/package.json +2 -2
- package/plugin/ue_mcp_bridge/NATIVE_RUNTIME_VISIBILITY.md +53 -0
- package/plugin/ue_mcp_bridge/NATIVE_STATIC_MESH_USAGE_PROGRESS.md +115 -0
- package/plugin/ue_mcp_bridge/README_MassHandlers.md +97 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +14 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +21 -4
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +9 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerJsonProperty.h +395 -69
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +79 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +25 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRig.cpp +3 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRigSequencer.cpp +3061 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRetargeterAuthoring.cpp +961 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_IKRigAuthoring.cpp +900 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Pose.cpp +769 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp +44 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_SkeletalLive.cpp +217 -11
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_StateMachine.cpp +551 -24
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Validation.cpp +735 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +352 -73
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +8 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkProperties.cpp +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.cpp +503 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkRead.h +21 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_BulkUpsert.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Enum.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.cpp +902 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Geometry.h +33 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Import.cpp +478 -134
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Mesh.cpp +5 -5
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.cpp +933 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_MeshBoolean.h +35 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Redirectors.cpp +478 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_RenderTarget.cpp +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Sockets.cpp +4 -4
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Struct.cpp +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers_Subobject.cpp +319 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers_SoundCue.cpp +3 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +482 -35
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +10 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.cpp +502 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Collision.h +43 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Functions.cpp +89 -7
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Graph.cpp +17 -51
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Internal.h +107 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Properties.cpp +10 -10
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Search.cpp +648 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +5 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.cpp +252 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DiffHandlers.h +10 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +252 -41
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +4 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_Build.cpp +250 -27
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIE.cpp +303 -125
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIERuntime.cpp +73 -50
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_RuntimeVisibility.cpp +757 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +11 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.h +3 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers_Batch.cpp +419 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +39 -161
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +66 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BTAuthoring.cpp +1323 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_BehaviorTree.cpp +1211 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +2 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.h +60 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers_Runtime.cpp +363 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/HandlerEditorState.h +84 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +1288 -36
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +3 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers_Sculpt.cpp +41 -16
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +959 -213
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +66 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_BatchWrite.cpp +1571 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Convert.cpp +316 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Inspection.cpp +280 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection.cpp +666 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_InstanceProjection_Internal.h +63 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Lights.cpp +43 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_MultiLevel.cpp +13 -47
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_PostProcess.cpp +527 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Query.cpp +1169 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Refresh.cpp +723 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Save.cpp +325 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Spatial.cpp +360 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Trace.cpp +178 -58
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Transient.cpp +337 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Volumes.cpp +25 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartition.cpp +10 -9
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartitionSettings.cpp +686 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.cpp +467 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MassHandlers.h +22 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +452 -175
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +5 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers_Build.cpp +597 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +17 -15
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +38 -168
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +39 -30
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +392 -78
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.h +2 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers_Internal.h +83 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.cpp +200 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SkeletalMeshHandlers.h +15 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +19 -12
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/StateTreeHandlers.cpp +31 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +307 -69
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.h +84 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Extraction.cpp +8 -41
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers_Properties.cpp +33 -52
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/ActorSelectorTests.cpp +344 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationControlRigTimelineTests.cpp +60 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AnimationPoseTests.cpp +115 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetBulkReadTests.cpp +177 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetDeleteGuardTests.cpp +276 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPathResolutionTests.cpp +243 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetPropertyPersistTests.cpp +213 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AssetSubobjectTests.cpp +235 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/AutomationRunnerTests.cpp +72 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeAuthoringTests.cpp +526 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BehaviorTreeNodeTests.cpp +334 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BlueprintHandlerSurfaceTests.cpp +362 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/BridgeProtocolTests.cpp +14 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/CollisionQueryTests.cpp +288 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/DataTableRowWriteTests.cpp +453 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/EditorFunctionCallTests.cpp +223 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/FoliageBatchTests.cpp +147 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GameThreadGateTests.cpp +82 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/GasLiveAttributeTests.cpp +183 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LandscapeSampleTests.cpp +119 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelBatchWriteTests.cpp +176 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelComponentTreeInstanceCountTests.cpp +189 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelConvertBrushesTests.cpp +100 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelInstanceProjectionTests.cpp +265 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelPostProcessOverrideTests.cpp +258 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelQueryComponentsTests.cpp +195 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelRefreshTests.cpp +142 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelSaveReportTests.cpp +125 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelScriptHandlersTests.cpp +42 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelStaticMeshUsageTests.cpp +412 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTraceWorldScopeTests.cpp +133 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelTransientActorTests.cpp +205 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/LevelWorldPartitionSettingsTests.cpp +168 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTestTypes.h +51 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MCPInstancedStructPathTests.cpp +379 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MaterialBuildTests.cpp +238 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshBooleanTests.cpp +170 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/MeshGeometryTests.cpp +116 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageSaveExtensionTests.cpp +161 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PackageWriteGuardTests.cpp +253 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/RuntimeVisibilityTests.cpp +143 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerHandlerTests.cpp +660 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SequencerScrubTests.cpp +50 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/SkeletonDiffTests.cpp +685 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/WidgetBlueprintResolveTests.cpp +145 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +80 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerFunctionCall.h +509 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerQuery.h +407 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerUtils.h +1008 -77
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +87 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/MCPEngineStatus.cpp +152 -14
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/Tests/MCPEngineStatusTests.cpp +65 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Public/MCPEngineStatus.h +32 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/UE_MCP_BridgeStatus.Build.cs +2 -0
- package/skills/ue-mcp-animation/SKILL.md +154 -0
- package/skills/ue-mcp-blueprint/SKILL.md +71 -0
package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers_Internal.h
ADDED
|
@@ -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 =
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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 =
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
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
|
}
|