This repository was archived by the owner on Dec 21, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 24
Expand file tree
/
Copy pathNavGridPC.cpp
More file actions
111 lines (97 loc) · 3.31 KB
/
Copy pathNavGridPC.cpp
File metadata and controls
111 lines (97 loc) · 3.31 KB
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
99
100
101
102
103
104
105
106
107
108
109
110
111
// Fill out your copyright notice in the Description page of Project Settings.
#include "NavGridPC.h"
ANavGridPC::ANavGridPC(const FObjectInitializer& ObjectInitializer)
:Super(ObjectInitializer)
{
bShowMouseCursor = true;
/* Enable mouse events */
bEnableClickEvents = true;
bEnableMouseOverEvents = true;
bEnableTouchEvents = true;
bEnableTouchOverEvents = true;
}
void ANavGridPC::BeginPlay()
{
// grab turn manager and grid from the game state
auto *State = GetWorld()->GetGameState<ANavGridGameState>();
SetTurnManager(State->GetTurnManager());
SetGrid(State->GetNavGrid());
}
void ANavGridPC::OnTileClicked(const UNavTileComponent *Tile)
{
/* Try to move the current pawn to the clicked tile */
if (GridPawn && GridPawn->GetState() == EGridPawnState::Ready)
{
if (GridPawn->CanMoveTo(*Tile))
{
GridPawn->MoveTo(*Tile);
}
}
}
void ANavGridPC::OnTileCursorOver(const UNavTileComponent *Tile)
{
/* If the pawn is not moving, try to create a path to the hovered tile and show it */
if (GridPawn && GridPawn->GetState() == EGridPawnState::Ready)
{
Grid->Cursor->SetWorldLocation(Tile->GetPawnLocation() + FVector(0, 0, Grid->UIOffset));
Grid->Cursor->SetVisibility(true);
UGridMovementComponent *MovementComponent = GridPawn->MovementComponent;
if (GridPawn->CanMoveTo(*Tile))
{
MovementComponent->CreatePath(*Tile);
MovementComponent->ShowPath();
}
}
}
void ANavGridPC::OnEndTileCursorOver(const UNavTileComponent *Tile)
{
Grid->Cursor->SetVisibility(false);
/* Hide the previously shown path */
if (GridPawn)
{
UGridMovementComponent *MovementComponent = GridPawn->MovementComponent;
MovementComponent->HidePath();
}
}
void ANavGridPC::OnTurnStart(UTurnComponent *Component)
{
if (Component->GetOwner()->IsA<AGridPawn>())
{
GridPawn = Cast<AGridPawn>(Component->GetOwner());
}
}
void ANavGridPC::OnTurnEnd(UTurnComponent * Component)
{
GridPawn = NULL;
}
void ANavGridPC::SetTurnManager(ATurnManager * InTurnManager)
{
check(InTurnManager);
// unregister any delegates from the previous manager
if (TurnManager)
{
TurnManager->OnRoundStart().RemoveDynamic(this, &ANavGridPC::OnRoundStart);
TurnManager->OnTurnStart().RemoveDynamic(this, &ANavGridPC::OnTurnStart);
TurnManager->OnTurnEnd().RemoveDynamic(this, &ANavGridPC::OnTurnEnd);
TurnManager->OnTeamTurnStart().RemoveDynamic(this, &ANavGridPC::OnTeamTurnStart);
}
TurnManager = InTurnManager;
TurnManager->OnRoundStart().AddDynamic(this, &ANavGridPC::OnRoundStart);
TurnManager->OnTurnStart().AddDynamic(this, &ANavGridPC::OnTurnStart);
TurnManager->OnTurnEnd().AddDynamic(this, &ANavGridPC::OnTurnEnd);
TurnManager->OnTeamTurnStart().AddDynamic(this, &ANavGridPC::OnTeamTurnStart);
}
void ANavGridPC::SetGrid(ANavGrid * InGrid)
{
check(InGrid);
if (Grid)
{
Grid->OnTileClicked.RemoveDynamic(this, &ANavGridPC::OnTileClicked);
Grid->OnTileCursorOver.RemoveDynamic(this, &ANavGridPC::OnTileCursorOver);
Grid->OnEndTileCursorOver.RemoveDynamic(this, &ANavGridPC::OnEndTileCursorOver);
}
Grid = InGrid;
Grid->OnTileClicked.AddDynamic(this, &ANavGridPC::OnTileClicked);
Grid->OnTileCursorOver.AddDynamic(this, &ANavGridPC::OnTileCursorOver);
Grid->OnEndTileCursorOver.AddDynamic(this, &ANavGridPC::OnEndTileCursorOver);
}