64 lines
1.7 KiB
C++
64 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "MCPHandler.h"
|
|
#include "MCPAssets.h"
|
|
#include "MCPUtils.h"
|
|
#include "Animation/AnimBlueprint.h"
|
|
#include "AnimGraphNode_Base.h"
|
|
#include "AnimBlueprint_ListSlotNames.generated.h"
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------------
|
|
|
|
UCLASS()
|
|
class UMCP_AnimBlueprint_ListSlotNames : public UObject, public IMCPHandler
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
UPROPERTY(meta=(Description="Animation Blueprint name or package path"))
|
|
FString Blueprint;
|
|
|
|
virtual FString GetDescription() const override
|
|
{
|
|
return TEXT("List all animation slot names used in an Animation Blueprint.");
|
|
}
|
|
|
|
virtual void Handle(FStringBuilderBase& Result) override
|
|
{
|
|
MCPAssets<UAnimBlueprint> Assets;
|
|
if (!Assets.Exact(Blueprint).ENone().ETwo().Load()) return;
|
|
UAnimBlueprint* AnimBP = Assets.Object();
|
|
|
|
// Walk all anim nodes to collect slot names
|
|
TSet<FString> SlotNames;
|
|
for (UAnimGraphNode_Base* AnimNode : MCPUtils::AllNodes<UAnimGraphNode_Base>(AnimBP))
|
|
{
|
|
for (TFieldIterator<FNameProperty> PropIt(AnimNode->GetClass()); PropIt; ++PropIt)
|
|
{
|
|
if (PropIt->GetName().Contains(TEXT("SlotName")) || PropIt->GetName().Contains(TEXT("Slot")))
|
|
{
|
|
FName SlotValue = PropIt->GetPropertyValue_InContainer(AnimNode);
|
|
if (!SlotValue.IsNone())
|
|
{
|
|
SlotNames.Add(SlotValue.ToString());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (const FString& Slot : SlotNames)
|
|
{
|
|
Result.Appendf(TEXT("%s\n"), *Slot);
|
|
}
|
|
|
|
if (SlotNames.Num() == 0)
|
|
{
|
|
Result.Append(TEXT("No animation slot names found.\n"));
|
|
}
|
|
}
|
|
};
|