You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
[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:
+7
-3
@@ -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
|
||||
|
||||
+7
-3
@@ -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
|
||||
|
||||
+13
-11
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user