Space Plunder
Loading...
Searching...
No Matches
ACustomAIController Class Reference

#include <CustomAIController.h>

Inheritance diagram for ACustomAIController:
IAIActionsInterface

Public Member Functions

 ACustomAIController ()
 
virtual ETeamAttitude::Type GetTeamAttitudeTowards (const AActor &Other) const override
 
virtual void SetGenericTeamId (const FGenericTeamId &NewTeamID) override
 
virtual FGenericTeamId GetGenericTeamId () const override
 
int32 GetTeamID () const
 
void OnRep_MyTeamID (FGenericTeamId OldTeamID)
 
void UpdatePerceptionDetails () const
 

Public Attributes

FGenericTeamId MyTeamID
 

Protected Member Functions

virtual void OnPossess (APawn *InPawn) override
 
virtual void BeginPlay () override
 
virtual FVector GetFocalPointOnActor (const AActor *Actor) const override
 
virtual void Aim (const bool bStartAiming=true) override
 
virtual void CrouchAction (const bool bCrouch=true) override
 
virtual void ShootAction (const bool bStartShooting=true) override
 
virtual void ShootAtTargetAction (const bool bStartShooting=true, const FVector &TargetLocation=FVector::ZeroVector) override
 
virtual float Reload () override
 
virtual bool CheckAmmo (bool &bNeedToReload) const override
 
virtual bool GetHasWeapon () const override
 
virtual uint8 GetWeaponFireMode () const override
 
virtual float GetWeaponFireRate () const override
 
virtual void UpdateMovementSpeed (const EAIMovementSpeed MovementSpeed=EAIMovementSpeed::Running, const EAIMovementType MovementType=EAIMovementType::Normal) override
 
virtual bool PickupObject (const AActor *TargetObject) override
 
virtual float MeleeAttack () override
 
virtual float PlayAnimationMontage (UAnimMontage *Montage, const float PlayRate=1.0f, const float InTimeToStartMontageAt=0.0f, const bool bStopAllMontages=true) override
 
virtual FVector PredictLocation (AActor *TargetActor) override
 
virtual TArray< AActor * > GetHostileActors () const override
 
virtual TArray< AActor * > GetPerceivedObjects (const TArray< EAIStimuliType > Filters) const override
 
virtual AActor * GetBestHostileActor () const override
 
virtual float GetMaxHealth () const override
 
virtual FVector GetLastKnownLocation (AActor *TargetActor, const TArray< EAISense > &Senses) override
 
void AIStateChanged (EAIStateType State)
 
void OnForgottenStimulusBP (FAIStimulus Stimulus)
 
void OnTargetPerceptionForgottenBP (AActor *Actor)
 
void OnPerceptionUpdatedBP (const TArray< AActor * > &UpdatedActors)
 
void OnTargetPerceptionUpdatedBP (AActor *Actor, FAIStimulus Stimulus)
 
void OnTargetPerceptionInfoUpdatedBP (FActorPerceptionUpdateInfo UpdateInfo)
 
void OnTargetSightUpdated (AActor *Actor, FAIStimulus Stimulus)
 
void OnTargetHearingUpdated (AActor *Actor, FAIStimulus Stimulus)
 
void OnTargetPredictionUpdated (AActor *Actor, FAIStimulus Stimulus)
 
void OnTargetDamageUpdated (AActor *Actor, FAIStimulus Stimulus)
 
void OnTargetTeamUpdated (AActor *Actor, FAIStimulus Stimulus)
 
void OnTargetTouchUpdated (AActor *Actor, FAIStimulus Stimulus)
 
void OnTargetActionUpdated (AActor *Actor, FAIStimulus Stimulus)
 
void ForgottenStimulus (FAIStimulus Stimulus)
 
void TargetPerceptionForgotten (AActor *Actor)
 
void PerceptionUpdated (const TArray< AActor * > &UpdatedActors)
 
void TargetPerceptionUpdated (AActor *Actor, FAIStimulus Stimulus)
 
void TargetPerceptionInfoUpdated (const FActorPerceptionUpdateInfo &UpdateInfo)
 
void CharacterDeath (FPlayerDeath &DeathInfo, APawn *PawnThatDied)
 
void TargetSightUpdated (AActor *Actor, const FAIStimulus &Stimulus)
 
void TargetHearingUpdated (AActor *Actor, const FAIStimulus &Stimulus)
 
void TargetPredictionUpdated (AActor *Actor, const FAIStimulus &Stimulus)
 
void TargetDamageUpdated (AActor *Actor, const FAIStimulus &Stimulus)
 
void TargetTeamUpdated (AActor *Actor, const FAIStimulus &Stimulus)
 
void TargetTouchUpdated (AActor *Actor, const FAIStimulus &Stimulus)
 
void TargetActionUpdated (AActor *Actor, const FAIStimulus &Stimulus)
 

Protected Attributes

TObjectPtr< UBehaviorTree > Behaviour = nullptr
 
class UAdvancedAIPerceptionComponentAIPerceptionComponent
 
class UAISenseConfig_Sight * SightConfig
 
class UAISenseConfig_Hearing * HearingConfig
 
class UAISenseConfig_Prediction * PredictionConfig
 
class UAISenseConfig_Team * TeamConfig
 
class UAISenseConfig_Damage * DamageConfig
 
class UAISenseConfig_ActionsActionsConfig
 
class UAITraitsComponent * AITraitsComponentReference
 
class ACustomAICharacterCustomAICharacter = nullptr
 
uint8 TeamID = 2
 
bool bDebuggingMode = false
 

Constructor & Destructor Documentation

◆ ACustomAIController()

ACustomAIController::ACustomAIController ( )
32{
33 AIPerceptionComponent = CreateDefaultSubobject<UAdvancedAIPerceptionComponent>("Perception");
34 SightConfig = CreateDefaultSubobject<UAISenseConfig_Sight>(TEXT("Sight Perception"));
35 SightConfig->DetectionByAffiliation.bDetectEnemies = true;
36 SightConfig->DetectionByAffiliation.bDetectNeutrals = true;
37 SightConfig->DetectionByAffiliation.bDetectFriendlies = true;
38
39 HearingConfig = CreateDefaultSubobject<UAISenseConfig_Hearing>(TEXT("Hearing Perception"));
40 HearingConfig->DetectionByAffiliation.bDetectEnemies = true;
41 HearingConfig->DetectionByAffiliation.bDetectNeutrals = true;
42 HearingConfig->DetectionByAffiliation.bDetectFriendlies = true;
43
44 PredictionConfig = CreateDefaultSubobject<UAISenseConfig_Prediction>(TEXT("Prediction Perception"));
45 TeamConfig = CreateDefaultSubobject<UAISenseConfig_Team>(TEXT("Team Perception"));
46 DamageConfig = CreateDefaultSubobject<UAISenseConfig_Damage>(TEXT("Damage Perception"));
47
48 ActionsConfig = CreateDefaultSubobject<UAISenseConfig_Actions>(TEXT("Actions Perception"));
49
50 AIPerceptionComponent->ConfigureSense(*ActionsConfig);
51 AIPerceptionComponent->ConfigureSense(*SightConfig);
52 AIPerceptionComponent->ConfigureSense(*TeamConfig);
54 AIPerceptionComponent->ConfigureSense(*HearingConfig);
55 AIPerceptionComponent->ConfigureSense(*DamageConfig);
56
57 AIPerceptionComponent->SetDominantSense(UAISense_Sight::StaticClass());
58
59 // SetGenericTeamId(FGenericTeamId(TeamID));
60}
class UAISenseConfig_Damage * DamageConfig
Definition CustomAIController.h:61
class UAISenseConfig_Actions * ActionsConfig
Definition CustomAIController.h:64
class UAdvancedAIPerceptionComponent * AIPerceptionComponent
Definition CustomAIController.h:50
class UAISenseConfig_Sight * SightConfig
Definition CustomAIController.h:53
class UAISenseConfig_Hearing * HearingConfig
Definition CustomAIController.h:55
class UAISenseConfig_Team * TeamConfig
Definition CustomAIController.h:59
class UAISenseConfig_Prediction * PredictionConfig
Definition CustomAIController.h:57

Member Function Documentation

◆ Aim()

void ACustomAIController::Aim ( const bool bStartAiming = true)
overrideprotectedvirtual

Implements IAIActionsInterface.

238{
239 if(CustomAICharacter != nullptr)
240 {
241 CustomAICharacter->Aim(bStartAiming);
242 return;
243 }
244 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("Aim Action Failed in Custom AI Controller"));}
245}
virtual void Aim(const bool bStartAiming=true) override
Definition CustomAICharacter.cpp:651
bool bDebuggingMode
Definition CustomAIController.h:111
class ACustomAICharacter * CustomAICharacter
Definition CustomAIController.h:70

◆ AIStateChanged()

void ACustomAIController::AIStateChanged ( EAIStateType State)
protected
176{
177 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::AIStateChanged);
178 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Warning, TEXT("AI State: %hhd"), State);}
179 const uint8 Byte = static_cast<uint8>(State);
180 if(GetBlackboardComponent() != nullptr)
181 {
182 GetBlackboardComponent()->SetValueAsEnum(FName("CurrentAIState"), Byte);
183 }
185}
void AIStateChanged(EAIStateType State)
Definition CustomAIController.cpp:175
void UpdatePerceptionDetails() const
Definition CustomAIController.cpp:101

◆ BeginPlay()

void ACustomAIController::BeginPlay ( )
overrideprotectedvirtual
151{
152 Super::BeginPlay();
153
154 //GetPawn()->GetAITraitsComponent()->FactionType;
155 //switch(EFactionType) TeamID = 1, 2, etc.
156}

◆ CharacterDeath()

void ACustomAIController::CharacterDeath ( FPlayerDeath & DeathInfo,
APawn * PawnThatDied )
protected
465{
466 if(PerceptionComponent != nullptr)
467 {
468 PerceptionComponent->DestroyComponent();
469 }
470 if(Blackboard != nullptr)
471 {
472 Blackboard->DestroyComponent();
473 }
474 if(BrainComponent != nullptr)
475 {
476 BrainComponent->StopLogic("Death");
477 }
478}

◆ CheckAmmo()

bool ACustomAIController::CheckAmmo ( bool & bNeedToReload) const
overrideprotectedvirtual

Returns if out of ammo

Implements IAIActionsInterface.

198{
199 if(CustomAICharacter != nullptr)
200 {
201 return CustomAICharacter->CheckAmmo(bNeedToReload);
202 }
203 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("CheckAmmo Failed in Custom AI Controller"));}
204 return false;
205}
virtual bool CheckAmmo(bool &bNeedToReload) const override
Definition CustomAICharacter.cpp:721

◆ CrouchAction()

void ACustomAIController::CrouchAction ( const bool bCrouch = true)
overrideprotectedvirtual

Will crouch the Character, defaults to true

Implements IAIActionsInterface.

248{
249 if(CustomAICharacter != nullptr)
250 {
252 return;
253 }
254 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("Crouch Action Failed in Custom AI Controller"));}
255}
virtual void CrouchAction(const bool bCrouch=true) override
Definition CustomAICharacter.cpp:673

◆ ForgottenStimulus()

void ACustomAIController::ForgottenStimulus ( FAIStimulus Stimulus)
protected
424{
425 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::ForgottenStimulus);
426 OnForgottenStimulusBP(Stimulus);
427}
void OnForgottenStimulusBP(FAIStimulus Stimulus)
void ForgottenStimulus(FAIStimulus Stimulus)
Definition CustomAIController.cpp:423

◆ GetBestHostileActor()

AActor * ACustomAIController::GetBestHostileActor ( ) const
overrideprotectedvirtual

Implements IAIActionsInterface.

352{
353 if(AITraitsComponentReference != nullptr)
354 {
355 return AITraitsComponentReference->GetBestHostileActor();
356 }
357 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("GetBestHostileActor Failed in Custom AI Controller"));}
358 return nullptr;
359}
class UAITraitsComponent * AITraitsComponentReference
Definition CustomAIController.h:67

◆ GetFocalPointOnActor()

FVector ACustomAIController::GetFocalPointOnActor ( const AActor * Actor) const
overrideprotectedvirtual
159{
160 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::GetFocalPointOnActor);
161 const IInteractionInterface* InteractableActor = Cast<IInteractionInterface>(Actor);
162 if(InteractableActor != nullptr)
163 {
164 return InteractableActor->GetInteractionLocation();
165 }
166 const APawn* FocusPawn = Cast<APawn>(Actor);
167 if (FocusPawn)
168 {
169 // Focus on pawn's eye view point
170 return FocusPawn->GetPawnViewLocation();
171 }
172 return Super::GetFocalPointOnActor(Actor);
173}
virtual FVector GetFocalPointOnActor(const AActor *Actor) const override
Definition CustomAIController.cpp:158
Definition InteractionInterface.h:18
virtual FVector GetInteractionLocation() const =0

◆ GetGenericTeamId()

virtual FGenericTeamId ACustomAIController::GetGenericTeamId ( ) const
inlineoverridevirtual
29{return MyTeamID;};
FGenericTeamId MyTeamID
Definition CustomAIController.h:27

◆ GetHasWeapon()

bool ACustomAIController::GetHasWeapon ( ) const
overrideprotectedvirtual

Returns if has a weapon

Implements IAIActionsInterface.

208{
209 if(CustomAICharacter != nullptr)
210 {
212 }
213 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("GetHasWeapon Failed in Custom AI Controller"));}
214 return false;
215}
virtual bool GetHasWeapon() const override
Definition CustomAICharacter.cpp:735

◆ GetHostileActors()

TArray< AActor * > ACustomAIController::GetHostileActors ( ) const
overrideprotectedvirtual

Implements IAIActionsInterface.

341{
342 if(AITraitsComponentReference != nullptr)
343 {
344 return AITraitsComponentReference->GetHostileActors();
345 }
346 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("GetHostileActors Failed in Custom AI Controller"));}
347 TArray<AActor*> Empty;
348 return Empty;
349}

◆ GetLastKnownLocation()

FVector ACustomAIController::GetLastKnownLocation ( AActor * TargetActor,
const TArray< EAISense > & Senses )
overrideprotectedvirtual

Implements IAIActionsInterface.

372{
373 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::GetLastKnownLocation);
374 FVector Location = FVector::ZeroVector;
375 FActorPerceptionBlueprintInfo ActorInfo;
376 if(PerceptionComponent == nullptr){return Location;}
377 float Age = 999.0f;
378 if(PerceptionComponent->GetActorsPerception(TargetActor, ActorInfo))
379 {
380 for(const auto& Stimuli : ActorInfo.LastSensedStimuli)
381 {
382 if(Senses.Contains(UAIBPLib::GetSenseFromStimulus(Stimuli)) && Stimuli.WasSuccessfullySensed())
383 {
384 if(Stimuli.GetAge() < Age)
385 {
386 Age = Stimuli.GetAge();
387 Location = Stimuli.StimulusLocation;
388 }
389 }
390 }
391 }
392 return Location;
393}
virtual FVector GetLastKnownLocation(AActor *TargetActor, const TArray< EAISense > &Senses) override
Definition CustomAIController.cpp:371
static EAISense GetSenseFromStimulus(const FAIStimulus &Stimulus)
Definition AIBPLib.cpp:21

◆ GetMaxHealth()

float ACustomAIController::GetMaxHealth ( ) const
overrideprotectedvirtual

Implements IAIActionsInterface.

362{
363 if(CustomAICharacter != nullptr)
364 {
366 }
367 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("GetMaxHealth Failed in Custom AI Controller"));}
368 return 0.0f;
369}
virtual float GetMaxHealth() const override
Definition CustomAICharacter.cpp:923

◆ GetPerceivedObjects()

TArray< AActor * > ACustomAIController::GetPerceivedObjects ( const TArray< EAIStimuliType > Filters) const
overrideprotectedvirtual

Implements IAIActionsInterface.

396{
397 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::GetPerceivedObjects);
398 TArray<AActor*> Actors;
399 if(AIPerceptionComponent != nullptr)
400 {
401 TArray<AActor*> AllActors;
402 AIPerceptionComponent->GetKnownPerceivedActors(nullptr, AllActors);
403 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Warning, TEXT("Known Perceived Actors: %i"), AllActors.Num());}
404 for(auto Actor : AllActors)
405 {
406 IBaseInterface* BaseActor = Cast<IBaseInterface>(Actor);
407 if(BaseActor != nullptr)
408 {
409 if(Filters.Contains(BaseActor->GetInteractionData().StimuliType) || Filters.IsEmpty())
410 {
411 Actors.Add(Actor);
412 }
413 }
414 }
415 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Warning, TEXT("Known Perceived Objects: %i"), Actors.Num());}
416 }
417 return Actors;
418}
virtual TArray< AActor * > GetPerceivedObjects(const TArray< EAIStimuliType > Filters) const override
Definition CustomAIController.cpp:395
Definition BaseInterface.h:17

◆ GetTeamAttitudeTowards()

ETeamAttitude::Type ACustomAIController::GetTeamAttitudeTowards ( const AActor & Other) const
overridevirtual
617{
618 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::GetTeamAttitudeTowards);
620 if(const APawn* OtherPawn = Cast<APawn>(&Other))
621 {
622 const IGenericTeamAgentInterface* TeamAgent = Cast<IGenericTeamAgentInterface>(OtherPawn);
623 if(TeamAgent == nullptr){TeamAgent = Cast<IGenericTeamAgentInterface>(OtherPawn->GetController());}
624 if(TeamAgent != nullptr)
625 {
626 const FGenericTeamId OtherTeamID = TeamAgent->GetGenericTeamId();
627 const EFactionType OtherPawnFaction = UAIBPLib::GetFactionFromTeamID(OtherTeamID);
628 bool bSuccess = false;
629 const FFactionRelationship Relationship = UAIBPLib::GetFactionRelationship(this, OwnerFaction, OtherPawnFaction, bSuccess);
630 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Warning, TEXT("Get Attitude Toward - Owner: %s "), *GetHumanReadableName());}
631
632 if(bSuccess)
633 {
634 switch (Relationship.RelationshipStatus)
635 {
638 // UE_LOG(LogCustomCharacters, Warning, TEXT("TEAM: Friendship"));
639 return ETeamAttitude::Friendly;
643 // UE_LOG(LogCustomCharacters, Warning, TEXT("TEAM: Neutral"));
644 return ETeamAttitude::Neutral;
647 // UE_LOG(LogCustomCharacters, Warning, TEXT("TEAM: Hostile"));
648 return ETeamAttitude::Hostile;
649 }
650 }
651 }
652 }
653 return ETeamAttitude::Neutral;
654}
EFactionType
Definition AIDataTypes.h:103
virtual ETeamAttitude::Type GetTeamAttitudeTowards(const AActor &Other) const override
Definition CustomAIController.cpp:616
uint8 TeamID
Definition CustomAIController.h:109
static EFactionType GetFactionFromTeamID(const uint8 TeamID)
Definition AIBPLib.cpp:120
static FFactionRelationship GetFactionRelationship(const UObject *WorldContextObject, const EFactionType Faction, const EFactionType TargetFaction, bool &bSuccess, UDataTable *DataTable=nullptr)
Definition AIBPLib.cpp:339
Definition AIDataTypes.h:279
ERelationshipStatus RelationshipStatus
Definition AIDataTypes.h:284

◆ GetTeamID()

int32 ACustomAIController::GetTeamID ( ) const
inline
32{return (MyTeamID == FGenericTeamId::NoTeam) ? INDEX_NONE : (int32)MyTeamID;};

◆ GetWeaponFireMode()

uint8 ACustomAIController::GetWeaponFireMode ( ) const
overrideprotectedvirtual

Returns Weapon Fire Mode
0 - Single
1 - Burst
2 - FullAuto
3 - Charge

Implements IAIActionsInterface.

218{
219 if(CustomAICharacter != nullptr)
220 {
222 }
223 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("GetWeaponFireMode Failed in Custom AI Controller"));}
224 return false;
225}
virtual uint8 GetWeaponFireMode() const override
Definition CustomAICharacter.cpp:745

◆ GetWeaponFireRate()

float ACustomAIController::GetWeaponFireRate ( ) const
overrideprotectedvirtual

Return Weapon Fire Rate per Min

Implements IAIActionsInterface.

228{
229 if(CustomAICharacter != nullptr)
230 {
232 }
233 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("GetWeaponFireRate Failed in Custom AI Controller"));}
234 return false;
235}
virtual float GetWeaponFireRate() const override
Definition CustomAICharacter.cpp:755

◆ MeleeAttack()

float ACustomAIController::MeleeAttack ( )
overrideprotectedvirtual

Implements IAIActionsInterface.

298{
299 if(CustomAICharacter != nullptr)
300 {
302 }
303 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("MeleeAttack Failed in Custom AI Controller"));}
304 return 0.0f;
305}
virtual float MeleeAttack() override
Definition CustomAICharacter.cpp:842

◆ OnForgottenStimulusBP()

void ACustomAIController::OnForgottenStimulusBP ( FAIStimulus Stimulus)
protected

◆ OnPerceptionUpdatedBP()

void ACustomAIController::OnPerceptionUpdatedBP ( const TArray< AActor * > & UpdatedActors)
protected

◆ OnPossess()

void ACustomAIController::OnPossess ( APawn * InPawn)
overrideprotectedvirtual
65{
66 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::OnPossess);
67 Super::OnPossess(InPawn);
68 if(Behaviour != nullptr)
69 {
70 RunBehaviorTree(Behaviour);
71 }
72 CustomAICharacter = Cast<ACustomAICharacter>(InPawn);
73 if(CustomAICharacter != nullptr)
74 {
77 // AITraitsComponentReference->SetBlackboard(Blackboard);
78 }
79 if(AIPerceptionComponent != nullptr)
80 {
82 AIPerceptionComponent->OnTargetPerceptionForgotten.AddUniqueDynamic(this, &ACustomAIController::TargetPerceptionForgotten);
83 AIPerceptionComponent->OnPerceptionUpdated.AddUniqueDynamic(this, &ACustomAIController::PerceptionUpdated);
84 AIPerceptionComponent->OnTargetPerceptionUpdated.AddUniqueDynamic(this, &ACustomAIController::TargetPerceptionUpdated);
85 AIPerceptionComponent->OnTargetPerceptionInfoUpdated.AddUniqueDynamic(this, &ACustomAIController::TargetPerceptionInfoUpdated);
86 // AIPerceptionComponent->On
87
88 //- Set Perception Based on Skills //
90 }
91 if(AITraitsComponentReference != nullptr)
92 {
93 AITraitsComponentReference->OnAIStateChangedDelegate.AddUniqueDynamic(this, &ACustomAIController::AIStateChanged);
94 AITraitsComponentReference->SetBlackboardComponent(GetBlackboardComponent());
96 SetGenericTeamId(FGenericTeamId(TeamID));
97 UE_LOG(LogTemp, Warning, TEXT("TEAM ID: %i "), TeamID);
98 }
99}
FOnCharacterDeath OnCharacterDeath
Definition CharacterBase.h:39
class UAITraitsComponent * GetTraitsComponent() const
Definition CustomAICharacter.h:69
void TargetPerceptionUpdated(AActor *Actor, FAIStimulus Stimulus)
Definition CustomAIController.cpp:481
void PerceptionUpdated(const TArray< AActor * > &UpdatedActors)
Definition CustomAIController.cpp:443
virtual void SetGenericTeamId(const FGenericTeamId &NewTeamID) override
Definition CustomAIController.cpp:656
TObjectPtr< UBehaviorTree > Behaviour
Definition CustomAIController.h:46
void CharacterDeath(FPlayerDeath &DeathInfo, APawn *PawnThatDied)
Definition CustomAIController.cpp:464
void TargetPerceptionForgotten(AActor *Actor)
Definition CustomAIController.cpp:429
void TargetPerceptionInfoUpdated(const FActorPerceptionUpdateInfo &UpdateInfo)
Definition CustomAIController.cpp:449
virtual void OnPossess(APawn *InPawn) override
Definition CustomAIController.cpp:64
static uint8 GetTeamIDFromFaction(const EFactionType Faction)
Definition AIBPLib.cpp:91
FOnForgottenStimulus OnForgottenStimulus
Definition AdvancedAIPerceptionComponent.h:20

◆ OnRep_MyTeamID()

void ACustomAIController::OnRep_MyTeamID ( FGenericTeamId OldTeamID)
23{
24 if(OldTeamID != MyTeamID)
25 {
26 //broadcastTeamChange
27 }
28}

◆ OnTargetActionUpdated()

void ACustomAIController::OnTargetActionUpdated ( AActor * Actor,
FAIStimulus Stimulus )
protected

◆ OnTargetDamageUpdated()

void ACustomAIController::OnTargetDamageUpdated ( AActor * Actor,
FAIStimulus Stimulus )
protected

◆ OnTargetHearingUpdated()

void ACustomAIController::OnTargetHearingUpdated ( AActor * Actor,
FAIStimulus Stimulus )
protected

◆ OnTargetPerceptionForgottenBP()

void ACustomAIController::OnTargetPerceptionForgottenBP ( AActor * Actor)
protected

◆ OnTargetPerceptionInfoUpdatedBP()

void ACustomAIController::OnTargetPerceptionInfoUpdatedBP ( FActorPerceptionUpdateInfo UpdateInfo)
protected

◆ OnTargetPerceptionUpdatedBP()

void ACustomAIController::OnTargetPerceptionUpdatedBP ( AActor * Actor,
FAIStimulus Stimulus )
protected

This function is called when the perception of a specific actor (target) by the AI has been updated. It provides details about the perceived actor and the updated perception data (like sight, hearing, etc.) Use this when your AI behavior depends on the perception status of individual targets. For example, if you need to execute specific logic when an enemy becomes visible or when the sound of a specific ally is heard.

◆ OnTargetPredictionUpdated()

void ACustomAIController::OnTargetPredictionUpdated ( AActor * Actor,
FAIStimulus Stimulus )
protected

◆ OnTargetSightUpdated()

void ACustomAIController::OnTargetSightUpdated ( AActor * Actor,
FAIStimulus Stimulus )
protected

◆ OnTargetTeamUpdated()

void ACustomAIController::OnTargetTeamUpdated ( AActor * Actor,
FAIStimulus Stimulus )
protected

◆ OnTargetTouchUpdated()

void ACustomAIController::OnTargetTouchUpdated ( AActor * Actor,
FAIStimulus Stimulus )
protected

◆ PerceptionUpdated()

void ACustomAIController::PerceptionUpdated ( const TArray< AActor * > & UpdatedActors)
protected
444{
445 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::PerceptionUpdated);
446 OnPerceptionUpdatedBP(UpdatedActors);
447}
void OnPerceptionUpdatedBP(const TArray< AActor * > &UpdatedActors)

◆ PickupObject()

bool ACustomAIController::PickupObject ( const AActor * TargetObject)
overrideprotectedvirtual

Implements IAIActionsInterface.

288{
289 if(CustomAICharacter != nullptr)
290 {
291 return CustomAICharacter->PickupObject(TargetObject);
292 }
293 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("PickupObject Failed in Custom AI Controller"));}
294 return false;
295}
virtual bool PickupObject(const AActor *TargetObject) override
Definition CustomAICharacter.cpp:804

◆ PlayAnimationMontage()

float ACustomAIController::PlayAnimationMontage ( UAnimMontage * Montage,
const float PlayRate = 1.0f,
const float InTimeToStartMontageAt = 0.0f,
const bool bStopAllMontages = true )
overrideprotectedvirtual

Implements IAIActionsInterface.

309{
310 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::PlayAnimationMontage);
311 if(CustomAICharacter != nullptr)
312 {
313 return CustomAICharacter->PlayAnimationMontage(Montage, PlayRate, InTimeToStartMontageAt, bStopAllMontages);
314 }
315 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("MeleeAttack Failed in Custom AI Controller"));}
316 return 0.0f;
317}
virtual float PlayAnimationMontage(UAnimMontage *Montage, const float PlayRate=1.0f, const float InTimeToStartMontageAt=0.0f, const bool bStopAllMontages=true) override
Definition CustomAICharacter.cpp:863
virtual float PlayAnimationMontage(UAnimMontage *Montage, const float PlayRate=1.0f, const float InTimeToStartMontageAt=0.0f, const bool bStopAllMontages=true) override
Definition CustomAIController.cpp:307

◆ PredictLocation()

FVector ACustomAIController::PredictLocation ( AActor * TargetActor)
overrideprotectedvirtual

Implements IAIActionsInterface.

320{
321 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::PredictLocation);
322 //@ TODO Check if this works like the BP one //
323 if(AIPerceptionComponent != nullptr && CustomAICharacter != nullptr && AITraitsComponentReference != nullptr)
324 {
325 UAISense_Prediction::RequestPawnPredictionEvent(CustomAICharacter, TargetActor, AITraitsComponentReference->GetPredictionTime());
326 FActorPerceptionBlueprintInfo TargetInfo;
327 AIPerceptionComponent->GetActorsPerception(TargetActor, TargetInfo);
328 for(const auto& Stimuli : TargetInfo.LastSensedStimuli)
329 {
331 {
332 return Stimuli.StimulusLocation;
333 }
334 }
335 }
336 UE_LOG(LogCustomCharacters, Error, TEXT("PredictLocation Failed in Custom AI Controller"))
337 return FVector::ZeroVector;
338}
virtual FVector PredictLocation(AActor *TargetActor) override
Definition CustomAIController.cpp:319

◆ Reload()

float ACustomAIController::Reload ( )
overrideprotectedvirtual

Implements IAIActionsInterface.

188{
189 if(CustomAICharacter != nullptr)
190 {
191 return CustomAICharacter->Reload();
192 }
193 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("Reload Action Failed in Custom AI Character"));}
194 return 0.0f;
195}
virtual float Reload() override
Definition CustomAICharacter.cpp:640

◆ SetGenericTeamId()

void ACustomAIController::SetGenericTeamId ( const FGenericTeamId & NewTeamID)
overridevirtual
657{
658 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::SetGenericTeamId);
659 if(HasAuthority())
660 {
661 const FGenericTeamId OldTeamID = MyTeamID;
662
663 // MARK_PROPERTY_DIRTY_FROM_NAME(ThisClass, MyTeamID, this);
664 MyTeamID = NewTeamID;
665 if(bDebuggingMode){ UE_LOG(LogTemp, Error, TEXT("team %i"), NewTeamID.GetId());}
666 // ConditionalBroadcastTeamChanged(this, OldTeamID, NewTeamID);
667 }
668 else
669 {
670 if(bDebuggingMode){UE_LOG(LogTemp, Error, TEXT("Cannot set team for %s on non-authority"), *GetPathName(this));}
671 }
672}

◆ ShootAction()

void ACustomAIController::ShootAction ( const bool bStartShooting = true)
overrideprotectedvirtual

Implements IAIActionsInterface.

258{
259 if(CustomAICharacter != nullptr)
260 {
261 CustomAICharacter->ShootAction(bStartShooting);
262 return;
263 }
264 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("Shoot Action Failed in Custom AI Controller"));}
265}
virtual void ShootAction(const bool bStartShooting=true) override
Definition CustomAICharacter.cpp:686

◆ ShootAtTargetAction()

void ACustomAIController::ShootAtTargetAction ( const bool bStartShooting = true,
const FVector & TargetLocation = FVector::ZeroVector )
overrideprotectedvirtual

Implements IAIActionsInterface.

268{
269 if(CustomAICharacter != nullptr)
270 {
271 CustomAICharacter->ShootAtTargetAction(bStartShooting, TargetLocation);
272 return;
273 }
274 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("ShootAtTargetAction Failed in Custom AI Controller"));}
275}
virtual void ShootAtTargetAction(const bool bStartShooting=true, const FVector &TargetLocation=FVector::ZeroVector) override
Definition CustomAICharacter.cpp:710

◆ TargetActionUpdated()

void ACustomAIController::TargetActionUpdated ( AActor * Actor,
const FAIStimulus & Stimulus )
protected
604{
605 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::TargetActionUpdated);
606 if(Actor == this){return;}
607 if(AITraitsComponentReference != nullptr)
608 {
609 AITraitsComponentReference->ActionReceived(Actor, Stimulus);
610 }
611 OnTargetActionUpdated(Actor, Stimulus);
612}
void TargetActionUpdated(AActor *Actor, const FAIStimulus &Stimulus)
Definition CustomAIController.cpp:603
void OnTargetActionUpdated(AActor *Actor, FAIStimulus Stimulus)

◆ TargetDamageUpdated()

void ACustomAIController::TargetDamageUpdated ( AActor * Actor,
const FAIStimulus & Stimulus )
protected
581{
582 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::TargetDamageUpdated);
583 OnTargetDamageUpdated(Actor, Stimulus);
584}
void TargetDamageUpdated(AActor *Actor, const FAIStimulus &Stimulus)
Definition CustomAIController.cpp:580
void OnTargetDamageUpdated(AActor *Actor, FAIStimulus Stimulus)

◆ TargetHearingUpdated()

void ACustomAIController::TargetHearingUpdated ( AActor * Actor,
const FAIStimulus & Stimulus )
protected
560{
561 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::TargetHearingUpdated);
562 if(Actor != nullptr && GetTeamAttitudeTowards(*Actor) == ETeamAttitude::Hostile)
563 {
564 //- Doesn't need to be character as player should be able to throw something //
565 if(AITraitsComponentReference != nullptr && Stimulus.WasSuccessfullySensed())
566 {
567 AITraitsComponentReference->SoundDetected(Actor, Stimulus);
568 }
569 }
570 OnTargetHearingUpdated(Actor, Stimulus);
571}
void TargetHearingUpdated(AActor *Actor, const FAIStimulus &Stimulus)
Definition CustomAIController.cpp:559
void OnTargetHearingUpdated(AActor *Actor, FAIStimulus Stimulus)

◆ TargetPerceptionForgotten()

void ACustomAIController::TargetPerceptionForgotten ( AActor * Actor)
protected
430{
431 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::TargetPerceptionForgotten);
432 if(Actor == nullptr){return;}
433 if(AITraitsComponentReference != nullptr)
434 {
435 // if(Actor == AITraitsComponentReference->GetCurrentTargetActor())
436 // {
437 // AITraitsComponentReference->StopDetecting();
438 // }
439 }
441}
void OnTargetPerceptionForgottenBP(AActor *Actor)

◆ TargetPerceptionInfoUpdated()

void ACustomAIController::TargetPerceptionInfoUpdated ( const FActorPerceptionUpdateInfo & UpdateInfo)
protected
450{
451 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::TargetPerceptionInfoUpdated);
452
453 // if(AITraitsComponentReference != nullptr)
454 // {
455 // if(UpdateInfo.Target != nullptr && UpdateInfo.Target.Get() == AITraitsComponentReference->GetTargetActor())
456 // {
457 // if(bDebuggingMode){UE_LOG(LogCustomCharacters, Warning, TEXT("Target Actor: %s Info Updated"), *UpdateInfo.Target.Get()->GetName());}
458 // AITraitsComponentReference->StartDetecting(UpdateInfo.Target.Get(), UpdateInfo.Stimulus);
459 // }
460 // }
462}
void OnTargetPerceptionInfoUpdatedBP(FActorPerceptionUpdateInfo UpdateInfo)

◆ TargetPerceptionUpdated()

void ACustomAIController::TargetPerceptionUpdated ( AActor * Actor,
FAIStimulus Stimulus )
protected
482{
483 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::TargetPerceptionUpdated);
484 // SCOPE_CYCLE_COUNTER(STAT_AIPerceptionUpdated);
485 if(Actor == GetPawn() || Actor == this || AITraitsComponentReference == nullptr){return;}
486 switch(UAIBPLib::GetSenseFromStimulus(Stimulus))
487 {
488 default:
489 case EAISense::Sight:
490 TargetSightUpdated(Actor, Stimulus);
491 break;
493 TargetHearingUpdated(Actor, Stimulus);
494 break;
496 TargetPredictionUpdated(Actor, Stimulus);
497 break;
498 case EAISense::Damage:
499 TargetDamageUpdated(Actor, Stimulus);
500 break;
501 case EAISense::Team:
502 TargetTeamUpdated(Actor, Stimulus);
503 break;
504 case EAISense::Action:
505 TargetActionUpdated(Actor, Stimulus);
506 break;
507 case EAISense::Touch:
508 TargetTouchUpdated(Actor, Stimulus);
509 break;
510 }
511 OnTargetPerceptionUpdatedBP(Actor, Stimulus);
512}
void TargetPredictionUpdated(AActor *Actor, const FAIStimulus &Stimulus)
Definition CustomAIController.cpp:574
void TargetTouchUpdated(AActor *Actor, const FAIStimulus &Stimulus)
Definition CustomAIController.cpp:592
void TargetTeamUpdated(AActor *Actor, const FAIStimulus &Stimulus)
Definition CustomAIController.cpp:586
void OnTargetPerceptionUpdatedBP(AActor *Actor, FAIStimulus Stimulus)
void TargetSightUpdated(AActor *Actor, const FAIStimulus &Stimulus)
Definition CustomAIController.cpp:514

◆ TargetPredictionUpdated()

void ACustomAIController::TargetPredictionUpdated ( AActor * Actor,
const FAIStimulus & Stimulus )
protected
575{
576 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::TargetPredictionUpdated);
577 OnTargetPredictionUpdated(Actor, Stimulus);
578}
void OnTargetPredictionUpdated(AActor *Actor, FAIStimulus Stimulus)

◆ TargetSightUpdated()

void ACustomAIController::TargetSightUpdated ( AActor * Actor,
const FAIStimulus & Stimulus )
protected
515{
516 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::TargetSightUpdated);
517 if(Actor == nullptr){return;}
518 if(Stimulus.WasSuccessfullySensed())
519 {
520 AITraitsComponentReference->SightDetected(Actor, Stimulus);
521 }
522 else
523 {
524 AITraitsComponentReference->SightLost(Actor, Stimulus);
525 }
526
527 //@TODO Check if Character Is Known //
528 // const IBaseInterface* BaseActor = Cast<IBaseInterface>(Actor);
529 // //- Doesn't need to be character as player should be able to throw something //
530 // if(BaseActor != nullptr && AITraitsComponentReference != nullptr /*&& BaseActor->GetIsCharacter()*/ && Stimulus.WasSuccessfullySensed())
531 // {
532 // // AIPerceptionComponent->
533 // //- Need to check if it's still percevied //
534 // }
535
536 // const IBaseInterface* BaseActor = Cast<IBaseInterface>(Actor);
537 // //- Doesn't need to be character as player should be able to throw something //
538 // if(BaseActor != nullptr && AITraitsComponentReference != nullptr/*&& BaseActor->GetIsCharacter()*/)
539 // {
540 // AITraitsComponentReference->StartDetecting(Actor, Stimulus);
541 // // AITraitsComponentReference->DetectActor(Actor);
542 //
543 // // bool bSuccess = false;
544 // // const FFactionRelationship Relationship = UAIBPLib::GetFactionRelationship(GetWorld(), AITraitsComponentReference->GetFaction(),
545 // // TargetCharacter->GetCharacterFaction(), bSuccess);
546 // // if(!bHostile && bSuccess)
547 // // {
548 // // AITraitsComponentReference->AddFriendlyActor(Actor);
549 // // // AITraitsComponentReference->StartDetecting(Actor);
550 // // }
551 // // else
552 // // {
553 // //
554 // // }
555 // }
556 OnTargetSightUpdated(Actor, Stimulus);
557}
void OnTargetSightUpdated(AActor *Actor, FAIStimulus Stimulus)

◆ TargetTeamUpdated()

void ACustomAIController::TargetTeamUpdated ( AActor * Actor,
const FAIStimulus & Stimulus )
protected
587{
588 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::TargetTeamUpdated);
589 OnTargetTeamUpdated(Actor, Stimulus);
590}
void OnTargetTeamUpdated(AActor *Actor, FAIStimulus Stimulus)

◆ TargetTouchUpdated()

void ACustomAIController::TargetTouchUpdated ( AActor * Actor,
const FAIStimulus & Stimulus )
protected
593{
594 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::TargetTouchUpdated);
595 if(Actor == nullptr){return;}
596 if(AITraitsComponentReference != nullptr && Stimulus.WasSuccessfullySensed())
597 {
598 AITraitsComponentReference->TouchedByActor(Actor, Stimulus);
599 }
600 OnTargetTouchUpdated(Actor, Stimulus);
601}
void OnTargetTouchUpdated(AActor *Actor, FAIStimulus Stimulus)

◆ UpdateMovementSpeed()

void ACustomAIController::UpdateMovementSpeed ( const EAIMovementSpeed MovementSpeed = EAIMovementSpeed::Running,
const EAIMovementType MovementType = EAIMovementType::Normal )
overrideprotectedvirtual

Implements IAIActionsInterface.

278{
279 if(CustomAICharacter != nullptr)
280 {
281 CustomAICharacter->UpdateMovementSpeed(MovementSpeed, MovementType);
282 return;
283 }
284 if(bDebuggingMode){UE_LOG(LogCustomCharacters, Error, TEXT("UpdateMovementSpeed Failed in Custom AI Controller"));}
285}
virtual void UpdateMovementSpeed(const EAIMovementSpeed MovementSpeed=EAIMovementSpeed::Running, const EAIMovementType MovementType=EAIMovementType::Normal) override
Definition CustomAICharacter.cpp:765

◆ UpdatePerceptionDetails()

void ACustomAIController::UpdatePerceptionDetails ( ) const
102{
103 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomAIController::UpdatePerceptionDetails);
104 if(AIPerceptionComponent != nullptr && AITraitsComponentReference != nullptr)
105 {
107 //@BUG Max Age Doesn't Work in the Perception System //
108 //@see https://forums.unrealengine.com/t/aiperception-max-age-broken-or-not-implemented-correctly-while-setting-up-senses-in-editor/318932
109 // AIPerceptionComponent->SetMaxAge(HearingConfig->StaticClass(), AITraitsComponentReference->GetHearingMaxAge());
110 // AIPerceptionComponent->SetMaxAge(SightConfig->StaticClass(), AITraitsComponentReference->GetSightMaxAge());
111 // AIPerceptionComponent->SetHearingMaxAge(AITraitsComponentReference->GetHearingMaxAge());
117 // AIPerceptionComponent->SetSightMaxAge(AITraitsComponentReference->GetSightMaxAge());
118 // SetNearClippingRadius
119
120 const EDifficultyLevel DifficultyLevel = UMenuBPLib::GetCurrentDifficultyLevel(this);
121 switch (DifficultyLevel) {
123 AIPerceptionComponent->SetSenseEnabled(UAISense_Actions::StaticClass(), false);
124 AIPerceptionComponent->SetSenseEnabled(UAISense_Hearing::StaticClass(), false);
125 break;
127 AIPerceptionComponent->SetSenseEnabled(UAISense_Actions::StaticClass(), false);
128 AIPerceptionComponent->SetSenseEnabled(UAISense_Hearing::StaticClass(), false);
129 break;
131 AIPerceptionComponent->SetSenseEnabled(UAISense_Actions::StaticClass(), false);
132 AIPerceptionComponent->SetSenseEnabled(UAISense_Hearing::StaticClass(), true);
133 break;
135 AIPerceptionComponent->SetSenseEnabled(UAISense_Actions::StaticClass(), true);
136 AIPerceptionComponent->SetSenseEnabled(UAISense_Hearing::StaticClass(), true);
137 break;
139 AIPerceptionComponent->SetSenseEnabled(UAISense_Actions::StaticClass(), true);
140 AIPerceptionComponent->SetSenseEnabled(UAISense_Hearing::StaticClass(), true);
141 break;
143 AIPerceptionComponent->SetSenseEnabled(UAISense_Actions::StaticClass(), true);
144 AIPerceptionComponent->SetSenseEnabled(UAISense_Hearing::StaticClass(), true);
145 break;
146 }
147 }
148}
EDifficultyLevel
Definition BaseData.h:1052
bool SetPOVBackwardOffset(const float POVBackwardOffset)
Definition AdvancedAIPerceptionComponent.cpp:773
bool SetSightRange(const float SightRange)
Definition AdvancedAIPerceptionComponent.cpp:666
bool SetHearingRange(const float HearingRange)
Definition AdvancedAIPerceptionComponent.cpp:830
bool SetLoseSightRange(const float LoseSightRange)
Definition AdvancedAIPerceptionComponent.cpp:693
bool SetAutoSuccessRange(const float AutoSuccessRange)
Definition AdvancedAIPerceptionComponent.cpp:746
bool SetVisionAngle(const float VisionAngle)
Definition AdvancedAIPerceptionComponent.cpp:723
static EDifficultyLevel GetCurrentDifficultyLevel(const UObject *WorldContextObject)
Definition MenuBPLib.cpp:38

Member Data Documentation

◆ ActionsConfig

class UAISenseConfig_Actions* ACustomAIController::ActionsConfig
protected

◆ AIPerceptionComponent

class UAdvancedAIPerceptionComponent* ACustomAIController::AIPerceptionComponent
protected

◆ AITraitsComponentReference

class UAITraitsComponent* ACustomAIController::AITraitsComponentReference
protected

◆ bDebuggingMode

bool ACustomAIController::bDebuggingMode = false
protected

◆ Behaviour

TObjectPtr<UBehaviorTree> ACustomAIController::Behaviour = nullptr
protected

◆ CustomAICharacter

class ACustomAICharacter* ACustomAIController::CustomAICharacter = nullptr
protected

◆ DamageConfig

class UAISenseConfig_Damage* ACustomAIController::DamageConfig
protected

◆ HearingConfig

class UAISenseConfig_Hearing* ACustomAIController::HearingConfig
protected

◆ MyTeamID

FGenericTeamId ACustomAIController::MyTeamID

◆ PredictionConfig

class UAISenseConfig_Prediction* ACustomAIController::PredictionConfig
protected

◆ SightConfig

class UAISenseConfig_Sight* ACustomAIController::SightConfig
protected

◆ TeamConfig

class UAISenseConfig_Team* ACustomAIController::TeamConfig
protected

◆ TeamID

uint8 ACustomAIController::TeamID = 2
protected

The documentation for this class was generated from the following files: