106 lines
2.9 KiB
C++
106 lines
2.9 KiB
C++
// Project Lab - NHTV Igad
|
|
|
|
#include "UnrealProject.h"
|
|
#include "NetworkPossessable.h"
|
|
#include "DefaultPlayerController.h"
|
|
|
|
|
|
// Sets default values
|
|
ANetworkPossessable::ANetworkPossessable()
|
|
{
|
|
|
|
}
|
|
|
|
// Called every frame
|
|
void ANetworkPossessable::Tick( float DeltaTime )
|
|
{
|
|
Super::Tick( DeltaTime );
|
|
|
|
m_UpdateCamera();
|
|
}
|
|
|
|
|
|
void ANetworkPossessable::AddMovementInput(FVector WorldDirection, float ScaleValue /*= 1.0f*/, bool bForce /*= false*/)
|
|
{
|
|
check(!WorldDirection.ContainsNaN());
|
|
check(!FMath::IsNaN(ScaleValue));
|
|
if(m_AllowedToMove())
|
|
Super::AddMovementInput(WorldDirection, ScaleValue, bForce);
|
|
}
|
|
void ANetworkPossessable::SetCharacterRotation(FRotator rotator)
|
|
{
|
|
if (m_AllowedToRotate())
|
|
SetActorRotation(rotator);
|
|
if(Role != ROLE_Authority)
|
|
{
|
|
m_SetCharacterRotation_Server(rotator.Yaw);
|
|
}
|
|
}
|
|
void ANetworkPossessable::AddControllerYawInput(float Val)
|
|
{
|
|
if(m_AllowedToRotate())
|
|
Super::AddControllerYawInput(Val);
|
|
}
|
|
|
|
bool ANetworkPossessable::m_SetCharacterRotation_Server_Validate(float rotation)
|
|
{
|
|
return true;
|
|
}
|
|
void ANetworkPossessable::m_SetCharacterRotation_Server_Implementation(float rotation)
|
|
{
|
|
SetActorRotation(FRotator(0.0f, rotation, 0.0f));
|
|
}
|
|
|
|
|
|
bool ANetworkPossessable::m_AllowedToMove()
|
|
{
|
|
return true;
|
|
}
|
|
bool ANetworkPossessable::m_AllowedToRotate()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
|
|
void ANetworkPossessable::m_SetupCamera()
|
|
{
|
|
// Create a camera boom
|
|
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
|
|
CameraBoom->AttachTo(RootComponent);
|
|
CameraBoom->bAbsoluteRotation = true;
|
|
CameraBoom->TargetArmLength = 1500.f;
|
|
CameraBoom->RelativeRotation = FRotator(-60.f, 45.f, 0.f);
|
|
CameraBoom->bDoCollisionTest = false;
|
|
CameraBoom->bInheritPitch = false;
|
|
CameraBoom->bInheritYaw = false;
|
|
CameraBoom->bInheritRoll = false;
|
|
|
|
// Create a camera
|
|
TopDownCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("TopDownCamera"));
|
|
TopDownCamera->AttachTo(CameraBoom, USpringArmComponent::SocketName);
|
|
TopDownCamera->bUsePawnControlRotation = false;
|
|
|
|
// Don't rotate character to camera direction
|
|
bUseControllerRotationPitch = false;
|
|
bUseControllerRotationYaw = false;
|
|
bUseControllerRotationRoll = false;
|
|
}
|
|
void ANetworkPossessable::m_UpdateCamera()
|
|
{
|
|
if (!IsValid(CameraBoom)) return;
|
|
|
|
ADefaultPlayerController* const controller = Cast<ADefaultPlayerController>(GetController());
|
|
if (IsValid(controller))
|
|
{
|
|
// Ensure the camera does not fall under the ground
|
|
const FVector playerCoord = GetActorLocation();
|
|
if (playerCoord.Z < 0)
|
|
CameraBoom->SetRelativeLocation(FVector(0, 0, -playerCoord.Z));
|
|
else if (CameraBoom->GetComponentLocation().Z < 0)
|
|
CameraBoom->SetRelativeLocation(FVector());
|
|
|
|
// Update last position
|
|
if (GetCharacterMovement()->IsMovingOnGround())
|
|
controller->UpdatePlayerPosition(GetActorLocation(), GetActorRotation());
|
|
}
|
|
} |