-
Notifications
You must be signed in to change notification settings - Fork 0
/
Door.cpp
98 lines (89 loc) · 3.21 KB
/
Door.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Fill out your copyright notice in the Description page of Project Settings.
#include "Door.h"
#include "Classes/Components/StaticMeshComponent.h"
#include "ConstructorHelpers.h"
#include "PlayerCharacter.h"
ADoor::ADoor()
{
// Construction helper gets the specific mesh set in the TEXT and applies it to the static mesh
const ConstructorHelpers::FObjectFinder<UStaticMesh> DoorObj(TEXT("/Game/SimpleHouseInteriors/Meshes/SM_Door_02.SM_Door_02"));
if (DoorObj.Object)InteractableMesh->SetStaticMesh(DoorObj.Object);
}
// Called every frame
void ADoor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (EDoorState == EDoorStateEnum::DSE_Opening || EDoorState == EDoorStateEnum::DSE_Closing)
{
OpenCloseDoor(DeltaTime); // The door is rotated a small amount every frame until it is fully open or closed
}
}
// When the player attempts to interact with the door, it checks whether it is locked or not
void ADoor::OnInteract(APlayerCharacter * playerCharacter)
{
if (bIsDoorLocked) CheckForItem(playerCharacter);
if (bNeedsPower && !bIsDoorLocked)
{
if (bIsPowered) ChangeState();
else SendMessageToPlayer(playerCharacter, "The Door Needs Power");
}
else if (!bNeedsPower && !bIsDoorLocked) ChangeState();
}
// Rotates the door during transition phases using the time between frames
void ADoor::OpenCloseDoor(float& DeltaTime)
{
fTransitionTime -= DeltaTime;
if (fTransitionTime <= 0.0f) // When the transition time has finished, the door has transition into a new completed state
{
if (EDoorState == EDoorStateEnum::DSE_Opening)
EDoorState = EDoorStateEnum::DSE_Open;
else if (EDoorState == EDoorStateEnum::DSE_Closing)
EDoorState = EDoorStateEnum::DSE_Closed;
fTransitionTime = MaxTransitionTime;
}
else if (fTransitionTime > 0.0f) // The transition is still being animated so rotation is added
{
if(EDoorState == EDoorStateEnum::DSE_Opening) AddActorLocalRotation(FRotator(0.0f, 100 * DeltaTime, 0.0f));
else if (EDoorState == EDoorStateEnum::DSE_Closing) AddActorLocalRotation(FRotator(0.0f, -100 * DeltaTime, 0.0f));
}
}
// Locked door boolean flag is set to false -- Door can be opened
void ADoor::UnlockDoor()
{
bIsDoorLocked = false;
}
// Calls the player's function to check whether they have the unlock item or not
void ADoor::CheckForItem(APlayerCharacter * playerCharacter)
{
bool bHasItem = playerCharacter->CheckInventory(DoorUnlockItem);
if (bHasItem)
{
bUseCustomMessage = false;
UnlockDoor();
SendMessageToPlayer(playerCharacter, "Door Unlocked");
}
else SendMessageToPlayer(playerCharacter, "Door Locked");
}
// Depending on the current state of interaction, it needs to be swapped and the transition time calculated when interacted with
void ADoor::ChangeState()
{
switch (EDoorState)
{
case EDoorStateEnum::DSE_Closed:
EDoorState = EDoorStateEnum::DSE_Opening;
fTransitionTime = MaxTransitionTime;
break;
case EDoorStateEnum::DSE_Closing:
EDoorState = EDoorStateEnum::DSE_Opening;
fTransitionTime = 1 - fTransitionTime;
break;
case EDoorStateEnum::DSE_Opening:
EDoorState = EDoorStateEnum::DSE_Closing;
fTransitionTime = 1 - fTransitionTime;
break;
case EDoorStateEnum::DSE_Open:
EDoorState = EDoorStateEnum::DSE_Closing;
fTransitionTime = MaxTransitionTime;
break;
}
}