[WorldConditions] extended IsTrue return type to a struct to allow conditions to mark result as cacheable or not base on context data values.

#rb mikko.mononen
#preflight 63c952e88168e8b252a20e2f

[CL 23814960 by yoan stamant in ue5-main branch]
This commit is contained in:
yoan stamant
2023-01-23 12:21:15 -05:00
parent f5c387e29f
commit f704a37f87
13 changed files with 193 additions and 112 deletions
@@ -64,18 +64,22 @@ bool FSmartObjectWorldConditionObjectTagQuery::Activate(const FWorldConditionCon
return true;
}
EWorldConditionResult FSmartObjectWorldConditionObjectTagQuery::IsTrue(const FWorldConditionContext& Context) const
FWorldConditionResult FSmartObjectWorldConditionObjectTagQuery::IsTrue(const FWorldConditionContext& Context) const
{
const USmartObjectSubsystem* SmartObjectSubsystem = Context.GetContextDataPtr<USmartObjectSubsystem>(SubsystemRef);
check(SmartObjectSubsystem);
FWorldConditionResult Result(EWorldConditionResultValue::IsFalse, bCanCacheResult);
if (const FSmartObjectHandle* ObjectHandle = Context.GetContextDataPtr<FSmartObjectHandle>(ObjectHandleRef))
{
const FGameplayTagContainer& ObjectTags = SmartObjectSubsystem->GetInstanceTags(*ObjectHandle);
return TagQuery.Matches(ObjectTags) ? EWorldConditionResult::IsTrue : EWorldConditionResult::IsFalse;
if (TagQuery.Matches(ObjectTags))
{
Result.Value =EWorldConditionResultValue::IsTrue;
}
}
return EWorldConditionResult::IsFalse;
return Result;
}
void FSmartObjectWorldConditionObjectTagQuery::Deactivate(const FWorldConditionContext& Context) const
@@ -65,18 +65,22 @@ bool FSmartObjectWorldConditionSlotTagQuery::Activate(const FWorldConditionConte
return true;
}
EWorldConditionResult FSmartObjectWorldConditionSlotTagQuery::IsTrue(const FWorldConditionContext& Context) const
FWorldConditionResult FSmartObjectWorldConditionSlotTagQuery::IsTrue(const FWorldConditionContext& Context) const
{
const USmartObjectSubsystem* SmartObjectSubsystem = Context.GetContextDataPtr<USmartObjectSubsystem>(SubsystemRef);
check(SmartObjectSubsystem);
FWorldConditionResult Result(EWorldConditionResultValue::IsFalse, bCanCacheResult);
if (const FSmartObjectSlotHandle* SlotHandle = Context.GetContextDataPtr<FSmartObjectSlotHandle>(SlotHandleRef))
{
const FGameplayTagContainer& SlotTags = SmartObjectSubsystem->GetSlotTags(*SlotHandle);
return TagQuery.Matches(SlotTags) ? EWorldConditionResult::IsTrue : EWorldConditionResult::IsFalse;
if (TagQuery.Matches(SlotTags))
{
Result.Value = EWorldConditionResultValue::IsTrue;
}
}
return EWorldConditionResult::IsFalse;
return Result;
}
void FSmartObjectWorldConditionSlotTagQuery::Deactivate(const FWorldConditionContext& Context) const
@@ -34,11 +34,8 @@ bool FWorldCondition_SmartObjectActorTagQuery::Initialize(const UWorldConditionS
SmartObjectActorRef = SmartObjectSchema->GetSmartObjectActorRef();
// @todo SO: restore caching once we can change dynamically
// (i.e. actor with AbilitySystemComponent can cache result using the delegate; actor only implementing IGameplayTagAssetInterface can not)
// bCanCacheResult = Schema.GetContextDataTypeByRef(SmartObjectActorRef) == EWorldConditionContextDataType::Persistent;
bCanCacheResult = false;
bCanCacheResult = Schema.GetContextDataTypeByRef(SmartObjectActorRef) == EWorldConditionContextDataType::Persistent;
return true;
}
@@ -93,7 +90,7 @@ bool FWorldCondition_SmartObjectActorTagQuery::Activate(const FWorldConditionCon
return true;
}
EWorldConditionResult FWorldCondition_SmartObjectActorTagQuery::IsTrue(const FWorldConditionContext& Context) const
FWorldConditionResult FWorldCondition_SmartObjectActorTagQuery::IsTrue(const FWorldConditionContext& Context) const
{
const AActor* const SmartObjectActor = Context.GetContextDataPtr<AActor>(SmartObjectActorRef);
const IGameplayTagAssetInterface* GameplayTagAssetInterface = Cast<IGameplayTagAssetInterface>(SmartObjectActor);
@@ -104,16 +101,21 @@ EWorldConditionResult FWorldCondition_SmartObjectActorTagQuery::IsTrue(const FWo
GameplayTagAssetInterface = AbilitySystemComponent;
}
}
if (GameplayTagAssetInterface)
FStateType& State = Context.GetState(*this);
const bool bResultCanBeCached = State.DelegateHandle.IsValid();
FWorldConditionResult Result(EWorldConditionResultValue::IsFalse, bResultCanBeCached);
if (GameplayTagAssetInterface != nullptr)
{
FGameplayTagContainer Tags;
GameplayTagAssetInterface->GetOwnedGameplayTags(Tags);
return TagQuery.Matches(Tags) ? EWorldConditionResult::IsTrue : EWorldConditionResult::IsFalse;
if (TagQuery.Matches(Tags))
{
Result.Value = EWorldConditionResultValue::IsTrue;
}
}
return EWorldConditionResult::IsFalse;
return Result;
}
void FWorldCondition_SmartObjectActorTagQuery::Deactivate(const FWorldConditionContext& Context) const