-
Notifications
You must be signed in to change notification settings - Fork 0
/
TankAIController.cpp
77 lines (57 loc) · 1.81 KB
/
TankAIController.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
// Copyright Arnaud D_ORCHYMONT
#include "BattleTank.h"
#include "TankAIController.h"
#include "Tank.h"
#include "AimingComponent.h"
//Depends on movement component via pathfinding system
ATankAIController::ATankAIController() {
controlledPawn = nullptr;
playerTank = nullptr;
tankAimingComponent = nullptr;
playerTankLocation = { 0.0,0.0,0.0 };
}
void ATankAIController::BeginPlay() {
Super::BeginPlay();
controlledPawn = GetControlledPawn();
playerTank = GetPlayerTank();
if (ensure(controlledPawn)) {
tankAimingComponent = controlledPawn->FindComponentByClass<UAimingComponent>();
}
}
void ATankAIController::SetPawn(APawn* InPawn) {
Super::SetPawn(InPawn);
if (InPawn) {
auto possessedTank = Cast <ATank>(InPawn); //TODO: Take into account that tankAIController is also user by Mortars
if (ensure(possessedTank)) {
possessedTank->onTankDeath.AddUniqueDynamic(this, &ATankAIController::onTankDeath);
}
}
}
// Called every frame
void ATankAIController::Tick(float DeltaTime) {
Super::Tick(DeltaTime);
if (playerTank && controlledPawn) {
//Movement
MoveToActor(playerTank, 8000.0); // stay at least at 8 000 m from player Tank
// Fire
playerTankLocation = playerTank->GetTargetLocation();
if (ensure(tankAimingComponent)) {
tankAimingComponent->AimAt(playerTankLocation, 10000);
if (tankAimingComponent->getFiringState() == EFiringState::isReady) {
tankAimingComponent->Fire();
}
}
}
}
APawn* ATankAIController::GetControlledPawn() const {
return GetPawn();
}
ATank* ATankAIController::GetPlayerTank() const {
return Cast <ATank>(GetWorld()->GetFirstPlayerController()->GetPawn());
}
void ATankAIController::onTankDeath() {
UE_LOG(LogTemp, Warning, TEXT("AI control on tank removed"));
if (ensure(controlledPawn)) {
controlledPawn->DetachFromControllerPendingDestroy();
}
}