#include "BearTrap.h"
#include "Engine/HitResult.h"
#include "Net/UnrealNetwork.h"
#include "BoxPlayerOverlapComponent.h"
#include "CapsulePlayerOverlapComponent.h"
#include "Components/BoxComponent.h"
#include "DBDOutlineComponent.h"
#include "BearTrapOutlineUpdateStrategy.h"
#include "MapActorComponent.h"
#include "Components/SphereComponent.h"
#include "MontagePlayer.h"
#include "DBDNavModifierComponent.h"
#include "AnimationMontageSlave.h"

class ADBDPlayer;
class UAnimMontage;
class UPrimitiveComponent;
class AActor;
class UInteractionDefinition;
class UInteractor;
class UBearTrapAnimInstance;
class ASurvivor;

void ABearTrap::TrySetTrappedPlayer(ADBDPlayer* player)
{

}

void ABearTrap::SetTrappedPlayerSinceMoved(bool didTrap)
{

}

void ABearTrap::SetTrappedPlayer(ADBDPlayer* trappedPlayer)
{

}

void ABearTrap::PlayMontage(UAnimMontage* montage) const
{

}

void ABearTrap::OnTrappedPlayerPickedUp(ADBDPlayer* picker)
{

}

void ABearTrap::OnTrappedInjuredBleedoutKO(ADBDPlayer* injuredBleedoutInstigator)
{

}

void ABearTrap::OnTrapDetectionZoneOverlapEnd(UPrimitiveComponent* overlappedComponent, AActor* otherActor, UPrimitiveComponent* otherComp, int32 otherBodyIndex)
{

}

void ABearTrap::OnTrapDetectionZoneOverlapBegin(UPrimitiveComponent* overlappedComponent, AActor* otherActor, UPrimitiveComponent* otherComp, int32 otherBodyIndex, bool bFromSweep, const FHitResult& sweepResult)
{

}

void ABearTrap::OnSafetyZoneEndOverlap(UPrimitiveComponent* overlappedComponent, AActor* otherActor, UPrimitiveComponent* otherComp, int32 otherBodyIndex)
{

}

void ABearTrap::OnRep_OwningPlayerState()
{

}

void ABearTrap::OnLevelReadyToPlay_Implementation()
{

}

void ABearTrap::OnGuidedStateChanged()
{

}

void ABearTrap::OnCollectUpdateStart()
{

}

void ABearTrap::OnCollectUpdateEnd()
{

}

bool ABearTrap::IsTrapperOutOfSafetyZone() const
{
	return false;
}

void ABearTrap::InitializeTrapSurvivorInteraction(UInteractionDefinition* interaction)
{

}

void ABearTrap::InitializeTrapKillerInteraction(UInteractionDefinition* interaction)
{

}

void ABearTrap::InitializeMainInteractor(UInteractor* interactor)
{

}

bool ABearTrap::HasTrappedPlayerSinceMoved() const
{
	return false;
}

bool ABearTrap::HasTrappedPlayer() const
{
	return false;
}

ADBDPlayer* ABearTrap::GetTrappedPlayer() const
{
	return NULL;
}

int32 ABearTrap::GetSelfUntrapAttemptsRemaining() const
{
	return 0;
}

int32 ABearTrap::GetMaximumAttemptsForSelfUntrap() const
{
	return 0;
}

UBearTrapAnimInstance* ABearTrap::GetAnimInstance() const
{
	return NULL;
}

void ABearTrap::Authority_ImposeRevealAuraEffect(ASurvivor* survivor)
{

}

void ABearTrap::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	DOREPLIFETIME(ABearTrap, _selfUntrapAttemptsRemaining);
	DOREPLIFETIME(ABearTrap, _owningPlayerState);
}

ABearTrap::ABearTrap()
{
	this->_interactionVolume = CreateDefaultSubobject<UBoxPlayerOverlapComponent>(TEXT("Interaction Volume"));
	this->_trapPlayerDetectionZone = CreateDefaultSubobject<UCapsulePlayerOverlapComponent>(TEXT("Trap Player Detection Zone"));
	this->_killerSafetyZoneComponent = CreateDefaultSubobject<UBoxComponent>(TEXT("Killer Safety Zone Component"));
	this->_outlineComponent = CreateDefaultSubobject<UDBDOutlineComponent>(TEXT("Outline Component"));
	this->_outlineUpdateStrategy = CreateDefaultSubobject<UBearTrapOutlineUpdateStrategy>(TEXT("Outline Update Strategy"));
	this->_mapActorComponent = CreateDefaultSubobject<UMapActorComponent>(TEXT("Map Actor Component"));
	this->_mapActorCollision = CreateDefaultSubobject<USphereComponent>(TEXT("Map Actor Collision"));
	this->_trapBlocker = CreateDefaultSubobject<USphereComponent>(TEXT("Trap Blocker"));
	this->_montagePlayer = CreateDefaultSubobject<UMontagePlayer>(TEXT("Montage Player Component"));
	this->_revealWhileTrappedStatusEffectClass = NULL;
	this->_dangerNavModifierComponent = CreateDefaultSubobject<UDBDNavModifierComponent>(TEXT("DangerNavModifierComponent"));
	this->_isTrapperOutOfSafetyZone = true;
	this->_maximumAttemptsForSelfUntrap = 6;
	this->_selfUntrapAttemptsRemaining = 0;
	this->_animationMontageSlave = CreateDefaultSubobject<UAnimationMontageSlave>(TEXT("Animation Montage Slave"));
}
