soft-ue-cli 1.3.2__tar.gz → 1.4.0__tar.gz
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.
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/PKG-INFO +1 -1
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/pyproject.toml +1 -1
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/__init__.py +1 -1
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/__main__.py +55 -4
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/SoftUEBridgeModule.cpp +2 -0
- soft_ue_cli-1.4.0/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/GetPropertyTool.cpp +123 -0
- soft_ue_cli-1.4.0/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/GetPropertyTool.h +17 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/QueryLevelTool.cpp +109 -5
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/QueryLevelTool.h +4 -1
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Asset/DeleteAssetTool.cpp +46 -1
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Blueprint/QueryBlueprintGraphTool.cpp +54 -1
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/AddGraphNodeTool.cpp +84 -16
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/CreateAssetTool.cpp +26 -3
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/ModifyInterfaceTool.cpp +55 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/AddGraphNodeTool.h +3 -2
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/.gitignore +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/LICENSE +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/client.py +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/discovery.py +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/github.py +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/SoftUEBridge.uplugin +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Protocol/BridgeTypes.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Server/BridgeServer.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Subsystem/SoftUEBridgeSubsystem.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/BridgeToolBase.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/BridgeToolRegistry.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/BridgeToolResult.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/CallFunctionTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/CallFunctionTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/CaptureViewportTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/CaptureViewportTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/ConsoleVarTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/ConsoleVarTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/GetLogsTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/GetLogsTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/SetPropertyTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/SetPropertyTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/SpawnActorTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/SpawnActorTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/TriggerInputTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Private/Tools/TriggerInputTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Protocol/BridgeTypes.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Server/BridgeServer.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/SoftUEBridgeModule.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Subsystem/SoftUEBridgeSubsystem.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Tools/BridgeToolBase.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Tools/BridgeToolRegistry.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/Public/Tools/BridgeToolResult.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridge/SoftUEBridge.Build.cs +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/SoftUEBridgeEditorModule.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Analysis/ClassHierarchyTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Asset/GetAssetDiffTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Asset/GetAssetPreviewTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Asset/OpenAssetTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Asset/QueryAssetTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Blueprint/QueryBlueprintTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Build/BuildAndRelaunchTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Build/TriggerLiveCodingTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Editor/CaptureScreenshotTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Material/QueryMaterialTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/PIE/PieSessionTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Performance/InsightsAnalyzeTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Performance/InsightsCaptureTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Performance/InsightsListTracesTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Project/ProjectInfoTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/References/FindReferencesTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Scripting/RunPythonScriptTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/StateTree/AddStateTreeStateTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/StateTree/AddStateTreeTaskTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/StateTree/AddStateTreeTransitionTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/StateTree/QueryStateTreeTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/StateTree/RemoveStateTreeStateTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Widget/InspectRuntimeWidgetsTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Widget/WidgetBlueprintTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Widget/WidgetToolUtils.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Widget/WidgetToolUtils.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/AddComponentTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/AddDataTableRowTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/AddWidgetTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/ConnectGraphPinsTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/DisconnectGraphPinTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/RemoveGraphNodeTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/SetNodePositionTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/SetPropertyTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Tools/Write/SpawnActorTool.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/UI/BridgeToolbarExtension.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Utils/BridgeAssetModifier.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Utils/BridgeGraphLayoutUtil.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Private/Utils/BridgePropertySerializer.cpp +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/SoftUEBridgeEditorModule.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Analysis/ClassHierarchyTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Asset/DeleteAssetTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Asset/GetAssetDiffTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Asset/GetAssetPreviewTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Asset/OpenAssetTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Asset/QueryAssetTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Blueprint/QueryBlueprintGraphTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Blueprint/QueryBlueprintTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Build/BuildAndRelaunchTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Build/TriggerLiveCodingTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Editor/CaptureScreenshotTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Material/QueryMaterialTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/PIE/PieSessionTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Performance/InsightsAnalyzeTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Performance/InsightsCaptureTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Performance/InsightsListTracesTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Project/ProjectInfoTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/References/FindReferencesTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Scripting/RunPythonScriptTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/StateTree/AddStateTreeStateTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/StateTree/AddStateTreeTaskTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/StateTree/AddStateTreeTransitionTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/StateTree/QueryStateTreeTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/StateTree/RemoveStateTreeStateTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Widget/InspectRuntimeWidgetsTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Widget/WidgetBlueprintTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/AddComponentTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/AddDataTableRowTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/AddWidgetTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/ConnectGraphPinsTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/CreateAssetTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/DisconnectGraphPinTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/EditorSetPropertyTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/EditorSpawnActorTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/ModifyInterfaceTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/RemoveGraphNodeTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Tools/Write/SetNodePositionTool.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/UI/BridgeToolbarExtension.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Utils/BridgeAssetModifier.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Utils/BridgeGraphLayoutUtil.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/Public/Utils/BridgePropertySerializer.h +0 -0
- {soft_ue_cli-1.3.2 → soft_ue_cli-1.4.0}/soft_ue_cli/plugin_data/SoftUEBridge/Source/SoftUEBridgeEditor/SoftUEBridgeEditor.Build.cs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: soft-ue-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.0
|
|
4
4
|
Summary: CLI tool for controlling Unreal Engine via soft-ue-bridge plugin
|
|
5
5
|
Project-URL: Homepage, https://github.com/softdaddy-o/soft-ue-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/softdaddy-o/soft-ue-cli
|
|
@@ -67,6 +67,10 @@ def cmd_query_level(args: argparse.Namespace) -> None:
|
|
|
67
67
|
arguments["tag_filter"] = args.tag
|
|
68
68
|
if args.components:
|
|
69
69
|
arguments["include_components"] = True
|
|
70
|
+
if args.include_properties or args.property_filter:
|
|
71
|
+
arguments["include_properties"] = True
|
|
72
|
+
if args.property_filter:
|
|
73
|
+
arguments["property_filter"] = args.property_filter
|
|
70
74
|
_print_json(call_tool("query-level", arguments))
|
|
71
75
|
|
|
72
76
|
|
|
@@ -93,6 +97,18 @@ def cmd_set_property(args: argparse.Namespace) -> None:
|
|
|
93
97
|
)
|
|
94
98
|
|
|
95
99
|
|
|
100
|
+
def cmd_get_property(args: argparse.Namespace) -> None:
|
|
101
|
+
_print_json(
|
|
102
|
+
call_tool(
|
|
103
|
+
"get-property",
|
|
104
|
+
{
|
|
105
|
+
"actor_name": args.actor_name,
|
|
106
|
+
"property_name": args.property_name,
|
|
107
|
+
},
|
|
108
|
+
)
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
96
112
|
def cmd_get_logs(args: argparse.Namespace) -> None:
|
|
97
113
|
arguments: dict = {"lines": args.lines}
|
|
98
114
|
if args.filter:
|
|
@@ -802,6 +818,8 @@ def cmd_create_asset(args: argparse.Namespace) -> None:
|
|
|
802
818
|
}
|
|
803
819
|
if args.parent_class:
|
|
804
820
|
arguments["parent_class"] = args.parent_class
|
|
821
|
+
if args.skeleton:
|
|
822
|
+
arguments["skeleton"] = args.skeleton
|
|
805
823
|
if args.row_struct:
|
|
806
824
|
arguments["row_struct"] = args.row_struct
|
|
807
825
|
_print_json(call_tool("create-asset", arguments))
|
|
@@ -1095,14 +1113,16 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1095
1113
|
description=(
|
|
1096
1114
|
"Returns a JSON array of actors in the current game world.\n"
|
|
1097
1115
|
"Each actor entry includes: name, class, location, rotation, scale, tags.\n"
|
|
1098
|
-
"Use --components to also include the actor's component list.\n
|
|
1116
|
+
"Use --components to also include the actor's component list.\n"
|
|
1117
|
+
"Use --include-properties to inspect actor and component property values.\n\n"
|
|
1099
1118
|
"All filters are combined (AND logic). Wildcards (*) are supported in --search and --actor-name.\n\n"
|
|
1100
1119
|
"EXAMPLES:\n"
|
|
1101
1120
|
" List all actors: soft-ue-cli query-level\n"
|
|
1102
1121
|
" Find all lights: soft-ue-cli query-level --class-filter PointLight\n"
|
|
1103
1122
|
" Find actor by name: soft-ue-cli query-level --actor-name BP_Hero\n"
|
|
1104
1123
|
' Wildcard search: soft-ue-cli query-level --search "Enemy*"\n'
|
|
1105
|
-
" Tagged actors with components: soft-ue-cli query-level --tag hostile --components"
|
|
1124
|
+
" Tagged actors with components: soft-ue-cli query-level --tag hostile --components\n"
|
|
1125
|
+
" Actor with health properties: soft-ue-cli query-level --actor-name BP_Hero --include-properties --property-filter '*Health*'"
|
|
1106
1126
|
),
|
|
1107
1127
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
1108
1128
|
)
|
|
@@ -1113,6 +1133,14 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1113
1133
|
p_ql.add_argument("--search", metavar="TEXT", help="Search actor names/labels (supports * wildcard)")
|
|
1114
1134
|
p_ql.add_argument("--tag", metavar="TAG", help="Only return actors with this gameplay tag")
|
|
1115
1135
|
p_ql.add_argument("--components", action="store_true", help="Include component list for each actor")
|
|
1136
|
+
p_ql.add_argument(
|
|
1137
|
+
"--include-properties", action="store_true",
|
|
1138
|
+
help="Include actor and component properties (automatically enables --components)",
|
|
1139
|
+
)
|
|
1140
|
+
p_ql.add_argument(
|
|
1141
|
+
"--property-filter", metavar="PATTERN",
|
|
1142
|
+
help="Filter properties by name (wildcards supported, e.g., '*Health*'). Requires --include-properties.",
|
|
1143
|
+
)
|
|
1116
1144
|
p_ql.add_argument("--limit", type=int, default=100, metavar="N", help="Max actors to return (default: 100)")
|
|
1117
1145
|
p_ql.set_defaults(func=cmd_query_level)
|
|
1118
1146
|
|
|
@@ -1159,6 +1187,26 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1159
1187
|
p_sp.add_argument("value", help="New value as a string (UE reflection converts the type)")
|
|
1160
1188
|
p_sp.set_defaults(func=cmd_set_property)
|
|
1161
1189
|
|
|
1190
|
+
# get-property (runtime actors)
|
|
1191
|
+
p_gp = sub.add_parser(
|
|
1192
|
+
"get-property",
|
|
1193
|
+
help="Get a property value from a runtime actor or component using UE reflection.",
|
|
1194
|
+
description=(
|
|
1195
|
+
"Reads a UPROPERTY value from the named actor via UE's reflection system.\n"
|
|
1196
|
+
"For component properties, use dot notation: ComponentName.PropertyName\n\n"
|
|
1197
|
+
"Returns the property value as a string along with its type.\n\n"
|
|
1198
|
+
"EXAMPLES:\n"
|
|
1199
|
+
" Actor property: soft-ue-cli get-property PointLight_0 Intensity\n"
|
|
1200
|
+
" Component property: soft-ue-cli get-property BP_Hero LightComponent.Intensity\n"
|
|
1201
|
+
" Boolean: soft-ue-cli get-property BP_Enemy bIsHostile\n"
|
|
1202
|
+
" Vector: soft-ue-cli get-property BP_Hero RelativeScale3D"
|
|
1203
|
+
),
|
|
1204
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
1205
|
+
)
|
|
1206
|
+
p_gp.add_argument("actor_name", help="Actor name or label as shown in query-level output")
|
|
1207
|
+
p_gp.add_argument("property_name", help="Property name, or ComponentName.PropertyName for component properties")
|
|
1208
|
+
p_gp.set_defaults(func=cmd_get_property)
|
|
1209
|
+
|
|
1162
1210
|
# get-logs
|
|
1163
1211
|
p_gl = sub.add_parser(
|
|
1164
1212
|
"get-logs",
|
|
@@ -2110,13 +2158,15 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
2110
2158
|
"EXAMPLES:\n"
|
|
2111
2159
|
" soft-ue-cli create-asset /Game/Blueprints/BP_NewActor Blueprint --parent-class Actor\n"
|
|
2112
2160
|
" soft-ue-cli create-asset /Game/Materials/M_NewMat Material\n"
|
|
2113
|
-
" soft-ue-cli create-asset /Game/Data/DT_Items DataTable --row-struct /Game/Structs/S_Item"
|
|
2161
|
+
" soft-ue-cli create-asset /Game/Data/DT_Items DataTable --row-struct /Game/Structs/S_Item\n"
|
|
2162
|
+
" soft-ue-cli create-asset /Game/Anim/ABP_Hero AnimBlueprint --skeleton /Game/Characters/SK_Mannequin"
|
|
2114
2163
|
),
|
|
2115
2164
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
2116
2165
|
)
|
|
2117
2166
|
p_cas.add_argument("asset_path", help="Full asset path including name (e.g. /Game/Blueprints/BP_NewActor)")
|
|
2118
2167
|
p_cas.add_argument("asset_class", help="Asset class (e.g. Blueprint, Material, DataTable, WidgetBlueprint)")
|
|
2119
2168
|
p_cas.add_argument("--parent-class", metavar="CLASS", help="Parent class for Blueprints (e.g. Actor, Character)")
|
|
2169
|
+
p_cas.add_argument("--skeleton", metavar="PATH", help="Skeleton asset path for AnimBlueprint (e.g. /Game/Characters/SK_Mannequin)")
|
|
2120
2170
|
p_cas.add_argument("--row-struct", metavar="PATH", help="Row struct path for DataTables")
|
|
2121
2171
|
p_cas.set_defaults(func=cmd_create_asset)
|
|
2122
2172
|
|
|
@@ -2126,10 +2176,11 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
2126
2176
|
|
|
2127
2177
|
p_k = sub.add_parser(
|
|
2128
2178
|
"query-ue-knowledge",
|
|
2129
|
-
help="Query
|
|
2179
|
+
help="Query the knowledge server for UE API docs and tutorials.",
|
|
2130
2180
|
description="Coming soon. Follow https://github.com/softdaddy-o/soft-ue-cli for updates.",
|
|
2131
2181
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
2132
2182
|
)
|
|
2183
|
+
p_k.add_argument("query", nargs="?", default=None, help="Natural language question about UE API or behavior")
|
|
2133
2184
|
p_k.set_defaults(func=cmd_knowledge)
|
|
2134
2185
|
|
|
2135
2186
|
# -------------------------------------------------------------------------
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
#include "Tools/ConsoleVarTool.h"
|
|
10
10
|
#include "Tools/SpawnActorTool.h"
|
|
11
11
|
#include "Tools/SetPropertyTool.h"
|
|
12
|
+
#include "Tools/GetPropertyTool.h"
|
|
12
13
|
#include "Tools/TriggerInputTool.h"
|
|
13
14
|
|
|
14
15
|
DEFINE_LOG_CATEGORY(LogSoftUEBridge);
|
|
@@ -25,6 +26,7 @@ void FSoftUEBridgeModule::StartupModule()
|
|
|
25
26
|
Registry.RegisterToolClass<USetConsoleVarTool>();
|
|
26
27
|
Registry.RegisterToolClass<USpawnActorTool>();
|
|
27
28
|
Registry.RegisterToolClass<USetPropertyTool>();
|
|
29
|
+
Registry.RegisterToolClass<UGetPropertyTool>();
|
|
28
30
|
Registry.RegisterToolClass<UTriggerInputTool>();
|
|
29
31
|
|
|
30
32
|
UE_LOG(LogSoftUEBridge, Log, TEXT("Registered %d runtime bridge tools"), Registry.GetToolCount());
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Copyright soft-ue-expert. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
#include "Tools/GetPropertyTool.h"
|
|
4
|
+
#include "Tools/BridgeToolRegistry.h"
|
|
5
|
+
#include "SoftUEBridgeModule.h"
|
|
6
|
+
#include "Engine/World.h"
|
|
7
|
+
#include "GameFramework/Actor.h"
|
|
8
|
+
#include "Components/ActorComponent.h"
|
|
9
|
+
#include "EngineUtils.h"
|
|
10
|
+
#include "UObject/UnrealType.h"
|
|
11
|
+
|
|
12
|
+
#if !WITH_EDITOR
|
|
13
|
+
REGISTER_BRIDGE_TOOL(UGetPropertyTool)
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
FString UGetPropertyTool::GetToolDescription() const
|
|
17
|
+
{
|
|
18
|
+
return TEXT("Get a property value from an actor or its component using reflection. "
|
|
19
|
+
"Use dot notation for component properties: 'ComponentName.PropertyName'.");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
TMap<FString, FBridgeSchemaProperty> UGetPropertyTool::GetInputSchema() const
|
|
23
|
+
{
|
|
24
|
+
TMap<FString, FBridgeSchemaProperty> S;
|
|
25
|
+
|
|
26
|
+
auto Prop = [](const FString& Type, const FString& Desc, bool bReq = false) {
|
|
27
|
+
FBridgeSchemaProperty P;
|
|
28
|
+
P.Type = Type; P.Description = Desc; P.bRequired = bReq;
|
|
29
|
+
return P;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
S.Add(TEXT("actor_name"), Prop(TEXT("string"), TEXT("Actor name or label"), true));
|
|
33
|
+
S.Add(TEXT("property_name"), Prop(TEXT("string"), TEXT("Property name, or 'Component.Property' for component properties"), true));
|
|
34
|
+
S.Add(TEXT("world"), Prop(TEXT("string"), TEXT("World context: 'editor' (editor scene), 'pie' (Play-In-Editor), 'game' (packaged build only). Omit to use the first available world.")));
|
|
35
|
+
|
|
36
|
+
return S;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
FBridgeToolResult UGetPropertyTool::Execute(const TSharedPtr<FJsonObject>& Args, const FBridgeToolContext& Ctx)
|
|
40
|
+
{
|
|
41
|
+
const FString ActorName = GetStringArgOrDefault(Args, TEXT("actor_name"));
|
|
42
|
+
const FString PropertyName = GetStringArgOrDefault(Args, TEXT("property_name"));
|
|
43
|
+
|
|
44
|
+
UWorld* World = FindWorldByType(GetStringArgOrDefault(Args, TEXT("world")));
|
|
45
|
+
if (!World)
|
|
46
|
+
{
|
|
47
|
+
return FBridgeToolResult::Error(TEXT("No world available. Specify 'world': 'editor', 'pie', or 'game'."));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Find actor
|
|
51
|
+
AActor* Actor = nullptr;
|
|
52
|
+
for (TActorIterator<AActor> It(World); It; ++It)
|
|
53
|
+
{
|
|
54
|
+
AActor* A = *It;
|
|
55
|
+
if (!A) continue;
|
|
56
|
+
if (MatchesWildcard(A->GetName(), ActorName) || MatchesWildcard(GetActorLabelSafe(A), ActorName))
|
|
57
|
+
{
|
|
58
|
+
Actor = A;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!Actor)
|
|
63
|
+
{
|
|
64
|
+
return FBridgeToolResult::Error(FString::Printf(TEXT("Actor '%s' not found"), *ActorName));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Resolve target object (actor or component via dot notation)
|
|
68
|
+
UObject* TargetObject = Actor;
|
|
69
|
+
FString PropKey = PropertyName;
|
|
70
|
+
|
|
71
|
+
int32 DotIdx;
|
|
72
|
+
if (PropertyName.FindChar(TEXT('.'), DotIdx))
|
|
73
|
+
{
|
|
74
|
+
const FString CompName = PropertyName.Left(DotIdx);
|
|
75
|
+
PropKey = PropertyName.Mid(DotIdx + 1);
|
|
76
|
+
|
|
77
|
+
TArray<UActorComponent*> Components;
|
|
78
|
+
Actor->GetComponents(Components);
|
|
79
|
+
for (UActorComponent* C : Components)
|
|
80
|
+
{
|
|
81
|
+
if (C && C->GetName().Equals(CompName, ESearchCase::IgnoreCase))
|
|
82
|
+
{
|
|
83
|
+
TargetObject = C;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (TargetObject == Actor)
|
|
89
|
+
{
|
|
90
|
+
return FBridgeToolResult::Error(
|
|
91
|
+
FString::Printf(TEXT("Component '%s' not found on '%s'"), *CompName, *ActorName));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Find and read the property
|
|
96
|
+
for (TFieldIterator<FProperty> PropIt(TargetObject->GetClass()); PropIt; ++PropIt)
|
|
97
|
+
{
|
|
98
|
+
FProperty* Prop = *PropIt;
|
|
99
|
+
if (!Prop) continue;
|
|
100
|
+
if (!Prop->GetName().Equals(PropKey, ESearchCase::IgnoreCase)) continue;
|
|
101
|
+
|
|
102
|
+
void* ValuePtr = Prop->ContainerPtrToValuePtr<void>(TargetObject);
|
|
103
|
+
if (!ValuePtr)
|
|
104
|
+
{
|
|
105
|
+
return FBridgeToolResult::Error(TEXT("Failed to get property pointer"));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
FString ExportedValue;
|
|
109
|
+
Prop->ExportText_Direct(ExportedValue, ValuePtr, ValuePtr, TargetObject, PPF_None);
|
|
110
|
+
|
|
111
|
+
TSharedPtr<FJsonObject> Result = MakeShareable(new FJsonObject);
|
|
112
|
+
Result->SetStringField(TEXT("actor"), Actor->GetName());
|
|
113
|
+
Result->SetStringField(TEXT("property"), PropertyName);
|
|
114
|
+
Result->SetStringField(TEXT("value"), ExportedValue);
|
|
115
|
+
Result->SetStringField(TEXT("type"), Prop->GetCPPType());
|
|
116
|
+
|
|
117
|
+
UE_LOG(LogSoftUEBridge, Log, TEXT("get-property: %s.%s = %s"), *ActorName, *PropertyName, *ExportedValue);
|
|
118
|
+
return FBridgeToolResult::Json(Result);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return FBridgeToolResult::Error(
|
|
122
|
+
FString::Printf(TEXT("Property '%s' not found on %s"), *PropKey, *TargetObject->GetClass()->GetName()));
|
|
123
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Copyright soft-ue-expert. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
#pragma once
|
|
4
|
+
#include "Tools/BridgeToolBase.h"
|
|
5
|
+
#include "GetPropertyTool.generated.h"
|
|
6
|
+
|
|
7
|
+
UCLASS()
|
|
8
|
+
class UGetPropertyTool : public UBridgeToolBase
|
|
9
|
+
{
|
|
10
|
+
GENERATED_BODY()
|
|
11
|
+
public:
|
|
12
|
+
virtual FString GetToolName() const override { return TEXT("get-property"); }
|
|
13
|
+
virtual FString GetToolDescription() const override;
|
|
14
|
+
virtual TMap<FString, FBridgeSchemaProperty> GetInputSchema() const override;
|
|
15
|
+
virtual TArray<FString> GetRequiredParams() const override { return {TEXT("actor_name"), TEXT("property_name")}; }
|
|
16
|
+
virtual FBridgeToolResult Execute(const TSharedPtr<FJsonObject>& Args, const FBridgeToolContext& Ctx) override;
|
|
17
|
+
};
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
#include "GameFramework/Actor.h"
|
|
8
8
|
#include "Components/ActorComponent.h"
|
|
9
9
|
#include "EngineUtils.h"
|
|
10
|
+
#include "UObject/UnrealType.h"
|
|
10
11
|
|
|
11
12
|
#if !WITH_EDITOR
|
|
12
13
|
REGISTER_BRIDGE_TOOL(UQueryLevelTool)
|
|
@@ -16,7 +17,8 @@ FString UQueryLevelTool::GetToolDescription() const
|
|
|
16
17
|
{
|
|
17
18
|
return TEXT("List and inspect actors in the current game world. "
|
|
18
19
|
"Optionally filter by class, tag, or name pattern. "
|
|
19
|
-
"Use actor_name to get detailed info about a specific actor."
|
|
20
|
+
"Use actor_name to get detailed info about a specific actor. "
|
|
21
|
+
"Use include_properties to inspect actor and component property values.");
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
TMap<FString, FBridgeSchemaProperty> UQueryLevelTool::GetInputSchema() const
|
|
@@ -37,6 +39,8 @@ TMap<FString, FBridgeSchemaProperty> UQueryLevelTool::GetInputSchema() const
|
|
|
37
39
|
S.Add(TEXT("include_components"),Prop(TEXT("boolean"), TEXT("Include component list (default: false)")));
|
|
38
40
|
S.Add(TEXT("include_transform"), Prop(TEXT("boolean"), TEXT("Include transforms (default: true)")));
|
|
39
41
|
S.Add(TEXT("include_hidden"), Prop(TEXT("boolean"), TEXT("Include hidden actors (default: false)")));
|
|
42
|
+
S.Add(TEXT("include_properties"),Prop(TEXT("boolean"), TEXT("Include actor and component properties (default: false). Automatically enables component inclusion.")));
|
|
43
|
+
S.Add(TEXT("property_filter"), Prop(TEXT("string"), TEXT("Filter properties by name (wildcards supported, e.g., '*Health*'). Only used when include_properties is true.")));
|
|
40
44
|
S.Add(TEXT("limit"), Prop(TEXT("integer"), TEXT("Max results (default: 100)")));
|
|
41
45
|
S.Add(TEXT("world"), Prop(TEXT("string"), TEXT("World context: 'editor' (editor scene), 'pie' (Play-In-Editor), 'game' (packaged build only). Omit to use the first available world.")));
|
|
42
46
|
|
|
@@ -55,9 +59,11 @@ FBridgeToolResult UQueryLevelTool::Execute(const TSharedPtr<FJsonObject>& Args,
|
|
|
55
59
|
const FString ClassFilter = GetStringArgOrDefault(Args, TEXT("class_filter"));
|
|
56
60
|
const FString TagFilter = GetStringArgOrDefault(Args, TEXT("tag_filter"));
|
|
57
61
|
const FString SearchFilter = GetStringArgOrDefault(Args, TEXT("search"));
|
|
58
|
-
const bool
|
|
62
|
+
const bool bProperties = GetBoolArgOrDefault(Args, TEXT("include_properties"), false);
|
|
63
|
+
const bool bComponents = GetBoolArgOrDefault(Args, TEXT("include_components"), false) || bProperties;
|
|
59
64
|
const bool bTransform = GetBoolArgOrDefault(Args, TEXT("include_transform"), true);
|
|
60
65
|
const bool bHidden = GetBoolArgOrDefault(Args, TEXT("include_hidden"), false);
|
|
66
|
+
const FString PropertyFilter = GetStringArgOrDefault(Args, TEXT("property_filter"));
|
|
61
67
|
const int32 Limit = GetIntArgOrDefault(Args, TEXT("limit"), 100);
|
|
62
68
|
|
|
63
69
|
// Detail mode: find one specific actor
|
|
@@ -70,7 +76,7 @@ FBridgeToolResult UQueryLevelTool::Execute(const TSharedPtr<FJsonObject>& Args,
|
|
|
70
76
|
if (MatchesWildcard(Actor->GetName(), ActorName) ||
|
|
71
77
|
MatchesWildcard(GetActorLabelSafe(Actor), ActorName))
|
|
72
78
|
{
|
|
73
|
-
return FBridgeToolResult::Json(ActorToJson(Actor, true, true));
|
|
79
|
+
return FBridgeToolResult::Json(ActorToJson(Actor, true, true, bProperties, PropertyFilter));
|
|
74
80
|
}
|
|
75
81
|
}
|
|
76
82
|
return FBridgeToolResult::Error(FString::Printf(TEXT("Actor '%s' not found"), *ActorName));
|
|
@@ -108,7 +114,7 @@ FBridgeToolResult UQueryLevelTool::Execute(const TSharedPtr<FJsonObject>& Args,
|
|
|
108
114
|
|
|
109
115
|
if (ActorsArr.Num() >= Limit) { bLimitReached = true; break; }
|
|
110
116
|
|
|
111
|
-
TSharedPtr<FJsonObject> ActorJson = ActorToJson(Actor, bComponents, bTransform);
|
|
117
|
+
TSharedPtr<FJsonObject> ActorJson = ActorToJson(Actor, bComponents, bTransform, bProperties, PropertyFilter);
|
|
112
118
|
ActorsArr.Add(MakeShareable(new FJsonValueObject(ActorJson)));
|
|
113
119
|
}
|
|
114
120
|
|
|
@@ -121,7 +127,7 @@ FBridgeToolResult UQueryLevelTool::Execute(const TSharedPtr<FJsonObject>& Args,
|
|
|
121
127
|
return FBridgeToolResult::Json(Result);
|
|
122
128
|
}
|
|
123
129
|
|
|
124
|
-
TSharedPtr<FJsonObject> UQueryLevelTool::ActorToJson(AActor* Actor, bool bComponents, bool bTransform) const
|
|
130
|
+
TSharedPtr<FJsonObject> UQueryLevelTool::ActorToJson(AActor* Actor, bool bComponents, bool bTransform, bool bProperties, const FString& PropertyFilter) const
|
|
125
131
|
{
|
|
126
132
|
TSharedPtr<FJsonObject> J = MakeShareable(new FJsonObject);
|
|
127
133
|
J->SetStringField(TEXT("name"), Actor->GetName());
|
|
@@ -144,6 +150,12 @@ TSharedPtr<FJsonObject> UQueryLevelTool::ActorToJson(AActor* Actor, bool bCompon
|
|
|
144
150
|
J->SetArrayField(TEXT("tags"), Tags);
|
|
145
151
|
}
|
|
146
152
|
|
|
153
|
+
// Actor-level properties
|
|
154
|
+
if (bProperties)
|
|
155
|
+
{
|
|
156
|
+
J->SetArrayField(TEXT("properties"), CollectProperties(Actor, PropertyFilter));
|
|
157
|
+
}
|
|
158
|
+
|
|
147
159
|
if (bComponents)
|
|
148
160
|
{
|
|
149
161
|
TArray<TSharedPtr<FJsonValue>> Comps;
|
|
@@ -156,6 +168,13 @@ TSharedPtr<FJsonObject> UQueryLevelTool::ActorToJson(AActor* Actor, bool bCompon
|
|
|
156
168
|
CJ->SetStringField(TEXT("name"), C->GetName());
|
|
157
169
|
CJ->SetStringField(TEXT("class"), C->GetClass()->GetName());
|
|
158
170
|
CJ->SetBoolField(TEXT("is_active"), C->IsActive());
|
|
171
|
+
|
|
172
|
+
// Component-level properties
|
|
173
|
+
if (bProperties)
|
|
174
|
+
{
|
|
175
|
+
CJ->SetArrayField(TEXT("properties"), CollectProperties(C, PropertyFilter));
|
|
176
|
+
}
|
|
177
|
+
|
|
159
178
|
Comps.Add(MakeShareable(new FJsonValueObject(CJ)));
|
|
160
179
|
}
|
|
161
180
|
J->SetArrayField(TEXT("components"), Comps);
|
|
@@ -164,6 +183,31 @@ TSharedPtr<FJsonObject> UQueryLevelTool::ActorToJson(AActor* Actor, bool bCompon
|
|
|
164
183
|
return J;
|
|
165
184
|
}
|
|
166
185
|
|
|
186
|
+
TArray<TSharedPtr<FJsonValue>> UQueryLevelTool::CollectProperties(UObject* Object, const FString& PropertyFilter) const
|
|
187
|
+
{
|
|
188
|
+
TArray<TSharedPtr<FJsonValue>> PropsArr;
|
|
189
|
+
for (TFieldIterator<FProperty> PropIt(Object->GetClass()); PropIt; ++PropIt)
|
|
190
|
+
{
|
|
191
|
+
FProperty* Prop = *PropIt;
|
|
192
|
+
if (!Prop) continue;
|
|
193
|
+
|
|
194
|
+
if (!PropertyFilter.IsEmpty() && !MatchesWildcard(Prop->GetName(), PropertyFilter))
|
|
195
|
+
{
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
void* ValuePtr = Prop->ContainerPtrToValuePtr<void>(Object);
|
|
200
|
+
if (!ValuePtr) continue;
|
|
201
|
+
|
|
202
|
+
TSharedPtr<FJsonObject> PropJson = PropertyToJson(Prop, ValuePtr, Object);
|
|
203
|
+
if (PropJson.IsValid())
|
|
204
|
+
{
|
|
205
|
+
PropsArr.Add(MakeShareable(new FJsonValueObject(PropJson)));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return PropsArr;
|
|
209
|
+
}
|
|
210
|
+
|
|
167
211
|
TSharedPtr<FJsonObject> UQueryLevelTool::TransformToJson(const FTransform& T) const
|
|
168
212
|
{
|
|
169
213
|
auto Vec3 = [](const FVector& V) {
|
|
@@ -186,3 +230,63 @@ TSharedPtr<FJsonObject> UQueryLevelTool::TransformToJson(const FTransform& T) co
|
|
|
186
230
|
J->SetObjectField(TEXT("scale"), Vec3(T.GetScale3D()));
|
|
187
231
|
return J;
|
|
188
232
|
}
|
|
233
|
+
|
|
234
|
+
TSharedPtr<FJsonObject> UQueryLevelTool::PropertyToJson(FProperty* Property, void* Container, UObject* Owner) const
|
|
235
|
+
{
|
|
236
|
+
if (!Property || !Container)
|
|
237
|
+
{
|
|
238
|
+
return nullptr;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
TSharedPtr<FJsonObject> PropJson = MakeShareable(new FJsonObject);
|
|
242
|
+
|
|
243
|
+
PropJson->SetStringField(TEXT("name"), Property->GetName());
|
|
244
|
+
PropJson->SetStringField(TEXT("type"), GetPropertyTypeString(Property));
|
|
245
|
+
|
|
246
|
+
FString Value;
|
|
247
|
+
Property->ExportText_Direct(Value, Container, Container, Owner, PPF_None);
|
|
248
|
+
PropJson->SetStringField(TEXT("value"), Value);
|
|
249
|
+
|
|
250
|
+
return PropJson;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
FString UQueryLevelTool::GetPropertyTypeString(FProperty* Property) const
|
|
254
|
+
{
|
|
255
|
+
if (!Property)
|
|
256
|
+
{
|
|
257
|
+
return TEXT("unknown");
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (Property->IsA<FBoolProperty>()) return TEXT("bool");
|
|
261
|
+
if (Property->IsA<FIntProperty>()) return TEXT("int32");
|
|
262
|
+
if (Property->IsA<FFloatProperty>()) return TEXT("float");
|
|
263
|
+
if (Property->IsA<FNameProperty>()) return TEXT("FName");
|
|
264
|
+
if (Property->IsA<FStrProperty>()) return TEXT("FString");
|
|
265
|
+
if (Property->IsA<FTextProperty>()) return TEXT("FText");
|
|
266
|
+
|
|
267
|
+
if (FObjectProperty* ObjectProp = CastField<FObjectProperty>(Property))
|
|
268
|
+
{
|
|
269
|
+
if (ObjectProp->PropertyClass)
|
|
270
|
+
{
|
|
271
|
+
return FString::Printf(TEXT("TObjectPtr<%s>"), *ObjectProp->PropertyClass->GetName());
|
|
272
|
+
}
|
|
273
|
+
return TEXT("TObjectPtr<UObject>");
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (FStructProperty* StructProp = CastField<FStructProperty>(Property))
|
|
277
|
+
{
|
|
278
|
+
if (StructProp->Struct)
|
|
279
|
+
{
|
|
280
|
+
return StructProp->Struct->GetName();
|
|
281
|
+
}
|
|
282
|
+
return TEXT("struct");
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (FArrayProperty* ArrayProp = CastField<FArrayProperty>(Property))
|
|
286
|
+
{
|
|
287
|
+
FString InnerType = GetPropertyTypeString(ArrayProp->Inner);
|
|
288
|
+
return FString::Printf(TEXT("TArray<%s>"), *InnerType);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return Property->GetClass()->GetName();
|
|
292
|
+
}
|
|
@@ -15,6 +15,9 @@ public:
|
|
|
15
15
|
virtual FBridgeToolResult Execute(const TSharedPtr<FJsonObject>& Args, const FBridgeToolContext& Ctx) override;
|
|
16
16
|
|
|
17
17
|
private:
|
|
18
|
-
TSharedPtr<FJsonObject> ActorToJson(AActor* Actor, bool bComponents, bool bTransform) const;
|
|
18
|
+
TSharedPtr<FJsonObject> ActorToJson(AActor* Actor, bool bComponents, bool bTransform, bool bProperties = false, const FString& PropertyFilter = TEXT("")) const;
|
|
19
19
|
TSharedPtr<FJsonObject> TransformToJson(const FTransform& T) const;
|
|
20
|
+
TArray<TSharedPtr<FJsonValue>> CollectProperties(UObject* Object, const FString& PropertyFilter) const;
|
|
21
|
+
TSharedPtr<FJsonObject> PropertyToJson(FProperty* Property, void* Container, UObject* Owner) const;
|
|
22
|
+
FString GetPropertyTypeString(FProperty* Property) const;
|
|
20
23
|
};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
// Copyright softdaddy-o 2024. All Rights Reserved.
|
|
2
2
|
|
|
3
3
|
#include "Tools/Asset/DeleteAssetTool.h"
|
|
4
|
+
#include "Utils/BridgeAssetModifier.h"
|
|
4
5
|
#include "SoftUEBridgeEditorModule.h"
|
|
5
6
|
#include "Engine/Blueprint.h"
|
|
6
7
|
#include "UObject/UObjectGlobals.h"
|
|
7
8
|
#include "EditorAssetLibrary.h"
|
|
9
|
+
#include "AssetRegistry/AssetRegistryModule.h"
|
|
8
10
|
|
|
9
11
|
FString UDeleteAssetTool::GetToolDescription() const
|
|
10
12
|
{
|
|
@@ -40,7 +42,50 @@ FBridgeToolResult UDeleteAssetTool::Execute(
|
|
|
40
42
|
UObject* Asset = UEditorAssetLibrary::LoadAsset(AssetPath);
|
|
41
43
|
if (!Asset)
|
|
42
44
|
{
|
|
43
|
-
|
|
45
|
+
// Check for phantom asset: registry has entry but LoadAsset fails
|
|
46
|
+
if (FBridgeAssetModifier::AssetExists(AssetPath))
|
|
47
|
+
{
|
|
48
|
+
UE_LOG(LogSoftUEBridgeEditor, Warning, TEXT("delete-asset: Phantom asset detected at %s (registry entry but not loadable). Cleaning up."), *AssetPath);
|
|
49
|
+
|
|
50
|
+
// Force rescan and retry load
|
|
51
|
+
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
|
|
52
|
+
TArray<FString> ScanPaths = { FPackageName::GetLongPackagePath(AssetPath) };
|
|
53
|
+
AssetRegistryModule.Get().ScanPathsSynchronous(ScanPaths, /*bForceRescan=*/true);
|
|
54
|
+
Asset = UEditorAssetLibrary::LoadAsset(AssetPath);
|
|
55
|
+
|
|
56
|
+
if (!Asset)
|
|
57
|
+
{
|
|
58
|
+
// Still can't load — remove the stale registry entry by rescanning
|
|
59
|
+
// Delete the on-disk package file if it exists
|
|
60
|
+
FString PackageFilename;
|
|
61
|
+
if (FPackageName::DoesPackageExist(AssetPath, &PackageFilename))
|
|
62
|
+
{
|
|
63
|
+
if (IFileManager::Get().Delete(*PackageFilename))
|
|
64
|
+
{
|
|
65
|
+
UE_LOG(LogSoftUEBridgeEditor, Log, TEXT("delete-asset: Deleted orphan package file: %s"), *PackageFilename);
|
|
66
|
+
}
|
|
67
|
+
else
|
|
68
|
+
{
|
|
69
|
+
UE_LOG(LogSoftUEBridgeEditor, Warning, TEXT("delete-asset: Failed to delete orphan package file: %s"), *PackageFilename);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Rescan to purge the registry entry
|
|
74
|
+
AssetRegistryModule.Get().ScanPathsSynchronous(ScanPaths, /*bForceRescan=*/true);
|
|
75
|
+
|
|
76
|
+
TSharedPtr<FJsonObject> Result = MakeShareable(new FJsonObject);
|
|
77
|
+
Result->SetStringField(TEXT("asset_path"), AssetPath);
|
|
78
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
79
|
+
Result->SetStringField(TEXT("message"), FString::Printf(TEXT("Phantom asset cleaned up: %s"), *AssetPath));
|
|
80
|
+
Result->SetBoolField(TEXT("was_phantom"), true);
|
|
81
|
+
return FBridgeToolResult::Json(Result);
|
|
82
|
+
}
|
|
83
|
+
// Rescan fixed the load — fall through to normal deletion
|
|
84
|
+
}
|
|
85
|
+
else
|
|
86
|
+
{
|
|
87
|
+
return FBridgeToolResult::Error(FString::Printf(TEXT("Asset not found: %s"), *AssetPath));
|
|
88
|
+
}
|
|
44
89
|
}
|
|
45
90
|
|
|
46
91
|
bool bIsBlueprint = Asset->IsA<UBlueprint>();
|
|
@@ -74,7 +74,7 @@ TMap<FString, FBridgeSchemaProperty> UQueryBlueprintGraphTool::GetInputSchema()
|
|
|
74
74
|
|
|
75
75
|
FBridgeSchemaProperty GraphType;
|
|
76
76
|
GraphType.Type = TEXT("string");
|
|
77
|
-
GraphType.Description = TEXT("Filter by graph type: 'event', 'function', 'macro', or for AnimBlueprints: 'anim_graph', 'state_machine', 'state', 'transition', 'blend_stack'");
|
|
77
|
+
GraphType.Description = TEXT("Filter by graph type: 'event', 'function', 'macro', 'interface', or for AnimBlueprints: 'anim_graph', 'state_machine', 'state', 'transition', 'blend_stack'");
|
|
78
78
|
GraphType.bRequired = false;
|
|
79
79
|
Schema.Add(TEXT("graph_type"), GraphType);
|
|
80
80
|
|
|
@@ -291,6 +291,25 @@ FBridgeToolResult UQueryBlueprintGraphTool::Execute(
|
|
|
291
291
|
}
|
|
292
292
|
}
|
|
293
293
|
|
|
294
|
+
// Interface implementation graphs
|
|
295
|
+
if (GraphTypeFilter.IsEmpty() || GraphTypeFilter == TEXT("interface"))
|
|
296
|
+
{
|
|
297
|
+
for (const FBPInterfaceDescription& InterfaceDesc : Blueprint->ImplementedInterfaces)
|
|
298
|
+
{
|
|
299
|
+
if (!InterfaceDesc.Interface) continue;
|
|
300
|
+
for (UEdGraph* Graph : InterfaceDesc.Graphs)
|
|
301
|
+
{
|
|
302
|
+
if (!Graph) continue;
|
|
303
|
+
if (!GraphNameFilter.IsEmpty() && Graph->GetName() != GraphNameFilter) continue;
|
|
304
|
+
TSharedPtr<FJsonObject> GraphJson = GraphToJson(Graph, TEXT("interface"), SerializeOptions, SearchFilter);
|
|
305
|
+
if (GraphJson.IsValid())
|
|
306
|
+
{
|
|
307
|
+
GraphsArray.Add(MakeShareable(new FJsonValueObject(GraphJson)));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
294
313
|
// Animation Blueprint specific graphs
|
|
295
314
|
if (bIsAnimBlueprint)
|
|
296
315
|
{
|
|
@@ -501,6 +520,25 @@ UEdGraphNode* UQueryBlueprintGraphTool::FindNodeByGuid(UBlueprint* Blueprint, co
|
|
|
501
520
|
}
|
|
502
521
|
}
|
|
503
522
|
|
|
523
|
+
// Search interface implementation graphs
|
|
524
|
+
for (const FBPInterfaceDescription& InterfaceDesc : Blueprint->ImplementedInterfaces)
|
|
525
|
+
{
|
|
526
|
+
if (!InterfaceDesc.Interface) continue;
|
|
527
|
+
for (UEdGraph* Graph : InterfaceDesc.Graphs)
|
|
528
|
+
{
|
|
529
|
+
if (!Graph) continue;
|
|
530
|
+
for (UEdGraphNode* Node : Graph->Nodes)
|
|
531
|
+
{
|
|
532
|
+
if (Node && Node->NodeGuid == NodeGuid)
|
|
533
|
+
{
|
|
534
|
+
OutGraphName = Graph->GetName();
|
|
535
|
+
OutGraphType = TEXT("interface");
|
|
536
|
+
return Node;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
504
542
|
return nullptr;
|
|
505
543
|
}
|
|
506
544
|
|
|
@@ -567,6 +605,21 @@ UEdGraph* UQueryBlueprintGraphTool::FindGraphByName(UBlueprint* Blueprint, const
|
|
|
567
605
|
}
|
|
568
606
|
}
|
|
569
607
|
|
|
608
|
+
// Search interface implementation graphs
|
|
609
|
+
for (const FBPInterfaceDescription& InterfaceDesc : Blueprint->ImplementedInterfaces)
|
|
610
|
+
{
|
|
611
|
+
if (!InterfaceDesc.Interface) continue;
|
|
612
|
+
for (UEdGraph* Graph : InterfaceDesc.Graphs)
|
|
613
|
+
{
|
|
614
|
+
if (!Graph) continue;
|
|
615
|
+
if (Graph->GetName().Equals(CallableName, ESearchCase::IgnoreCase))
|
|
616
|
+
{
|
|
617
|
+
OutGraphType = TEXT("interface");
|
|
618
|
+
return Graph;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
570
623
|
return nullptr;
|
|
571
624
|
}
|
|
572
625
|
|