unreal-engine-mcp-server 0.5.4 → 0.5.5
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/dist/automation/bridge.d.ts.map +1 -0
- package/dist/automation/bridge.js.map +1 -0
- package/dist/automation/connection-manager.d.ts.map +1 -0
- package/dist/automation/connection-manager.js.map +1 -0
- package/dist/automation/handshake.d.ts.map +1 -0
- package/dist/automation/handshake.js.map +1 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/message-handler.d.ts.map +1 -0
- package/dist/automation/message-handler.js.map +1 -0
- package/dist/automation/request-tracker.d.ts.map +1 -0
- package/dist/automation/request-tracker.js.map +1 -0
- package/dist/automation/types.d.ts.map +1 -0
- package/dist/automation/types.js.map +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -0
- package/dist/config/class-aliases.d.ts.map +1 -0
- package/dist/config/class-aliases.js.map +1 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js.map +1 -0
- package/dist/graphql/loaders.d.ts.map +1 -0
- package/dist/graphql/loaders.js.map +1 -0
- package/dist/graphql/resolvers.d.ts.map +1 -0
- package/dist/graphql/resolvers.js +29 -29
- package/dist/graphql/resolvers.js.map +1 -0
- package/dist/graphql/schema.d.ts.map +1 -0
- package/dist/graphql/schema.js.map +1 -0
- package/dist/graphql/server.d.ts.map +1 -0
- package/dist/graphql/server.js.map +1 -0
- package/dist/graphql/types.d.ts.map +1 -0
- package/dist/graphql/types.js.map +1 -0
- package/dist/handlers/resource-handlers.d.ts.map +1 -0
- package/dist/handlers/resource-handlers.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -7
- package/dist/index.js.map +1 -0
- package/dist/resources/actors.d.ts.map +1 -0
- package/dist/resources/actors.js.map +1 -0
- package/dist/resources/assets.d.ts.map +1 -0
- package/dist/resources/assets.js +6 -4
- package/dist/resources/assets.js.map +1 -0
- package/dist/resources/levels.d.ts.map +1 -0
- package/dist/resources/levels.js.map +1 -0
- package/dist/server/resource-registry.d.ts.map +1 -0
- package/dist/server/resource-registry.js.map +1 -0
- package/dist/server/tool-registry.d.ts.map +1 -0
- package/dist/server/tool-registry.js.map +1 -0
- package/dist/server-setup.d.ts.map +1 -0
- package/dist/server-setup.js.map +1 -0
- package/dist/services/health-monitor.d.ts.map +1 -0
- package/dist/services/health-monitor.js.map +1 -0
- package/dist/services/metrics-server.d.ts.map +1 -0
- package/dist/services/metrics-server.js.map +1 -0
- package/dist/tools/actors.d.ts.map +1 -0
- package/dist/tools/actors.js +3 -1
- package/dist/tools/actors.js.map +1 -0
- package/dist/tools/animation.d.ts.map +1 -0
- package/dist/tools/animation.js +2 -2
- package/dist/tools/animation.js.map +1 -0
- package/dist/tools/assets.d.ts.map +1 -0
- package/dist/tools/assets.js.map +1 -0
- package/dist/tools/audio.d.ts.map +1 -0
- package/dist/tools/audio.js.map +1 -0
- package/dist/tools/base-tool.d.ts.map +1 -0
- package/dist/tools/base-tool.js.map +1 -0
- package/dist/tools/behavior-tree.d.ts.map +1 -0
- package/dist/tools/behavior-tree.js.map +1 -0
- package/dist/tools/blueprint.d.ts.map +1 -0
- package/dist/tools/blueprint.js +4 -2
- package/dist/tools/blueprint.js.map +1 -0
- package/dist/tools/consolidated-tool-definitions.d.ts.map +1 -0
- package/dist/tools/consolidated-tool-definitions.js.map +1 -0
- package/dist/tools/consolidated-tool-handlers.d.ts.map +1 -0
- package/dist/tools/consolidated-tool-handlers.js.map +1 -0
- package/dist/tools/debug.d.ts.map +1 -0
- package/dist/tools/debug.js +3 -1
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/dynamic-handler-registry.d.ts.map +1 -0
- package/dist/tools/dynamic-handler-registry.js +3 -1
- package/dist/tools/dynamic-handler-registry.js.map +1 -0
- package/dist/tools/editor.d.ts.map +1 -0
- package/dist/tools/editor.js +1 -1
- package/dist/tools/editor.js.map +1 -0
- package/dist/tools/engine.d.ts.map +1 -0
- package/dist/tools/engine.js.map +1 -0
- package/dist/tools/environment.d.ts.map +1 -0
- package/dist/tools/environment.js +2 -2
- package/dist/tools/environment.js.map +1 -0
- package/dist/tools/foliage.d.ts.map +1 -0
- package/dist/tools/foliage.js.map +1 -0
- package/dist/tools/handlers/actor-handlers.d.ts +1 -1
- package/dist/tools/handlers/actor-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/actor-handlers.js +6 -5
- package/dist/tools/handlers/actor-handlers.js.map +1 -0
- package/dist/tools/handlers/animation-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/animation-handlers.js.map +1 -0
- package/dist/tools/handlers/argument-helper.d.ts.map +1 -0
- package/dist/tools/handlers/argument-helper.js.map +1 -0
- package/dist/tools/handlers/asset-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/asset-handlers.js +5 -1
- package/dist/tools/handlers/asset-handlers.js.map +1 -0
- package/dist/tools/handlers/audio-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/audio-handlers.js.map +1 -0
- package/dist/tools/handlers/blueprint-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/blueprint-handlers.js +2 -1
- package/dist/tools/handlers/blueprint-handlers.js.map +1 -0
- package/dist/tools/handlers/common-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/common-handlers.js.map +1 -0
- package/dist/tools/handlers/editor-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/editor-handlers.js +12 -2
- package/dist/tools/handlers/editor-handlers.js.map +1 -0
- package/dist/tools/handlers/effect-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/effect-handlers.js.map +1 -0
- package/dist/tools/handlers/environment-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/environment-handlers.js.map +1 -0
- package/dist/tools/handlers/graph-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/graph-handlers.js +61 -1
- package/dist/tools/handlers/graph-handlers.js.map +1 -0
- package/dist/tools/handlers/input-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/input-handlers.js.map +1 -0
- package/dist/tools/handlers/inspect-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/inspect-handlers.js.map +1 -0
- package/dist/tools/handlers/level-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/level-handlers.js.map +1 -0
- package/dist/tools/handlers/lighting-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/lighting-handlers.js +23 -1
- package/dist/tools/handlers/lighting-handlers.js.map +1 -0
- package/dist/tools/handlers/performance-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/performance-handlers.js +15 -2
- package/dist/tools/handlers/performance-handlers.js.map +1 -0
- package/dist/tools/handlers/pipeline-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/pipeline-handlers.js.map +1 -0
- package/dist/tools/handlers/sequence-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/sequence-handlers.js.map +1 -0
- package/dist/tools/handlers/system-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/system-handlers.js +16 -1
- package/dist/tools/handlers/system-handlers.js.map +1 -0
- package/dist/tools/input.d.ts.map +1 -0
- package/dist/tools/input.js +3 -1
- package/dist/tools/input.js.map +1 -0
- package/dist/tools/introspection.d.ts.map +1 -0
- package/dist/tools/introspection.js.map +1 -0
- package/dist/tools/landscape.d.ts.map +1 -0
- package/dist/tools/landscape.js +3 -1
- package/dist/tools/landscape.js.map +1 -0
- package/dist/tools/level.d.ts.map +1 -0
- package/dist/tools/level.js.map +1 -0
- package/dist/tools/lighting.d.ts.map +1 -0
- package/dist/tools/lighting.js +3 -1
- package/dist/tools/lighting.js.map +1 -0
- package/dist/tools/logs.d.ts.map +1 -0
- package/dist/tools/logs.js.map +1 -0
- package/dist/tools/materials.d.ts.map +1 -0
- package/dist/tools/materials.js +3 -1
- package/dist/tools/materials.js.map +1 -0
- package/dist/tools/niagara.d.ts.map +1 -0
- package/dist/tools/niagara.js +7 -5
- package/dist/tools/niagara.js.map +1 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/tools/physics.d.ts.map +1 -0
- package/dist/tools/physics.js +9 -7
- package/dist/tools/physics.js.map +1 -0
- package/dist/tools/property-dictionary.d.ts.map +1 -0
- package/dist/tools/property-dictionary.js.map +1 -0
- package/dist/tools/sequence.d.ts.map +1 -0
- package/dist/tools/sequence.js +3 -1
- package/dist/tools/sequence.js.map +1 -0
- package/dist/tools/tool-definition-utils.d.ts.map +1 -0
- package/dist/tools/tool-definition-utils.js.map +1 -0
- package/dist/tools/ui.d.ts.map +1 -0
- package/dist/tools/ui.js +3 -1
- package/dist/tools/ui.js.map +1 -0
- package/dist/types/automation-responses.d.ts.map +1 -0
- package/dist/types/automation-responses.js.map +1 -0
- package/dist/types/env.d.ts.map +1 -0
- package/dist/types/env.js.map +1 -0
- package/dist/types/handler-types.d.ts.map +1 -0
- package/dist/types/handler-types.js.map +1 -0
- package/dist/types/tool-interfaces.d.ts.map +1 -0
- package/dist/types/tool-interfaces.js.map +1 -0
- package/dist/types/tool-types.d.ts.map +1 -0
- package/dist/types/tool-types.js.map +1 -0
- package/dist/unreal-bridge.d.ts +1 -0
- package/dist/unreal-bridge.d.ts.map +1 -0
- package/dist/unreal-bridge.js +8 -0
- package/dist/unreal-bridge.js.map +1 -0
- package/dist/utils/command-validator.d.ts.map +1 -0
- package/dist/utils/command-validator.js.map +1 -0
- package/dist/utils/elicitation.d.ts.map +1 -0
- package/dist/utils/elicitation.js.map +1 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/ini-reader.d.ts.map +1 -0
- package/dist/utils/ini-reader.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/normalize.d.ts.map +1 -0
- package/dist/utils/normalize.js.map +1 -0
- package/dist/utils/path-security.d.ts.map +1 -0
- package/dist/utils/path-security.js.map +1 -0
- package/dist/utils/response-factory.d.ts.map +1 -0
- package/dist/utils/response-factory.js +3 -1
- package/dist/utils/response-factory.js.map +1 -0
- package/dist/utils/response-validator.d.ts.map +1 -0
- package/dist/utils/response-validator.js.map +1 -0
- package/dist/utils/result-helpers.d.ts.map +1 -0
- package/dist/utils/result-helpers.js.map +1 -0
- package/dist/utils/safe-json.d.ts.map +1 -0
- package/dist/utils/safe-json.js.map +1 -0
- package/dist/utils/unreal-command-queue.d.ts.map +1 -0
- package/dist/utils/unreal-command-queue.js.map +1 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/wasm/index.d.ts.map +1 -0
- package/dist/wasm/index.js.map +1 -0
- package/package.json +12 -34
- package/server.json +2 -2
- package/.dockerignore +0 -57
- package/.env.example +0 -26
- package/.env.production +0 -61
- package/.eslintrc.json +0 -0
- package/.eslintrc.override.json +0 -8
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -94
- package/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -56
- package/.github/copilot-instructions.md +0 -478
- package/.github/dependabot.yml +0 -19
- package/.github/labeler.yml +0 -24
- package/.github/labels.yml +0 -70
- package/.github/pull_request_template.md +0 -42
- package/.github/release-drafter-config.yml +0 -51
- package/.github/workflows/auto-merge.yml +0 -38
- package/.github/workflows/ci.yml +0 -38
- package/.github/workflows/dependency-review.yml +0 -17
- package/.github/workflows/gemini-issue-triage.yml +0 -172
- package/.github/workflows/greetings.yml +0 -27
- package/.github/workflows/labeler.yml +0 -17
- package/.github/workflows/links.yml +0 -80
- package/.github/workflows/pr-size-labeler.yml +0 -137
- package/.github/workflows/publish-mcp.yml +0 -79
- package/.github/workflows/release-drafter.yml +0 -24
- package/.github/workflows/release.yml +0 -112
- package/.github/workflows/semantic-pull-request.yml +0 -35
- package/.github/workflows/smoke-test.yml +0 -36
- package/.github/workflows/stale.yml +0 -28
- package/CONTRIBUTING.md +0 -140
- package/Dockerfile +0 -37
- package/GEMINI.md +0 -115
- package/Public/Plugin_setup_guide.mp4 +0 -0
- package/Public/icon.png +0 -0
- package/claude_desktop_config_example.json +0 -15
- package/dist/types/responses.d.ts +0 -249
- package/dist/types/responses.js +0 -2
- package/docs/GraphQL-API.md +0 -888
- package/docs/Migration-Guide-v0.5.0.md +0 -684
- package/docs/Roadmap.md +0 -53
- package/docs/WebAssembly-Integration.md +0 -628
- package/docs/editor-plugin-extension.md +0 -370
- package/docs/handler-mapping.md +0 -249
- package/docs/native-automation-progress.md +0 -128
- package/docs/testing-guide.md +0 -423
- package/eslint.config.mjs +0 -68
- package/mcp-config-example.json +0 -14
- package/plugins/McpAutomationBridge/Config/FilterPlugin.ini +0 -8
- package/plugins/McpAutomationBridge/McpAutomationBridge.uplugin +0 -64
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/McpAutomationBridge.Build.cs +0 -189
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.cpp +0 -22
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeGlobals.h +0 -30
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeHelpers.h +0 -1983
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeModule.cpp +0 -72
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSettings.cpp +0 -46
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridgeSubsystem.cpp +0 -846
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AnimationHandlers.cpp +0 -2393
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetQueryHandlers.cpp +0 -300
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AssetWorkflowHandlers.cpp +0 -2807
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_AudioHandlers.cpp +0 -1087
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BehaviorTreeHandlers.cpp +0 -488
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.cpp +0 -643
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintCreationHandlers.h +0 -31
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintGraphHandlers.cpp +0 -1094
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers.cpp +0 -5750
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_BlueprintHandlers_List.cpp +0 -152
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ControlHandlers.cpp +0 -2614
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_DebugHandlers.cpp +0 -42
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EditorFunctionHandlers.cpp +0 -1237
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EffectHandlers.cpp +0 -1725
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_EnvironmentHandlers.cpp +0 -2265
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_FoliageHandlers.cpp +0 -954
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InputHandlers.cpp +0 -209
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_InsightsHandlers.cpp +0 -41
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LandscapeHandlers.cpp +0 -1164
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LevelHandlers.cpp +0 -762
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LightingHandlers.cpp +0 -663
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_LogHandlers.cpp +0 -136
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_MaterialGraphHandlers.cpp +0 -494
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraGraphHandlers.cpp +0 -278
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_NiagaraHandlers.cpp +0 -625
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PerformanceHandlers.cpp +0 -401
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PipelineHandlers.cpp +0 -67
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_ProcessRequest.cpp +0 -472
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_PropertyHandlers.cpp +0 -2634
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_RenderHandlers.cpp +0 -189
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.cpp +0 -917
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SCSHandlers.h +0 -39
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequenceHandlers.cpp +0 -2706
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_SequencerHandlers.cpp +0 -519
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_TestHandlers.cpp +0 -38
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_UiHandlers.cpp +0 -668
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpAutomationBridge_WorldPartitionHandlers.cpp +0 -346
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.cpp +0 -1345
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpBridgeWebSocket.h +0 -149
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/McpConnectionManager.cpp +0 -782
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSettings.h +0 -115
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpAutomationBridgeSubsystem.h +0 -796
- package/plugins/McpAutomationBridge/Source/McpAutomationBridge/Public/McpConnectionManager.h +0 -117
- package/scripts/check-unreal-connection.mjs +0 -19
- package/scripts/clean-tmp.js +0 -23
- package/scripts/patch-wasm.js +0 -26
- package/scripts/run-all-tests.mjs +0 -136
- package/scripts/smoke-test.ts +0 -94
- package/scripts/sync-mcp-plugin.js +0 -143
- package/scripts/test-no-plugin-alternates.mjs +0 -113
- package/scripts/validate-server.js +0 -46
- package/scripts/verify-automation-bridge.js +0 -200
- package/src/automation/bridge.ts +0 -630
- package/src/automation/connection-manager.ts +0 -148
- package/src/automation/handshake.ts +0 -99
- package/src/automation/index.ts +0 -2
- package/src/automation/message-handler.ts +0 -192
- package/src/automation/request-tracker.ts +0 -155
- package/src/automation/types.ts +0 -108
- package/src/cli.ts +0 -34
- package/src/config/class-aliases.ts +0 -65
- package/src/config.ts +0 -73
- package/src/constants.ts +0 -29
- package/src/graphql/loaders.ts +0 -244
- package/src/graphql/resolvers.ts +0 -1008
- package/src/graphql/schema.ts +0 -452
- package/src/graphql/server.ts +0 -156
- package/src/graphql/types.ts +0 -10
- package/src/handlers/resource-handlers.ts +0 -186
- package/src/index.ts +0 -243
- package/src/resources/actors.ts +0 -127
- package/src/resources/assets.ts +0 -286
- package/src/resources/levels.ts +0 -68
- package/src/server/resource-registry.ts +0 -47
- package/src/server/tool-registry.ts +0 -354
- package/src/server-setup.ts +0 -114
- package/src/services/health-monitor.ts +0 -132
- package/src/services/metrics-server.ts +0 -176
- package/src/tools/actors.ts +0 -564
- package/src/tools/animation.ts +0 -941
- package/src/tools/assets.ts +0 -394
- package/src/tools/audio.ts +0 -499
- package/src/tools/base-tool.ts +0 -52
- package/src/tools/behavior-tree.ts +0 -45
- package/src/tools/blueprint.ts +0 -940
- package/src/tools/consolidated-tool-definitions.ts +0 -1256
- package/src/tools/consolidated-tool-handlers.ts +0 -302
- package/src/tools/debug.ts +0 -622
- package/src/tools/dynamic-handler-registry.ts +0 -33
- package/src/tools/editor.ts +0 -435
- package/src/tools/engine.ts +0 -43
- package/src/tools/environment.ts +0 -281
- package/src/tools/foliage.ts +0 -596
- package/src/tools/handlers/actor-handlers.ts +0 -244
- package/src/tools/handlers/animation-handlers.ts +0 -237
- package/src/tools/handlers/argument-helper.ts +0 -142
- package/src/tools/handlers/asset-handlers.ts +0 -550
- package/src/tools/handlers/audio-handlers.ts +0 -194
- package/src/tools/handlers/blueprint-handlers.ts +0 -380
- package/src/tools/handlers/common-handlers.ts +0 -108
- package/src/tools/handlers/editor-handlers.ts +0 -124
- package/src/tools/handlers/effect-handlers.ts +0 -224
- package/src/tools/handlers/environment-handlers.ts +0 -183
- package/src/tools/handlers/graph-handlers.ts +0 -117
- package/src/tools/handlers/input-handlers.ts +0 -28
- package/src/tools/handlers/inspect-handlers.ts +0 -450
- package/src/tools/handlers/level-handlers.ts +0 -253
- package/src/tools/handlers/lighting-handlers.ts +0 -151
- package/src/tools/handlers/performance-handlers.ts +0 -132
- package/src/tools/handlers/pipeline-handlers.ts +0 -194
- package/src/tools/handlers/sequence-handlers.ts +0 -438
- package/src/tools/handlers/system-handlers.ts +0 -564
- package/src/tools/input.ts +0 -160
- package/src/tools/introspection.ts +0 -689
- package/src/tools/landscape.ts +0 -649
- package/src/tools/level.ts +0 -989
- package/src/tools/lighting.ts +0 -1052
- package/src/tools/logs.ts +0 -219
- package/src/tools/materials.ts +0 -295
- package/src/tools/niagara.ts +0 -485
- package/src/tools/performance.ts +0 -661
- package/src/tools/physics.ts +0 -679
- package/src/tools/property-dictionary.ts +0 -98
- package/src/tools/sequence.ts +0 -385
- package/src/tools/tool-definition-utils.ts +0 -35
- package/src/tools/ui.ts +0 -452
- package/src/types/automation-responses.ts +0 -119
- package/src/types/env.ts +0 -17
- package/src/types/handler-types.ts +0 -442
- package/src/types/responses.ts +0 -355
- package/src/types/tool-interfaces.ts +0 -250
- package/src/types/tool-types.ts +0 -575
- package/src/unreal-bridge.ts +0 -693
- package/src/utils/command-validator.ts +0 -139
- package/src/utils/elicitation.ts +0 -132
- package/src/utils/error-handler.ts +0 -287
- package/src/utils/ini-reader.ts +0 -86
- package/src/utils/logger.ts +0 -35
- package/src/utils/normalize.test.ts +0 -162
- package/src/utils/normalize.ts +0 -146
- package/src/utils/path-security.ts +0 -43
- package/src/utils/response-factory.ts +0 -44
- package/src/utils/response-validator.ts +0 -395
- package/src/utils/result-helpers.ts +0 -195
- package/src/utils/safe-json.test.ts +0 -90
- package/src/utils/safe-json.ts +0 -70
- package/src/utils/unreal-command-queue.ts +0 -166
- package/src/utils/validation.test.ts +0 -184
- package/src/utils/validation.ts +0 -312
- package/src/wasm/index.ts +0 -838
- package/test-server.mjs +0 -100
- package/tests/test-animation.mjs +0 -369
- package/tests/test-asset-advanced.mjs +0 -82
- package/tests/test-asset-graph.mjs +0 -311
- package/tests/test-audio.mjs +0 -417
- package/tests/test-automation-timeouts.mjs +0 -98
- package/tests/test-behavior-tree.mjs +0 -444
- package/tests/test-blueprint-graph.mjs +0 -410
- package/tests/test-blueprint.mjs +0 -577
- package/tests/test-client-mode.mjs +0 -86
- package/tests/test-console-command.mjs +0 -56
- package/tests/test-control-actor.mjs +0 -425
- package/tests/test-control-editor.mjs +0 -112
- package/tests/test-graphql.mjs +0 -372
- package/tests/test-input.mjs +0 -349
- package/tests/test-inspect.mjs +0 -302
- package/tests/test-landscape.mjs +0 -316
- package/tests/test-lighting.mjs +0 -428
- package/tests/test-manage-asset.mjs +0 -438
- package/tests/test-manage-level.mjs +0 -89
- package/tests/test-materials.mjs +0 -356
- package/tests/test-niagara.mjs +0 -185
- package/tests/test-no-inline-python.mjs +0 -122
- package/tests/test-performance.mjs +0 -539
- package/tests/test-plugin-handshake.mjs +0 -82
- package/tests/test-runner.mjs +0 -993
- package/tests/test-sequence.mjs +0 -104
- package/tests/test-system.mjs +0 -96
- package/tests/test-wasm.mjs +0 -283
- package/tests/test-world-partition.mjs +0 -215
- package/tsconfig.json +0 -56
- package/vitest.config.ts +0 -35
- package/wasm/Cargo.lock +0 -363
- package/wasm/Cargo.toml +0 -42
- package/wasm/LICENSE +0 -21
- package/wasm/README.md +0 -253
- package/wasm/src/dependency_resolver.rs +0 -377
- package/wasm/src/lib.rs +0 -153
- package/wasm/src/property_parser.rs +0 -271
- package/wasm/src/transform_math.rs +0 -396
- package/wasm/tests/integration.rs +0 -109
package/src/tools/landscape.ts
DELETED
|
@@ -1,649 +0,0 @@
|
|
|
1
|
-
// Landscape tools for Unreal Engine with UE 5.6 World Partition support
|
|
2
|
-
import { UnrealBridge } from '../unreal-bridge.js';
|
|
3
|
-
import { AutomationBridge } from '../automation/index.js';
|
|
4
|
-
import { ensureVector3 } from '../utils/validation.js';
|
|
5
|
-
import { wasmIntegration } from '../wasm/index.js';
|
|
6
|
-
import { ILandscapeTools, StandardActionResponse } from '../types/tool-interfaces.js';
|
|
7
|
-
|
|
8
|
-
export class LandscapeTools implements ILandscapeTools {
|
|
9
|
-
constructor(private bridge: UnrealBridge, private automationBridge?: AutomationBridge) { }
|
|
10
|
-
|
|
11
|
-
setAutomationBridge(automationBridge?: AutomationBridge) { this.automationBridge = automationBridge; }
|
|
12
|
-
|
|
13
|
-
// Create landscape with World Partition support (UE 5.6)
|
|
14
|
-
async createLandscape(params: {
|
|
15
|
-
name: string;
|
|
16
|
-
location?: [number, number, number];
|
|
17
|
-
sizeX?: number;
|
|
18
|
-
sizeY?: number;
|
|
19
|
-
quadsPerSection?: number;
|
|
20
|
-
sectionsPerComponent?: number;
|
|
21
|
-
componentCount?: number;
|
|
22
|
-
materialPath?: string;
|
|
23
|
-
// World Partition specific (UE 5.6)
|
|
24
|
-
enableWorldPartition?: boolean;
|
|
25
|
-
runtimeGrid?: string;
|
|
26
|
-
isSpatiallyLoaded?: boolean;
|
|
27
|
-
dataLayers?: string[];
|
|
28
|
-
}): Promise<StandardActionResponse> {
|
|
29
|
-
const name = params.name?.trim();
|
|
30
|
-
if (!name) {
|
|
31
|
-
return { success: false, error: 'Landscape name is required' };
|
|
32
|
-
}
|
|
33
|
-
if (typeof params.sizeX === 'number' && params.sizeX <= 0) {
|
|
34
|
-
return {
|
|
35
|
-
success: false,
|
|
36
|
-
error: 'Landscape sizeX must be a positive number'
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
if (typeof params.sizeY === 'number' && params.sizeY <= 0) {
|
|
40
|
-
return {
|
|
41
|
-
success: false,
|
|
42
|
-
error: 'Landscape sizeY must be a positive number'
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (!this.automationBridge) {
|
|
47
|
-
throw new Error('Automation Bridge not available. Landscape operations require plugin support.');
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const [locX, locY, locZ] = ensureVector3(params.location ?? [0, 0, 0], 'landscape location');
|
|
51
|
-
// Use WASM vectorAdd for landscape location processing
|
|
52
|
-
const zeroVector: [number, number, number] = [0, 0, 0];
|
|
53
|
-
const processedLocation = wasmIntegration.vectorAdd(zeroVector, [locX, locY, locZ]);
|
|
54
|
-
console.error('[WASM] Using vectorAdd for landscape positioning');
|
|
55
|
-
const sectionsPerComponent = Math.max(1, Math.floor(params.sectionsPerComponent ?? 1));
|
|
56
|
-
const quadsPerSection = Math.max(1, Math.floor(params.quadsPerSection ?? 63));
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
// Map to plugin-native payload shape
|
|
60
|
-
const componentsX = Math.max(1, Math.floor((params.componentCount ?? Math.max(1, Math.floor((params.sizeX ?? 1000) / 1000)))));
|
|
61
|
-
const componentsY = Math.max(1, Math.floor((params.componentCount ?? Math.max(1, Math.floor((params.sizeY ?? 1000) / 1000)))));
|
|
62
|
-
const quadsPerComponent = quadsPerSection; // Plugin uses quadsPerComponent
|
|
63
|
-
|
|
64
|
-
const payload: Record<string, unknown> = {
|
|
65
|
-
name,
|
|
66
|
-
x: processedLocation[0],
|
|
67
|
-
y: processedLocation[1],
|
|
68
|
-
z: processedLocation[2],
|
|
69
|
-
componentsX,
|
|
70
|
-
componentsY,
|
|
71
|
-
quadsPerComponent,
|
|
72
|
-
sectionsPerComponent,
|
|
73
|
-
materialPath: params.materialPath || ''
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
const response = await this.automationBridge.sendAutomationRequest('create_landscape', payload, {
|
|
77
|
-
timeoutMs: 60000
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
if (response.success === false) {
|
|
81
|
-
return {
|
|
82
|
-
success: false,
|
|
83
|
-
error: response.error || response.message || 'Failed to create landscape actor'
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const result: Record<string, unknown> = {
|
|
88
|
-
success: true,
|
|
89
|
-
message: response.message || 'Landscape actor created',
|
|
90
|
-
landscapeName: response.landscapeName || name,
|
|
91
|
-
worldPartition: response.worldPartition ?? params.enableWorldPartition ?? false
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
if (response.landscapeActor) {
|
|
95
|
-
result.landscapeActor = response.landscapeActor;
|
|
96
|
-
}
|
|
97
|
-
if (response.warnings) {
|
|
98
|
-
result.warnings = response.warnings;
|
|
99
|
-
}
|
|
100
|
-
if (response.details) {
|
|
101
|
-
result.details = response.details;
|
|
102
|
-
}
|
|
103
|
-
if (params.runtimeGrid) {
|
|
104
|
-
result.runtimeGrid = params.runtimeGrid;
|
|
105
|
-
}
|
|
106
|
-
if (typeof params.isSpatiallyLoaded === 'boolean') {
|
|
107
|
-
result.spatiallyLoaded = params.isSpatiallyLoaded;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return result as StandardActionResponse;
|
|
111
|
-
} catch (error) {
|
|
112
|
-
return {
|
|
113
|
-
success: false,
|
|
114
|
-
error: `Failed to create landscape actor: ${error instanceof Error ? error.message : String(error)}`
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
// Sculpt landscape
|
|
121
|
-
async sculptLandscape(params: {
|
|
122
|
-
landscapeName: string;
|
|
123
|
-
tool: string;
|
|
124
|
-
brushSize?: number;
|
|
125
|
-
brushFalloff?: number;
|
|
126
|
-
strength?: number;
|
|
127
|
-
location?: [number, number, number];
|
|
128
|
-
radius?: number;
|
|
129
|
-
}): Promise<StandardActionResponse> {
|
|
130
|
-
const [x, y, z] = ensureVector3(params.location ?? [0, 0, 0], 'sculpt location');
|
|
131
|
-
|
|
132
|
-
const tool = (params.tool || '').trim();
|
|
133
|
-
const lowerTool = tool.toLowerCase();
|
|
134
|
-
const validTools = new Set(['sculpt', 'smooth', 'flatten', 'ramp', 'erosion', 'hydro', 'noise', 'raise', 'lower']);
|
|
135
|
-
const isValidTool = lowerTool.length > 0 && validTools.has(lowerTool);
|
|
136
|
-
|
|
137
|
-
if (!isValidTool) {
|
|
138
|
-
return {
|
|
139
|
-
success: false,
|
|
140
|
-
error: `Invalid sculpt tool: ${params.tool}`
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
if (!this.automationBridge) {
|
|
145
|
-
throw new Error('Automation Bridge not available. Landscape operations require plugin support.');
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const payload = {
|
|
149
|
-
landscapeName: params.landscapeName?.trim(),
|
|
150
|
-
toolMode: tool, // Map 'tool' to 'toolMode'
|
|
151
|
-
brushRadius: params.brushSize ?? params.radius ?? 1000,
|
|
152
|
-
brushFalloff: params.brushFalloff ?? 0.5,
|
|
153
|
-
strength: params.strength ?? 0.1,
|
|
154
|
-
location: { x, y, z }
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
const response = await this.automationBridge.sendAutomationRequest('sculpt_landscape', payload);
|
|
158
|
-
|
|
159
|
-
if (!response.success) {
|
|
160
|
-
return {
|
|
161
|
-
success: false,
|
|
162
|
-
error: response.error || 'Failed to sculpt landscape'
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return {
|
|
167
|
-
success: true,
|
|
168
|
-
message: `Sculpting applied to ${params.landscapeName}`,
|
|
169
|
-
details: response
|
|
170
|
-
} as StandardActionResponse;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Paint landscape
|
|
174
|
-
async paintLandscape(params: {
|
|
175
|
-
landscapeName: string;
|
|
176
|
-
layerName: string;
|
|
177
|
-
position: [number, number, number];
|
|
178
|
-
brushSize?: number;
|
|
179
|
-
strength?: number;
|
|
180
|
-
targetValue?: number;
|
|
181
|
-
radius?: number;
|
|
182
|
-
density?: number;
|
|
183
|
-
}): Promise<StandardActionResponse> {
|
|
184
|
-
if (!this.automationBridge) {
|
|
185
|
-
throw new Error('Automation Bridge not available.');
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const [x, y] = ensureVector3(params.position, 'paint position');
|
|
189
|
-
const radius = params.brushSize ?? params.radius ?? 1000;
|
|
190
|
-
|
|
191
|
-
// Map brush to a square region for now as C++ only supports region fill
|
|
192
|
-
const minX = Math.floor(x - radius);
|
|
193
|
-
const maxX = Math.floor(x + radius);
|
|
194
|
-
const minY = Math.floor(y - radius);
|
|
195
|
-
const maxY = Math.floor(y + radius);
|
|
196
|
-
|
|
197
|
-
const payload = {
|
|
198
|
-
landscapeName: params.landscapeName?.trim(),
|
|
199
|
-
layerName: params.layerName?.trim(),
|
|
200
|
-
region: { minX, minY, maxX, maxY },
|
|
201
|
-
strength: params.strength ?? 1.0
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
const response = await this.automationBridge.sendAutomationRequest('paint_landscape_layer', payload);
|
|
205
|
-
|
|
206
|
-
if (!response.success) {
|
|
207
|
-
return {
|
|
208
|
-
success: false,
|
|
209
|
-
error: response.error || 'Failed to paint landscape layer'
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
return {
|
|
214
|
-
success: true,
|
|
215
|
-
message: `Painted layer ${params.layerName}`,
|
|
216
|
-
details: response
|
|
217
|
-
} as StandardActionResponse;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Create procedural terrain using ProceduralMeshComponent
|
|
221
|
-
async createProceduralTerrain(params: {
|
|
222
|
-
name: string;
|
|
223
|
-
location?: [number, number, number];
|
|
224
|
-
sizeX?: number;
|
|
225
|
-
sizeY?: number;
|
|
226
|
-
subdivisions?: number;
|
|
227
|
-
heightFunction?: string; // Expression for height calculation
|
|
228
|
-
material?: string;
|
|
229
|
-
settings?: Record<string, unknown>;
|
|
230
|
-
}): Promise<StandardActionResponse> {
|
|
231
|
-
if (!this.automationBridge) {
|
|
232
|
-
throw new Error('Automation Bridge not available. Procedural terrain creation requires plugin support.');
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
try {
|
|
236
|
-
// Combine specific params with generic settings
|
|
237
|
-
const payload = {
|
|
238
|
-
name: params.name,
|
|
239
|
-
location: params.location || [0, 0, 0],
|
|
240
|
-
sizeX: params.sizeX || 2000,
|
|
241
|
-
sizeY: params.sizeY || 2000,
|
|
242
|
-
subdivisions: params.subdivisions || 50,
|
|
243
|
-
heightFunction: params.heightFunction || 'math.sin(x/100) * 50 + math.cos(y/100) * 30',
|
|
244
|
-
material: params.material,
|
|
245
|
-
...params.settings
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
const response = await this.automationBridge.sendAutomationRequest('create_procedural_terrain', payload, {
|
|
249
|
-
timeoutMs: 120000 // 2 minutes for mesh generation
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
if (response.success === false) {
|
|
253
|
-
return {
|
|
254
|
-
success: false,
|
|
255
|
-
error: response.error || response.message || 'Failed to create procedural terrain',
|
|
256
|
-
message: response.message || 'Failed to create procedural terrain'
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
const result = response.result as any;
|
|
261
|
-
return {
|
|
262
|
-
success: true,
|
|
263
|
-
message: response.message || `Created procedural terrain '${params.name}'`,
|
|
264
|
-
actorName: result?.actor_name,
|
|
265
|
-
vertices: result?.vertices,
|
|
266
|
-
triangles: result?.triangles,
|
|
267
|
-
size: result?.size,
|
|
268
|
-
subdivisions: result?.subdivisions,
|
|
269
|
-
details: result
|
|
270
|
-
} as StandardActionResponse;
|
|
271
|
-
} catch (error) {
|
|
272
|
-
return {
|
|
273
|
-
success: false,
|
|
274
|
-
error: `Failed to create procedural terrain: ${error instanceof Error ? error.message : String(error)}`
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// Create a LandscapeGrassType asset via AutomationBridge
|
|
280
|
-
async createLandscapeGrassType(params: {
|
|
281
|
-
name: string;
|
|
282
|
-
meshPath: string; // Normalized parameter name (was path/staticMesh/meshPath)
|
|
283
|
-
density?: number;
|
|
284
|
-
minScale?: number;
|
|
285
|
-
maxScale?: number;
|
|
286
|
-
path?: string; // Legacy support
|
|
287
|
-
staticMesh?: string; // Legacy support
|
|
288
|
-
}): Promise<StandardActionResponse> {
|
|
289
|
-
if (!this.automationBridge) {
|
|
290
|
-
throw new Error('Automation Bridge not available. Landscape operations require plugin support.');
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
const name = typeof params.name === 'string' ? params.name.trim() : '';
|
|
294
|
-
if (!name) {
|
|
295
|
-
return { success: false, error: 'Grass type name is required' };
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Accept mesh path from multiple fields for compatibility
|
|
299
|
-
const meshPathRaw = typeof params.meshPath === 'string' && params.meshPath.trim().length > 0
|
|
300
|
-
? params.meshPath.trim()
|
|
301
|
-
: (typeof params.path === 'string' && params.path.trim().length > 0
|
|
302
|
-
? params.path.trim()
|
|
303
|
-
: (typeof params.staticMesh === 'string' && params.staticMesh.trim().length > 0
|
|
304
|
-
? params.staticMesh.trim()
|
|
305
|
-
: ''));
|
|
306
|
-
|
|
307
|
-
if (!meshPathRaw) {
|
|
308
|
-
return { success: false, error: 'meshPath is required to create a landscape grass type' };
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
try {
|
|
312
|
-
const response: any = await this.automationBridge.sendAutomationRequest('create_landscape_grass_type', {
|
|
313
|
-
name,
|
|
314
|
-
meshPath: meshPathRaw,
|
|
315
|
-
density: params.density || 1.0,
|
|
316
|
-
minScale: params.minScale || 0.8,
|
|
317
|
-
maxScale: params.maxScale || 1.2
|
|
318
|
-
}, { timeoutMs: 90000 });
|
|
319
|
-
|
|
320
|
-
if (response && response.success === false) {
|
|
321
|
-
return {
|
|
322
|
-
success: false,
|
|
323
|
-
error: response.error || response.message || 'Failed to create landscape grass type'
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
const result = response.result as any;
|
|
328
|
-
return {
|
|
329
|
-
success: true,
|
|
330
|
-
message: response?.message || `Landscape grass type '${name}' created`,
|
|
331
|
-
assetPath: result?.asset_path || response?.assetPath || response?.asset_path
|
|
332
|
-
} as StandardActionResponse;
|
|
333
|
-
} catch (error) {
|
|
334
|
-
return {
|
|
335
|
-
success: false,
|
|
336
|
-
error: `Failed to create landscape grass type: ${error instanceof Error ? error.message : String(error)}`
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// Set the material used by an existing landscape actor
|
|
342
|
-
async setLandscapeMaterial(params: { landscapeName: string; materialPath: string }): Promise<StandardActionResponse> {
|
|
343
|
-
const landscapeName = typeof params.landscapeName === 'string' ? params.landscapeName.trim() : '';
|
|
344
|
-
const materialPath = typeof params.materialPath === 'string' ? params.materialPath.trim() : '';
|
|
345
|
-
|
|
346
|
-
if (!landscapeName) {
|
|
347
|
-
return { success: false, error: 'Landscape name is required' };
|
|
348
|
-
}
|
|
349
|
-
if (!materialPath) {
|
|
350
|
-
return { success: false, error: 'materialPath is required' };
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
if (!this.automationBridge) {
|
|
354
|
-
throw new Error('Automation Bridge not available. Landscape operations require plugin support.');
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
try {
|
|
358
|
-
const response: any = await this.automationBridge.sendAutomationRequest('set_landscape_material', {
|
|
359
|
-
landscapeName,
|
|
360
|
-
materialPath
|
|
361
|
-
}, { timeoutMs: 60000 });
|
|
362
|
-
|
|
363
|
-
if (response && response.success === false) {
|
|
364
|
-
return {
|
|
365
|
-
success: false,
|
|
366
|
-
error: response.error || response.message || 'Failed to set landscape material'
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
return {
|
|
371
|
-
success: true,
|
|
372
|
-
message: response?.message || `Landscape material set on '${landscapeName}'`,
|
|
373
|
-
landscapeName: response?.landscapeName || landscapeName,
|
|
374
|
-
materialPath: response?.materialPath || materialPath
|
|
375
|
-
} as StandardActionResponse;
|
|
376
|
-
} catch (error) {
|
|
377
|
-
return {
|
|
378
|
-
success: false,
|
|
379
|
-
error: `Failed to set landscape material: ${error instanceof Error ? error.message : String(error)}`
|
|
380
|
-
};
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
// Create landscape grass
|
|
385
|
-
async createLandscapeGrass(params: {
|
|
386
|
-
landscapeName: string;
|
|
387
|
-
grassType: string;
|
|
388
|
-
density?: number;
|
|
389
|
-
minScale?: number;
|
|
390
|
-
maxScale?: number;
|
|
391
|
-
randomRotation?: boolean;
|
|
392
|
-
}): Promise<StandardActionResponse> {
|
|
393
|
-
const commands: string[] = [];
|
|
394
|
-
|
|
395
|
-
commands.push(`CreateLandscapeGrass ${params.landscapeName} ${params.grassType}`);
|
|
396
|
-
|
|
397
|
-
if (params.density !== undefined) {
|
|
398
|
-
commands.push(`SetGrassDensity ${params.grassType} ${params.density}`);
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
if (params.minScale !== undefined && params.maxScale !== undefined) {
|
|
402
|
-
commands.push(`SetGrassScale ${params.grassType} ${params.minScale} ${params.maxScale}`);
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
if (params.randomRotation !== undefined) {
|
|
406
|
-
commands.push(`SetGrassRandomRotation ${params.grassType} ${params.randomRotation}`);
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
await this.bridge.executeConsoleCommands(commands);
|
|
410
|
-
|
|
411
|
-
return { success: true, message: `Grass type ${params.grassType} created on landscape` };
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
// Landscape collision
|
|
415
|
-
async updateLandscapeCollision(params: {
|
|
416
|
-
landscapeName: string;
|
|
417
|
-
collisionMipLevel?: number;
|
|
418
|
-
simpleCollision?: boolean;
|
|
419
|
-
}): Promise<StandardActionResponse> {
|
|
420
|
-
const commands: string[] = [];
|
|
421
|
-
|
|
422
|
-
if (params.collisionMipLevel !== undefined) {
|
|
423
|
-
commands.push(`SetLandscapeCollisionMipLevel ${params.landscapeName} ${params.collisionMipLevel}`);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
if (params.simpleCollision !== undefined) {
|
|
427
|
-
commands.push(`SetLandscapeSimpleCollision ${params.landscapeName} ${params.simpleCollision}`);
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
commands.push(`UpdateLandscapeCollision ${params.landscapeName}`);
|
|
431
|
-
|
|
432
|
-
await this.bridge.executeConsoleCommands(commands);
|
|
433
|
-
|
|
434
|
-
return { success: true, message: 'Landscape collision updated' };
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
// Retopologize landscape
|
|
438
|
-
async retopologizeLandscape(params: {
|
|
439
|
-
landscapeName: string;
|
|
440
|
-
targetTriangleCount?: number;
|
|
441
|
-
preserveDetails?: boolean;
|
|
442
|
-
}): Promise<StandardActionResponse> {
|
|
443
|
-
const commands: string[] = [];
|
|
444
|
-
|
|
445
|
-
if (params.targetTriangleCount !== undefined) {
|
|
446
|
-
commands.push(`SetRetopologizeTarget ${params.targetTriangleCount}`);
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
if (params.preserveDetails !== undefined) {
|
|
450
|
-
commands.push(`SetRetopologizePreserveDetails ${params.preserveDetails}`);
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
commands.push(`RetopologizeLandscape ${params.landscapeName}`);
|
|
454
|
-
|
|
455
|
-
await this.bridge.executeConsoleCommands(commands);
|
|
456
|
-
|
|
457
|
-
return { success: true, message: 'Landscape retopologized' };
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
// Create water body
|
|
461
|
-
async createWaterBody(params: {
|
|
462
|
-
type: 'Ocean' | 'Lake' | 'River' | 'Stream';
|
|
463
|
-
name: string;
|
|
464
|
-
location?: [number, number, number];
|
|
465
|
-
size?: [number, number];
|
|
466
|
-
depth?: number;
|
|
467
|
-
}): Promise<StandardActionResponse> {
|
|
468
|
-
const loc = params.location || [0, 0, 0];
|
|
469
|
-
const size = params.size || [1000, 1000];
|
|
470
|
-
const depth = params.depth || 100;
|
|
471
|
-
|
|
472
|
-
const command = `CreateWaterBody ${params.type} ${params.name} ${loc.join(' ')} ${size.join(' ')} ${depth}`;
|
|
473
|
-
|
|
474
|
-
return this.bridge.executeConsoleCommand(command);
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
// World Partition support for landscapes (UE 5.6)
|
|
478
|
-
async configureWorldPartition(params: {
|
|
479
|
-
landscapeName: string;
|
|
480
|
-
enableSpatialLoading?: boolean;
|
|
481
|
-
runtimeGrid?: string;
|
|
482
|
-
dataLayers?: string[];
|
|
483
|
-
streamingDistance?: number;
|
|
484
|
-
}): Promise<StandardActionResponse> {
|
|
485
|
-
if (!this.automationBridge) {
|
|
486
|
-
throw new Error('Automation Bridge not available. World Partition operations require plugin support.');
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
try {
|
|
490
|
-
const response = await this.automationBridge.sendAutomationRequest('configure_landscape_world_partition', {
|
|
491
|
-
landscapeName: params.landscapeName,
|
|
492
|
-
enableSpatialLoading: params.enableSpatialLoading,
|
|
493
|
-
runtimeGrid: params.runtimeGrid || '',
|
|
494
|
-
dataLayers: params.dataLayers || [],
|
|
495
|
-
streamingDistance: params.streamingDistance
|
|
496
|
-
}, {
|
|
497
|
-
timeoutMs: 60000
|
|
498
|
-
});
|
|
499
|
-
|
|
500
|
-
if (response.success === false) {
|
|
501
|
-
return {
|
|
502
|
-
success: false,
|
|
503
|
-
error: response.error || response.message || 'World Partition configuration failed'
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
return {
|
|
508
|
-
success: true,
|
|
509
|
-
message: response.message || 'World Partition configured',
|
|
510
|
-
changes: response.changes
|
|
511
|
-
} as StandardActionResponse;
|
|
512
|
-
} catch (err) {
|
|
513
|
-
return { success: false, error: `Failed to configure World Partition: ${err instanceof Error ? err.message : String(err)}` };
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
// Set landscape data layers (UE 5.6)
|
|
518
|
-
async setDataLayers(params: {
|
|
519
|
-
landscapeName: string;
|
|
520
|
-
dataLayerNames: string[];
|
|
521
|
-
operation: 'add' | 'remove' | 'set';
|
|
522
|
-
}): Promise<StandardActionResponse> {
|
|
523
|
-
try {
|
|
524
|
-
const commands = [];
|
|
525
|
-
|
|
526
|
-
// Use console commands for data layer management
|
|
527
|
-
if (params.operation === 'set' || params.operation === 'add') {
|
|
528
|
-
for (const layerName of params.dataLayerNames) {
|
|
529
|
-
commands.push(`wp.Runtime.SetDataLayerRuntimeState Loaded ${layerName}`);
|
|
530
|
-
}
|
|
531
|
-
} else if (params.operation === 'remove') {
|
|
532
|
-
for (const layerName of params.dataLayerNames) {
|
|
533
|
-
commands.push(`wp.Runtime.SetDataLayerRuntimeState Unloaded ${layerName}`);
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
// Execute commands
|
|
538
|
-
await this.bridge.executeConsoleCommands(commands);
|
|
539
|
-
|
|
540
|
-
return {
|
|
541
|
-
success: true,
|
|
542
|
-
message: `Data layers ${params.operation === 'add' ? 'added' : params.operation === 'remove' ? 'removed' : 'set'} for landscape`,
|
|
543
|
-
layers: params.dataLayerNames
|
|
544
|
-
} as StandardActionResponse;
|
|
545
|
-
} catch (err) {
|
|
546
|
-
return { success: false, error: `Failed to manage data layers: ${err}` };
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
// Configure landscape streaming cells (UE 5.6 World Partition)
|
|
551
|
-
async configureStreamingCells(params: {
|
|
552
|
-
landscapeName: string;
|
|
553
|
-
cellSize?: number;
|
|
554
|
-
loadingRange?: number;
|
|
555
|
-
enableHLOD?: boolean;
|
|
556
|
-
}): Promise<StandardActionResponse> {
|
|
557
|
-
const commands = [];
|
|
558
|
-
|
|
559
|
-
// World Partition runtime commands
|
|
560
|
-
if (params.loadingRange !== undefined) {
|
|
561
|
-
commands.push(`wp.Runtime.OverrideRuntimeSpatialHashLoadingRange -grid=0 -range=${params.loadingRange}`);
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
if (params.enableHLOD !== undefined) {
|
|
565
|
-
commands.push(`wp.Runtime.HLOD ${params.enableHLOD ? '1' : '0'}`);
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
// Debug visualization commands
|
|
569
|
-
commands.push('wp.Runtime.ToggleDrawRuntimeHash2D'); // Show 2D grid
|
|
570
|
-
|
|
571
|
-
try {
|
|
572
|
-
await this.bridge.executeConsoleCommands(commands);
|
|
573
|
-
|
|
574
|
-
return {
|
|
575
|
-
success: true,
|
|
576
|
-
message: 'Streaming cells configured for World Partition',
|
|
577
|
-
settings: {
|
|
578
|
-
cellSize: params.cellSize,
|
|
579
|
-
loadingRange: params.loadingRange,
|
|
580
|
-
hlod: params.enableHLOD
|
|
581
|
-
}
|
|
582
|
-
} as StandardActionResponse;
|
|
583
|
-
} catch (err) {
|
|
584
|
-
return { success: false, error: `Failed to configure streaming cells: ${err}` };
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
// Modify landscape heightmap
|
|
589
|
-
async modifyHeightmap(params: {
|
|
590
|
-
landscapeName: string;
|
|
591
|
-
heightData: number[];
|
|
592
|
-
minX: number;
|
|
593
|
-
minY: number;
|
|
594
|
-
maxX: number;
|
|
595
|
-
maxY: number;
|
|
596
|
-
updateNormals?: boolean;
|
|
597
|
-
}): Promise<StandardActionResponse> {
|
|
598
|
-
if (!this.automationBridge) {
|
|
599
|
-
throw new Error('Automation Bridge not available. Landscape operations require plugin support.');
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
const { landscapeName, heightData, minX, minY, maxX, maxY } = params;
|
|
603
|
-
|
|
604
|
-
if (!landscapeName) {
|
|
605
|
-
return { success: false, error: 'Landscape name is required' };
|
|
606
|
-
}
|
|
607
|
-
if (!heightData || !Array.isArray(heightData) || heightData.length === 0) {
|
|
608
|
-
return { success: false, error: 'heightData array is required' };
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
const width = maxX - minX + 1;
|
|
612
|
-
const height = maxY - minY + 1;
|
|
613
|
-
if (heightData.length !== width * height) {
|
|
614
|
-
return {
|
|
615
|
-
success: false,
|
|
616
|
-
error: `Height data length (${heightData.length}) does not match region dimensions (${width}x${height} = ${width * height})`
|
|
617
|
-
};
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
try {
|
|
621
|
-
const response = await this.automationBridge.sendAutomationRequest('modify_heightmap', {
|
|
622
|
-
landscapeName,
|
|
623
|
-
heightData,
|
|
624
|
-
minX,
|
|
625
|
-
minY,
|
|
626
|
-
maxX,
|
|
627
|
-
maxY,
|
|
628
|
-
updateNormals: params.updateNormals ?? true
|
|
629
|
-
}, {
|
|
630
|
-
timeoutMs: 60000
|
|
631
|
-
});
|
|
632
|
-
|
|
633
|
-
if (response.success === false) {
|
|
634
|
-
return {
|
|
635
|
-
success: false,
|
|
636
|
-
error: response.error || response.message || 'Failed to modify heightmap'
|
|
637
|
-
};
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
return {
|
|
641
|
-
success: true,
|
|
642
|
-
message: response.message || 'Heightmap modified successfully'
|
|
643
|
-
} as StandardActionResponse;
|
|
644
|
-
} catch (err) {
|
|
645
|
-
return { success: false, error: `Failed to modify heightmap: ${err instanceof Error ? err.message : String(err)}` };
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
|