Files
UnrealEngine/Engine/Plugins/Runtime/StateTree/Source/StateTreeModule/Private/Conditions/StateTreeObjectConditions.cpp
2025-05-18 13:04:45 +08:00

90 lines
3.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Conditions/StateTreeObjectConditions.h"
#include "StateTreeExecutionContext.h"
#include "StateTreeNodeDescriptionHelpers.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(StateTreeObjectConditions)
#define LOCTEXT_NAMESPACE "StateTreeObjectCondition"
//----------------------------------------------------------------------//
// FStateTreeCondition_ObjectIsValid
//----------------------------------------------------------------------//
bool FStateTreeObjectIsValidCondition::TestCondition(FStateTreeExecutionContext& Context) const
{
const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
const bool bResult = IsValid(InstanceData.Object);
return bResult ^ bInvert;
}
#if WITH_EDITOR
FText FStateTreeObjectIsValidCondition::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting) const
{
const FText InvertText = UE::StateTree::DescHelpers::GetInvertText(bInvert, Formatting);
const FText Format = (Formatting == EStateTreeNodeFormatting::RichText)
? LOCTEXT("ObjectIsValidConditionsRich", "{EmptyOrNot}<s>Is Object Valid</>")
: LOCTEXT("ObjectIsValidCondition", "{EmptyOrNot}Is Object Valid");
return FText::FormatNamed(Format,
TEXT("EmptyOrNot"), InvertText);
}
#endif
//----------------------------------------------------------------------//
// FStateTreeCondition_ObjectEquals
//----------------------------------------------------------------------//
bool FStateTreeObjectEqualsCondition::TestCondition(FStateTreeExecutionContext& Context) const
{
const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
const bool bResult = InstanceData.Left == InstanceData.Right;
return bResult ^ bInvert;
}
#if WITH_EDITOR
FText FStateTreeObjectEqualsCondition::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting) const
{
const FText InvertText = UE::StateTree::DescHelpers::GetInvertText(bInvert, Formatting);
const FText Format = (Formatting == EStateTreeNodeFormatting::RichText)
? LOCTEXT("ObjectEqualsConditionRich", "{EmptyOrNot}<s>Is Object Equals</>")
: LOCTEXT("ObjectEqualsCondition", "{EmptyOrNot}Is Object Equals");
return FText::FormatNamed(Format,
TEXT("EmptyOrNot"), InvertText);
}
#endif
//----------------------------------------------------------------------//
// FStateTreeCondition_ObjectIsChildOfClass
//----------------------------------------------------------------------//
bool FStateTreeObjectIsChildOfClassCondition::TestCondition(FStateTreeExecutionContext& Context) const
{
const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
const bool bResult = InstanceData.Object && InstanceData.Class
&& InstanceData.Object->GetClass()->IsChildOf(InstanceData.Class);
SET_NODE_CUSTOM_TRACE_TEXT(Context, Override, TEXT("%s of type '%s' is%s child of '%s'")
, *GetNameSafe(InstanceData.Object)
, *GetNameSafe(InstanceData.Object ? InstanceData.Object->GetClass() : nullptr)
, bResult ? TEXT("") : TEXT(" not")
, *GetNameSafe(InstanceData.Class));
return bResult ^ bInvert;
}
#if WITH_EDITOR
FText FStateTreeObjectIsChildOfClassCondition::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting) const
{
const FText InvertText = UE::StateTree::DescHelpers::GetInvertText(bInvert, Formatting);
const FText Format = (Formatting == EStateTreeNodeFormatting::RichText)
? LOCTEXT("ObjectIsChildOfConditionsRich", "{EmptyOrNot}<s>Is Child Of Class</>")
: LOCTEXT("ObjectIsChildOfCondition", "{EmptyOrNot}Is Child Of Class");
return FText::FormatNamed(Format,
TEXT("EmptyOrNot"), InvertText);
}
#endif
#undef LOCTEXT_NAMESPACE