2024-03-20 08:28:58 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "Tasks/StateTreeRunParallelStateTreeTask.h"
|
|
|
|
|
|
|
|
|
|
#include "StateTreeExecutionContext.h"
|
|
|
|
|
|
|
|
|
|
FStateTreeRunParallelStateTreeTask::FStateTreeRunParallelStateTreeTask()
|
|
|
|
|
{
|
|
|
|
|
bShouldCopyBoundPropertiesOnTick = false;
|
|
|
|
|
bShouldCopyBoundPropertiesOnExitState = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EStateTreeRunStatus FStateTreeRunParallelStateTreeTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transitions) const
|
|
|
|
|
{
|
|
|
|
|
FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
|
2024-04-03 07:16:44 -04:00
|
|
|
const FStateTreeReference& StateTreeToRun = GetStateTreeToRun(Context, InstanceData);
|
|
|
|
|
if (!StateTreeToRun.IsValid())
|
2024-03-20 08:28:58 -04:00
|
|
|
{
|
|
|
|
|
return EStateTreeRunStatus::Failed;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-03 07:16:44 -04:00
|
|
|
InstanceData.RunningStateTree = StateTreeToRun.GetStateTree();
|
|
|
|
|
FStateTreeExecutionContext ParallelTreeContext(Context, *InstanceData.RunningStateTree, InstanceData.TreeInstanceData);
|
2024-03-20 08:28:58 -04:00
|
|
|
if (!ParallelTreeContext.IsValid())
|
|
|
|
|
{
|
|
|
|
|
return EStateTreeRunStatus::Failed;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-03 07:16:44 -04:00
|
|
|
return ParallelTreeContext.Start(&StateTreeToRun.GetParameters());
|
2024-03-20 08:28:58 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EStateTreeRunStatus FStateTreeRunParallelStateTreeTask::Tick(FStateTreeExecutionContext& Context, const float DeltaTime) const
|
|
|
|
|
{
|
|
|
|
|
FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
|
2024-04-03 07:16:44 -04:00
|
|
|
if (!InstanceData.RunningStateTree)
|
2024-03-20 08:28:58 -04:00
|
|
|
{
|
|
|
|
|
return EStateTreeRunStatus::Failed;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-03 07:16:44 -04:00
|
|
|
FStateTreeExecutionContext ParallelTreeContext(Context, *InstanceData.RunningStateTree, InstanceData.TreeInstanceData);
|
2024-03-20 08:28:58 -04:00
|
|
|
if (!ParallelTreeContext.IsValid())
|
|
|
|
|
{
|
|
|
|
|
return EStateTreeRunStatus::Failed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ParallelTreeContext.Tick(DeltaTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FStateTreeRunParallelStateTreeTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const
|
|
|
|
|
{
|
|
|
|
|
FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
|
2024-04-03 07:16:44 -04:00
|
|
|
if (!InstanceData.RunningStateTree)
|
2024-03-20 08:28:58 -04:00
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-03 07:16:44 -04:00
|
|
|
FStateTreeExecutionContext ParallelTreeContext(Context, *InstanceData.RunningStateTree, InstanceData.TreeInstanceData);
|
2024-03-20 08:28:58 -04:00
|
|
|
if (!ParallelTreeContext.IsValid())
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ParallelTreeContext.Stop();
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-03 07:16:44 -04:00
|
|
|
const FStateTreeReference& FStateTreeRunParallelStateTreeTask::GetStateTreeToRun(FStateTreeExecutionContext& Context, FInstanceDataType& InstanceData) const
|
|
|
|
|
{
|
|
|
|
|
if (StateTreeOverrideTag.IsValid())
|
|
|
|
|
{
|
|
|
|
|
if (const FStateTreeReference* Override = Context.GetLinkedStateTreeOverrideForTag(StateTreeOverrideTag))
|
|
|
|
|
{
|
|
|
|
|
return *Override;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return InstanceData.StateTree;
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-20 08:28:58 -04:00
|
|
|
#if WITH_EDITOR
|
|
|
|
|
void FStateTreeRunParallelStateTreeTask::PostEditInstanceDataChangeChainProperty(const FPropertyChangedChainEvent& PropertyChangedEvent, FStateTreeDataView InstanceDataView)
|
|
|
|
|
{
|
|
|
|
|
if (PropertyChangedEvent.Property && PropertyChangedEvent.Property->GetFName() == GET_MEMBER_NAME_CHECKED(FStateTreeRunParallelStateTreeTaskInstanceData, StateTree))
|
|
|
|
|
{
|
|
|
|
|
InstanceDataView.GetMutable<FInstanceDataType>().StateTree.SyncParameters();
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-21 08:38:57 -04:00
|
|
|
|
|
|
|
|
void FStateTreeRunParallelStateTreeTask::PostLoad(FStateTreeDataView InstanceDataView)
|
|
|
|
|
{
|
|
|
|
|
if (FInstanceDataType* DataType = InstanceDataView.GetMutablePtr<FInstanceDataType>())
|
|
|
|
|
{
|
|
|
|
|
DataType->StateTree.SyncParameters();
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-20 08:28:58 -04:00
|
|
|
#endif // WITH_EDITOR
|