haxis/Source/UnrealProject/Spawners/KOTHSpawnerBase.cpp

132 lines
2.8 KiB
C++

// Project Lab - NHTV Igad
#include "UnrealProject.h"
#include "KOTHSpawnerBase.h"
#include "NetworkPlayer.h"
#include "KOTHBossSpawner.h"
AKOTHSpawnerBase::AKOTHSpawnerBase(const FObjectInitializer& init)
{
captureRadius = 500;
captureTime = 30;
possesionTime = 1;
captureParticle = CreateDefaultSubobject<UParticleSystemComponent>("PossessParticle");
captureParticle->AttachTo(RootComponent);
}
void AKOTHSpawnerBase::BeginPlay()
{
Super::BeginPlay();
// Assign team
m_currentTeam = (int)team;
beingCaptured = false;
}
void AKOTHSpawnerBase::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// Run capture polling code on host
if(Role == ROLE_Authority)
{
if(beingCaptured)
{
bool capture = false;
auto nearbyPlayers = GetNearbyPlayers();
// Check contested condition
if (m_mobCount == 0 && (nearbyPlayers.Num() <= 2))
{
if (nearbyPlayers.Num() > 0 && !IsContested(nearbyPlayers[0]->GetTeam()) && (int)team != nearbyPlayers[0]->GetTeam())
{
capture = true;
if (bossSpawner)
{
if ((int)bossSpawner->team == nearbyPlayers[0]->GetTeam() || (int)team < 5)
{
capture = false;
}
}
}
}
if(capture)
{
m_possesionTimer += DeltaTime;
if(m_possesionTimer > possesionTime)
{
// Nearby team captures camp
m_ExeCaptureCamp(nearbyPlayers[0]->GetTeam());
}
}
else
{
m_possesionTimer = 0;
}
}
}
}
void AKOTHSpawnerBase::m_ExeCaptureCamp_Implementation(int32 targetTeam)
{
if(Role == ROLE_Authority)
{
SetTeam(targetTeam);
onCampCaptured.Broadcast(targetTeam);
m_captureTimer = captureTime;
m_currentTeam = (int)NPCTeam::Team1;
beingCaptured = false;
m_reset = false;
}
// Callback
OnEndCaptureCamp(targetTeam);
onEndCapture.Broadcast(targetTeam);
// Deactivate capture particle
captureParticle->DeactivateSystem();
}
void AKOTHSpawnerBase::m_OnCampCleared()
{
Super::m_OnCampCleared();
if(Role == ROLE_Authority)
{
beingCaptured = true;
}
// Callback
OnBeginCaptureCamp();
onBeginCapture.Broadcast();
// Enable capture particle
if(captureParticle->Template)
{
captureParticle->bAutoDestroy = false;
captureParticle->ResetParticles();
captureParticle->ActivateSystem();
}
}
void AKOTHSpawnerBase::CaptureCamp(int targetTeam)
{
Super::CaptureCamp(targetTeam);
m_currentTeam = targetTeam;
m_possesionTimer = 0;
}
bool AKOTHSpawnerBase::IsContested(int32 targetTeam) const
{
for(ANetworkCharacter* character : m_nearbyPlayers)
{
ANetworkPlayer* player = Cast<ANetworkPlayer>(character);
if(player && player->GetTeam() != targetTeam && FVector::DistSquared(GetActorLocation(), player->GetActorLocation()) < captureRadius * captureRadius)
return true;
}
return false;
}