-
Notifications
You must be signed in to change notification settings - Fork 4
/
Spawner.cpp
127 lines (97 loc) · 3.29 KB
/
Spawner.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Fill out your copyright notice in the Description page of Project Settings.
#include "Spawner.h"
#include "Helpers.h"
#include "QTree.h"
#include "SpawnPoint.h"
#include "Runtime/Engine/Classes/GameFramework/Actor.h"
#include "Runtime/Engine/Classes/Engine/World.h"
#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"
#include "Runtime/Engine/Public/EngineUtils.h"
// Sets default values
ASpawner::ASpawner()
{
PrimaryActorTick.bCanEverTick = true;
bAutoAddAllSpawnPoints = true;
tree = new QTree();
tree->bCanExpandBounds = true;
}
AActor* ASpawner::SpawnAtNearestLocation(FVector2D Location, TSubclassOf<AActor> ActorToSpawn)
{
AActor *spawnedAct = NULL;
AActor *nearestSpawnPoint = tree->FindNearest(Location);
FActorSpawnParameters params;
if (nearestSpawnPoint)
spawnedAct = GetWorld()->SpawnActorAbsolute(ActorToSpawn, nearestSpawnPoint->GetActorTransform(), params);
else
UE_LOG(LogTemp, Error, TEXT("No spawn point in tree found"));
return spawnedAct;
}
void ASpawner::SpawnAtNearestLocation(FVector2D Location, TSubclassOf<AActor> ActorToSpawn, AActor* &SpawnedActor_out, ESpawnActorCollisionHandlingMethod SpawnMethod)
{
AActor *spawnedAct = NULL;
AActor *nearestSpawnPoint = tree->FindNearest(Location);
FActorSpawnParameters params;
params.SpawnCollisionHandlingOverride = SpawnMethod;
if (nearestSpawnPoint)
spawnedAct = GetWorld()->SpawnActorAbsolute(ActorToSpawn, nearestSpawnPoint->GetActorTransform(), params);
else
UE_LOG(LogTemp, Error, TEXT("No spawn point in tree found"));
SpawnedActor_out = spawnedAct;
}
AActor* ASpawner::SpawnAtRandomLocation(TSubclassOf<AActor> ActorToSpawn)
{
AActor *spawnedAct = NULL;
TArray<AActor *> AllSpawnPoints = tree->GetAllActors();
if (AllSpawnPoints.Num() < 1)
{
UE_LOG(LogTemp, Error, TEXT("No spawn point in tree found"));
return NULL;
}
int size = AllSpawnPoints.Num();
int randIndex = FMath::RandRange(0, size - 1);
FActorSpawnParameters params;
spawnedAct = GetWorld()->SpawnActorAbsolute(ActorToSpawn, AllSpawnPoints[randIndex]->GetActorTransform(), params);
return spawnedAct;
}
void ASpawner::SpawnAtRandomLocation(TSubclassOf<AActor> ActorToSpawn, AActor* &SpawnedActor_out, ESpawnActorCollisionHandlingMethod SpawnMethod)
{
AActor *spawnedAct = NULL;
TArray<AActor *> AllSpawnPoints = tree->GetAllActors();
if (AllSpawnPoints.Num() < 1)
{
UE_LOG(LogTemp, Error, TEXT("No spawn point in tree found"));
SpawnedActor_out = NULL;
return;
}
int size = AllSpawnPoints.Num();
int randIndex = FMath::RandRange(0, size - 1);
FActorSpawnParameters params;
params.SpawnCollisionHandlingOverride = SpawnMethod;
spawnedAct = GetWorld()->SpawnActorAbsolute(ActorToSpawn, AllSpawnPoints[randIndex]->GetActorTransform(), params);
SpawnedActor_out = spawnedAct;
}
// Called when the game starts or when spawned
void ASpawner::BeginPlay()
{
// Only add custom spawn points if the list is filled
if(SpawnPoints.Num() > 0)
tree->Add(SpawnPoints);
// Add all spawn points placed in level
if (bAutoAddAllSpawnPoints)
{
for (TActorIterator<ASpawnPoint> actItr(GetWorld()); actItr; ++actItr)
{
tree->Add(*actItr);
}
}
Super::BeginPlay();
}
TArray<AActor*> ASpawner::GetAllSpawnPoints()
{
return tree->GetAllActors();
}
// Called every frame
void ASpawner::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}