Salty.uproject (UE 5.8) from the Third Person template with class redirects, the SaltyCore and Salty modules, the three build targets, USaltyAssetManager calling InitGlobalData, Config/Tags with the 23 root namespaces, Scripts/run-tests.sh, build.sh and Authoring/create_gym.py, L_Gym, Git LFS attributes and the placeholder test. Template variants kept as reference (D-41). The four Fab packs stay out of the repository for now (~10 GB). The editor serves the engine MCP plugin on 127.0.0.1:8000 through DefaultEditorPerProjectUserSettings.ini. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
59 lines
2.1 KiB
C++
59 lines
2.1 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
#include "SideScrollingStateTreeUtility.h"
|
|
#include "StateTreeExecutionContext.h"
|
|
#include "StateTreeExecutionTypes.h"
|
|
#include "AIController.h"
|
|
#include "Kismet/GameplayStatics.h"
|
|
|
|
EStateTreeRunStatus FStateTreeGetPlayerTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const
|
|
{
|
|
// get the instance data
|
|
FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
|
|
|
|
// reset the selected target
|
|
APawn* SelectedTarget = nullptr;
|
|
float ClosestDistance = 1000000000000000000.0f;
|
|
|
|
// iterate through each local player
|
|
const int32 NumPlayers = UGameplayStatics::GetNumLocalPlayerControllers(InstanceData.Controller.Get());
|
|
|
|
for (int32 i = 0; i < NumPlayers; ++i)
|
|
{
|
|
if (APawn* Current = UGameplayStatics::GetPlayerPawn(InstanceData.Controller.Get(), i))
|
|
{
|
|
// compute the distance to the target
|
|
const float TargetDist = (Current->GetActorLocation() - InstanceData.NPC->GetActorLocation()).Size();
|
|
|
|
// if we haven't selected a target, or this one is closer to the current one, choose this pawn as target
|
|
if (!SelectedTarget || TargetDist < ClosestDistance)
|
|
{
|
|
SelectedTarget = Current;
|
|
ClosestDistance = TargetDist;
|
|
}
|
|
}
|
|
}
|
|
|
|
// set the selected target, assume out of range by default
|
|
InstanceData.TargetPlayer = SelectedTarget;
|
|
InstanceData.bValidTarget = false;
|
|
|
|
if (SelectedTarget)
|
|
{
|
|
// consider this a valid target if it's within range
|
|
const float TargetDist = (SelectedTarget->GetActorLocation() - InstanceData.NPC->GetActorLocation()).Size();
|
|
|
|
InstanceData.bValidTarget = TargetDist < InstanceData.RangeMax;
|
|
}
|
|
|
|
// succeed or fail depending on target validity
|
|
return InstanceData.bValidTarget ? EStateTreeRunStatus::Succeeded : EStateTreeRunStatus::Failed;
|
|
}
|
|
|
|
#if WITH_EDITOR
|
|
FText FStateTreeGetPlayerTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const
|
|
{
|
|
return FText::FromString("<b>Get Player</b>");
|
|
}
|
|
#endif // WITH_EDITOR
|