91 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Project Lab - NHTV Igad
 | |
| 
 | |
| #include "UnrealProject.h"
 | |
| 
 | |
| #include "NetworkDoor.h"
 | |
| 
 | |
| 
 | |
| ANetworkDoor::ANetworkDoor()
 | |
| {
 | |
| 	PrimaryActorTick.bCanEverTick = true;
 | |
| 	debugColorCode = FColor::Red;
 | |
| 
 | |
| 	doorCollider = CreateDefaultSubobject<UBoxComponent>(TEXT("Cube"));
 | |
| 	doorCollider->SetCollisionProfileName(TEXT("BlockAll"));
 | |
| 	RootComponent = doorCollider;
 | |
| 
 | |
| 	meshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
 | |
| 	meshComponent->AttachTo(doorCollider);
 | |
| 
 | |
| 	isDoorClosed = true;
 | |
| 	closeAfterTime = 0.0f;
 | |
| 
 | |
| 	debugSinkDepth = 250;
 | |
| }
 | |
| 
 | |
| 
 | |
| void ANetworkDoor::BeginPlay()
 | |
| {
 | |
| 	Super::BeginPlay();
 | |
| 	m_openTime = 0.0f;
 | |
| }
 | |
| 
 | |
| void ANetworkDoor::Tick(float DeltaTime)
 | |
| {
 | |
| 	Super::Tick(DeltaTime);
 | |
| 
 | |
| 	if (doorCollider)
 | |
| 	{
 | |
| 		// Enable or disable the door collider
 | |
| 		doorCollider->SetCollisionEnabled(isDoorClosed ? ECollisionEnabled::QueryAndPhysics : ECollisionEnabled::NoCollision);
 | |
| 	}
 | |
| 
 | |
| 	if (meshComponent)
 | |
| 	{
 | |
| 		const FVector localPos = meshComponent->GetRelativeTransform().GetLocation();
 | |
| 		const FVector targetPos = FVector(0, 0, isDoorClosed ? 0.0f : -debugSinkDepth);
 | |
| 		
 | |
| 		const float distanceSqr = FVector::DistSquared(localPos, targetPos);
 | |
| 		if (distanceSqr > 0.01f)
 | |
| 		{
 | |
| 			FVector dif = targetPos - localPos;
 | |
| 			dif.Normalize();
 | |
| 			float speed = DeltaTime * 800 * (debugSinkDepth / 250.0f);
 | |
| 			const float distance = FMath::Sqrt(distanceSqr);
 | |
| 			if (speed > distance) speed = distance;
 | |
| 			dif *= speed;
 | |
| 			meshComponent->SetRelativeLocation(localPos + dif);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if(Role == ROLE_Authority && !isDoorClosed && closeAfterTime > 0)
 | |
| 	{
 | |
| 		m_openTime += DeltaTime;
 | |
| 		if(m_openTime >= closeAfterTime)
 | |
| 		{
 | |
| 			SetDoorState(true);
 | |
| 			m_openTime = 0.0f;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void ANetworkDoor::ToggleDoor()
 | |
| {
 | |
| 	// Server only function
 | |
| 	check(Role == ROLE_Authority);
 | |
| 	isDoorClosed = !isDoorClosed;
 | |
| }
 | |
| 
 | |
| void ANetworkDoor::SetDoorState(bool NewState)
 | |
| {
 | |
| 	// Server only function
 | |
| 	check(Role == ROLE_Authority);
 | |
| 	isDoorClosed = NewState;
 | |
| }
 | |
| 
 | |
| void ANetworkDoor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
 | |
| {
 | |
| 	Super::GetLifetimeReplicatedProps(OutLifetimeProps);
 | |
| 
 | |
| 	DOREPLIFETIME(ANetworkDoor, isDoorClosed);
 | |
| } |