Files
UnrealEngineUWP/Engine/Plugins/Runtime/GameplayInteractions/Source/GameplayInteractionsModule/Private/StateTree/GameplayInteractionSendSlotEventTask.cpp
mikko mononen 1c69b826cc StateTree: Added node validation during compilation
- Added a pass during compilation when node and instance data can be checked and adjusted by the node
- Changed blueprint based task to copy flags to the node in Compile()
- Changed relevant gameplay interaction tasks to check tags during Compile()

#rb Mieszko.Zielinski
#preflight 6377724cf514e1ded9a5ff44

[CL 23193668 by mikko mononen in ue5-main branch]
2022-11-18 08:38:31 -05:00

85 lines
2.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "GameplayInteractionSendSlotEventTask.h"
#include "StateTreeExecutionContext.h"
#include "SmartObjectSubsystem.h"
#include "StateTreeLinker.h"
#include "VisualLogger/VisualLogger.h"
#define LOCTEXT_NAMESPACE "GameplayInteractions"
FGameplayInteractionSendSlotEventTask::FGameplayInteractionSendSlotEventTask()
{
// No tick needed.
bShouldCallTick = false;
bShouldCopyBoundPropertiesOnTick = false;
}
bool FGameplayInteractionSendSlotEventTask::Link(FStateTreeLinker& Linker)
{
Linker.LinkExternalData(SmartObjectSubsystemHandle);
// Copy properties on exit state if the event is sent then.
bShouldCopyBoundPropertiesOnExitState = (Trigger == EGameplayInteractionTaskTrigger::OnExitState);
return true;
}
EDataValidationResult FGameplayInteractionSendSlotEventTask::Compile(FStateTreeDataView InstanceDataView, TArray<FText>& ValidationMessages)
{
EDataValidationResult Result = EDataValidationResult::Valid;
if (!EventTag.IsValid() && !Payload.IsValid())
{
ValidationMessages.Add(LOCTEXT("MissingEventData", "EventTag and Payload properties are empty, expecting valid tag."));
Result = EDataValidationResult::Invalid;
}
return Result;
}
EStateTreeRunStatus FGameplayInteractionSendSlotEventTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const
{
if (Trigger == EGameplayInteractionTaskTrigger::OnEnterState)
{
USmartObjectSubsystem& SmartObjectSubsystem = Context.GetExternalData(SmartObjectSubsystemHandle);
const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
if (InstanceData.TargetSlot.IsValid())
{
// Send the event
SmartObjectSubsystem.SendSlotEvent(InstanceData.TargetSlot, EventTag, Payload);
}
else
{
UE_VLOG_UELOG(Context.GetOwner(), LogStateTree, Error, TEXT("[GameplayInteractionSendSlotEventTask] Expected valid TargetSlot handle."));
}
}
return EStateTreeRunStatus::Running;
}
void FGameplayInteractionSendSlotEventTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const
{
const bool bLastStateFailed = Transition.CurrentRunStatus == EStateTreeRunStatus::Failed;
if (Trigger == EGameplayInteractionTaskTrigger::OnExitState
|| (bLastStateFailed && Trigger == EGameplayInteractionTaskTrigger::OnExitStateFailed)
|| (!bLastStateFailed && Trigger == EGameplayInteractionTaskTrigger::OnExitStateSucceeded))
{
USmartObjectSubsystem& SmartObjectSubsystem = Context.GetExternalData(SmartObjectSubsystemHandle);
const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
if (InstanceData.TargetSlot.IsValid())
{
// Send the event
SmartObjectSubsystem.SendSlotEvent(InstanceData.TargetSlot, EventTag, Payload);
}
else
{
UE_VLOG_UELOG(Context.GetOwner(), LogStateTree, Error, TEXT("[GameplayInteractionSendSlotEventTask] Expected valid TargetSlot handle."));
}
}
}
#undef LOCTEXT_NAMESPACE