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

#include <AISpawnLocation.h>

Inheritance diagram for AAISpawnLocation:

Public Member Functions

 AAISpawnLocation ()
 
void AIDeath (AActor *OwningActor, EDeathType DeathType, AActor *DeathCauser, AController *DeathInstigator)
 
void SetSpawnLocationData (const FAISpawnLocationData Data)
 

Public Attributes

FOnAISpawned OnAISpawned
 
FOnFinishedSpawning OnFinishedSpawning
 

Protected Member Functions

virtual void BeginPlay () override
 
virtual void OnConstruction (const FTransform &Transform) override
 

Protected Attributes

class USceneComponent * SceneRoot
 
class UBillboardComponent * PreviewIcon
 
class USphereComponent * TriggerAreaComponent
 
class USphereComponent * SpawnAreaComponent
 
float SpawnRadius = 400.0f
 
float SpawnDistance = 2000.0f
 
FAISpawnLocationData AISpawnLocationData
 
bool bDebuggingMode = false
 
TArray< APawn * > SpawnedAI
 
float SpawnDelayCheck = 2.0f
 

Private Member Functions

FVector GetRandomSpawnLocation (TArray< FVector > &Locations)
 
FVector GetRandomSpawnLocationInArea (TArray< FVector > &Locations)
 
bool IsPointInsideSphere (const FVector &Point, const USphereComponent *Sphere)
 
void CheckAISpawnData ()
 
void RemoveVisualizers () const
 
void SetRandomNumber ()
 
void CheckForSpawn ()
 
void SpawnAI ()
 
void SpawnAICharacter (FAISpawnLocationData &SpawnLocationData)
 

Private Attributes

FTimerHandle InitialDelayTimerHandle
 
FTimerHandle NextSpawnTimerHandle
 
FTimerHandle DestroyTimerHandle
 
int32 LastUsedLocationIndex = -1
 

Constructor & Destructor Documentation

◆ AAISpawnLocation()

AAISpawnLocation::AAISpawnLocation ( )
14{
15 PrimaryActorTick.bCanEverTick = false;
16 SceneRoot = CreateDefaultSubobject<USceneComponent>("Root");
17 RootComponent = SceneRoot;
18 PreviewIcon = CreateDefaultSubobject<UBillboardComponent>("Icon");
19 PreviewIcon->SetupAttachment(SceneRoot);
20 TriggerAreaComponent = CreateDefaultSubobject<USphereComponent>("Trigger Area");
21 TriggerAreaComponent->SetupAttachment(SceneRoot);
22 TriggerAreaComponent->InitSphereRadius(SpawnDistance);
23 SpawnAreaComponent = CreateDefaultSubobject<USphereComponent>("Spawn Area");
24 SpawnAreaComponent->SetupAttachment(SceneRoot);
25 SpawnAreaComponent->InitSphereRadius(SpawnRadius);
26}
class USceneComponent * SceneRoot
Definition AISpawnLocation.h:44
class UBillboardComponent * PreviewIcon
Definition AISpawnLocation.h:46
class USphereComponent * SpawnAreaComponent
Definition AISpawnLocation.h:50
float SpawnDistance
Definition AISpawnLocation.h:57
float SpawnRadius
Definition AISpawnLocation.h:54
class USphereComponent * TriggerAreaComponent
Definition AISpawnLocation.h:48

Member Function Documentation

◆ AIDeath()

void AAISpawnLocation::AIDeath ( AActor * OwningActor,
EDeathType DeathType,
AActor * DeathCauser,
AController * DeathInstigator )
213{
214 if(OwningActor != nullptr)
215 {
216 APawn* SpawnedPawn = Cast<APawn>(OwningActor);
217 if(SpawnedPawn == nullptr){return;}
218
219 if(SpawnedAI.Contains(SpawnedPawn))
220 {
221 SpawnedAI.Remove(SpawnedPawn);
222 }
223 }
224}
TArray< APawn * > SpawnedAI
Definition AISpawnLocation.h:64

◆ BeginPlay()

void AAISpawnLocation::BeginPlay ( )
overrideprotectedvirtual
30{
31 Super::BeginPlay();
33 GetWorld()->GetTimerManager().SetTimer(DestroyTimerHandle, this, &AAISpawnLocation::CheckAISpawnData, SpawnDelayCheck);
34 // if(AISpawnLocationData.bUseSpawnLocations)
35 // {
36 //
37 // if(AISpawnLocationData.bUseSpawnLocationsGlobal)
38 // {
39 //
40 // }
41 // }
42 // TArray<AActor> OverlappingActors;
43 // GetOverlappingActors()
44}
void RemoveVisualizers() const
Definition AISpawnLocation.cpp:63
FTimerHandle DestroyTimerHandle
Definition AISpawnLocation.h:87
float SpawnDelayCheck
Definition AISpawnLocation.h:67
void CheckAISpawnData()
Definition AISpawnLocation.cpp:55

◆ CheckAISpawnData()

void AAISpawnLocation::CheckAISpawnData ( )
private
56{
57 //- If We dont have any spawn data, Destroy the actor //
58 if(AISpawnLocationData.ActorToSpawn == nullptr){UE_LOG(LogAIToolKit, Error, TEXT("Actor to Spawn NULL"))Destroy();return;}
60 GetWorld()->GetTimerManager().SetTimer(InitialDelayTimerHandle, this, &AAISpawnLocation::CheckForSpawn, AISpawnLocationData.InitialDelay);
61}
Definition AISpawnLocation.h:17
FAISpawnLocationData AISpawnLocationData
Definition AISpawnLocation.h:59
FTimerHandle InitialDelayTimerHandle
Definition AISpawnLocation.h:85
void CheckForSpawn()
Definition AISpawnLocation.cpp:94
void SetRandomNumber()
Definition AISpawnLocation.cpp:80
TSubclassOf< APawn > ActorToSpawn
Definition AIDataTypes.h:715

◆ CheckForSpawn()

void AAISpawnLocation::CheckForSpawn ( )
private
95{
96 // if(/*Distance to player*/ 1.0f < SpawnDistance)
97 // {
99 {
100 SpawnAI();
101 }
102 // }
103}
void SpawnAI()
Definition AISpawnLocation.cpp:105
int32 AmountToSpawn
Definition AIDataTypes.h:717

◆ GetRandomSpawnLocation()

FVector AAISpawnLocation::GetRandomSpawnLocation ( TArray< FVector > & Locations)
private
121{
122 if(Locations.Num() == 0)
123 {
124 return FVector::Zero();
125 }
126 if(Locations.Num() == 1)
127 {
128 return Locations[0];
129 }
130 int32 LocationIndex = UKismetMathLibrary::RandomIntegerInRange(0, Locations.Num());
131 if(LocationIndex == LastUsedLocationIndex)
132 {
133 LocationIndex = UKismetMathLibrary::RandomIntegerInRange(0, Locations.Num());
134 }
135 LastUsedLocationIndex = LocationIndex;
136 return Locations[LocationIndex];
137}
int32 LastUsedLocationIndex
Definition AISpawnLocation.h:89

◆ GetRandomSpawnLocationInArea()

FVector AAISpawnLocation::GetRandomSpawnLocationInArea ( TArray< FVector > & Locations)
private
154{
155 TArray<FVector> SpawnLocations;
156 for(const FVector& Location : Locations)
157 {
159 {
160 SpawnLocations.Add(Location);
161 }
162 }
163 return GetRandomSpawnLocation(SpawnLocations);
164}
FVector GetRandomSpawnLocation(TArray< FVector > &Locations)
Definition AISpawnLocation.cpp:120
bool IsPointInsideSphere(const FVector &Point, const USphereComponent *Sphere)
Definition AISpawnLocation.cpp:139

◆ IsPointInsideSphere()

bool AAISpawnLocation::IsPointInsideSphere ( const FVector & Point,
const USphereComponent * Sphere )
private
140{
141 if(Sphere == nullptr){return false;}
142
143 const float Radius = Sphere->GetScaledSphereRadius();
144 const FVector SphereCenter = Sphere->GetComponentLocation();
145
146 // Calculate the squared distance from the point to the sphere's center
147 const float DistSquared = FVector::DistSquared(Point, SphereCenter);
148
149 // Check if the squared distance is less than or equal to the squared radius
150 return DistSquared <= FMath::Square(Radius);
151}

◆ OnConstruction()

void AAISpawnLocation::OnConstruction ( const FTransform & Transform)
overrideprotectedvirtual
47{
48 Super::OnConstruction(Transform);
49 SpawnAreaComponent->SetSphereRadius(SpawnRadius);
50 TriggerAreaComponent->SetSphereRadius(SpawnDistance);
51}

◆ RemoveVisualizers()

void AAISpawnLocation::RemoveVisualizers ( ) const
private
64{
66 {
67 SpawnAreaComponent->bHiddenInGame = false;
68 SpawnAreaComponent->SetVisibility(true);
69 TriggerAreaComponent->SetVisibility(true);
70 TriggerAreaComponent->bHiddenInGame = false;
71 return;
72 }
73 PreviewIcon->DestroyComponent();
74 // SpawnAreaComponent->DestroyComponent();
75 SpawnAreaComponent->bHiddenInGame = true;
76 SpawnAreaComponent->SetVisibility(false);
77 TriggerAreaComponent->DestroyComponent();
78}
bool bDebuggingMode
Definition AISpawnLocation.h:61

◆ SetRandomNumber()

void AAISpawnLocation::SetRandomNumber ( )
private
81{
82 //- if using Random number replace the data //
84 {
85 const int32 RandomAmount = UKismetMathLibrary::RandomIntegerInRange(AISpawnLocationData.SpawnMin, AISpawnLocationData.SpawnMin);
90 }
91}
bool bUseRandomSpawnNumber
Definition AIDataTypes.h:744
int32 SpawnMax
Definition AIDataTypes.h:748
int32 SpawnMin
Definition AIDataTypes.h:746

◆ SetSpawnLocationData()

void AAISpawnLocation::SetSpawnLocationData ( const FAISpawnLocationData Data)
inline
35{AISpawnLocationData = Data;};

◆ SpawnAI()

void AAISpawnLocation::SpawnAI ( )
private
106{
108 const float TimeTillNextSpawn = UKismetMathLibrary::RandomFloatInRange(AISpawnLocationData.TimeBetweenSpawnsMin, AISpawnLocationData.TimeBetweenSpawnsMax);
110 {
111 GetWorld()->GetTimerManager().SetTimer(NextSpawnTimerHandle, this, &AAISpawnLocation::SpawnAI, TimeTillNextSpawn);
112 }
113 else
114 {
115 // if(bDebuggingMode){UE_LOG(LogAIToolKit, Warning, TEXT("ON finished??"));}
116 OnFinishedSpawning.Broadcast(this);
117 }
118}
FTimerHandle NextSpawnTimerHandle
Definition AISpawnLocation.h:86
FOnFinishedSpawning OnFinishedSpawning
Definition AISpawnLocation.h:26
void SpawnAICharacter(FAISpawnLocationData &SpawnLocationData)
Definition AISpawnLocation.cpp:166
float TimeBetweenSpawnsMax
Definition AIDataTypes.h:723
float TimeBetweenSpawnsMin
Definition AIDataTypes.h:721

◆ SpawnAICharacter()

void AAISpawnLocation::SpawnAICharacter ( FAISpawnLocationData & SpawnLocationData)
private
167{
168 if(SpawnLocationData.ActorToSpawn == nullptr){UE_LOG(LogAIToolKit,Error,TEXT("No Actor to Spawn in AISpawnLocation"));return;}
169 FVector RandomSpawnLocation = FVector::Zero();
170 if(SpawnLocationData.bUseSpawnLocations)
171 {
172 if(!SpawnLocationData.SpawnLocations.IsEmpty())
173 {
174 if(SpawnLocationData.bUseSpawnLocationsGlobal)
175 {
176 RandomSpawnLocation = GetRandomSpawnLocation(SpawnLocationData.SpawnLocations);
177 }
178 else
179 {
180 RandomSpawnLocation = GetRandomSpawnLocationInArea(SpawnLocationData.SpawnLocations);
181 }
182 }
183 //@TODO Check if the locations are in the SpawnArea,
184 // GetRandomLocation
185 }
186 //@TODO rotation possibly screwing up aLS??
187 const float SpawnRotationZ = UKismetMathLibrary::RandomFloatInRange(0.0f, 360.0f);
188 const FRotator SpawnRotation = FRotator(0.0f, SpawnRotationZ, 0.0f);
189 FNavLocation SpawnLocation;
190 if(RandomSpawnLocation != FVector::Zero())
191 {
192 SpawnLocation = FNavLocation(RandomSpawnLocation);
193 }
194 else
195 {
196 const UNavigationSystemV1* NavSystemV1 = FNavigationSystem::GetCurrent<UNavigationSystemV1>(GetWorld());
197 if(NavSystemV1 == nullptr){UE_LOG(LogAIToolKit,Warning,TEXT("Navigation System Failed in AI Spawner"));return;}
198 const bool bSuccess = NavSystemV1->GetRandomReachablePointInRadius(SpawnAreaComponent->GetComponentLocation(), SpawnAreaComponent->GetScaledSphereRadius(), SpawnLocation);
199 if(!bSuccess)
200 {
201 if(bDebuggingMode){UE_LOG(LogAIToolKit, Error, TEXT("Random Point Failed"));}
202 return;
203 }
204 }
205 APawn* SpawnedPawn = UAIBlueprintHelperLibrary::SpawnAIFromClass(this, SpawnLocationData.ActorToSpawn,nullptr, SpawnLocation, SpawnRotation, true, this);
206 if(SpawnedPawn == nullptr){if(bDebuggingMode){UE_LOG(LogAIToolKit, Error, TEXT("Spawn Failed"));}return;}
207
208 OnAISpawned.Broadcast(SpawnedPawn, this);
209 SpawnedAI.Add(SpawnedPawn);
210}
FVector GetRandomSpawnLocationInArea(TArray< FVector > &Locations)
Definition AISpawnLocation.cpp:153
FOnAISpawned OnAISpawned
Definition AISpawnLocation.h:24
bool bUseSpawnLocationsGlobal
Definition AIDataTypes.h:740
TArray< FVector > SpawnLocations
Definition AIDataTypes.h:742
bool bUseSpawnLocations
Definition AIDataTypes.h:738

Member Data Documentation

◆ AISpawnLocationData

FAISpawnLocationData AAISpawnLocation::AISpawnLocationData
protected

◆ bDebuggingMode

bool AAISpawnLocation::bDebuggingMode = false
protected

◆ DestroyTimerHandle

FTimerHandle AAISpawnLocation::DestroyTimerHandle
private

◆ InitialDelayTimerHandle

FTimerHandle AAISpawnLocation::InitialDelayTimerHandle
private

◆ LastUsedLocationIndex

int32 AAISpawnLocation::LastUsedLocationIndex = -1
private

◆ NextSpawnTimerHandle

FTimerHandle AAISpawnLocation::NextSpawnTimerHandle
private

◆ OnAISpawned

FOnAISpawned AAISpawnLocation::OnAISpawned

◆ OnFinishedSpawning

FOnFinishedSpawning AAISpawnLocation::OnFinishedSpawning

◆ PreviewIcon

class UBillboardComponent* AAISpawnLocation::PreviewIcon
protected

◆ SceneRoot

class USceneComponent* AAISpawnLocation::SceneRoot
protected

◆ SpawnAreaComponent

class USphereComponent* AAISpawnLocation::SpawnAreaComponent
protected

◆ SpawnDelayCheck

float AAISpawnLocation::SpawnDelayCheck = 2.0f
protected

◆ SpawnDistance

float AAISpawnLocation::SpawnDistance = 2000.0f
protected

◆ SpawnedAI

TArray<APawn*> AAISpawnLocation::SpawnedAI
protected

◆ SpawnRadius

float AAISpawnLocation::SpawnRadius = 400.0f
protected

◆ TriggerAreaComponent

class USphereComponent* AAISpawnLocation::TriggerAreaComponent
protected

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