Skip to content
This repository was archived by the owner on Dec 21, 2024. It is now read-only.

Commit 100c31d

Browse files
committed
dont crash if pawns are added to a level without a grid
1 parent bedcd4d commit 100c31d

File tree

5 files changed

+45
-22
lines changed

5 files changed

+45
-22
lines changed

Source/Navgrid/Classes/TurnComponent.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class NAVGRID_API UTurnComponent : public UActorComponent
1919
virtual void BeginPlay() override;
2020
virtual void OnComponentDestroyed(bool bDestroyingHierarchy) override;
2121

22-
ATurnManager *GetTurnManager() { return TurnManager; }
22+
ATurnManager *GetTurnManager();
2323
protected:
2424
UPROPERTY()
2525
ATurnManager *TurnManager;

Source/Navgrid/Private/GridMovementComponent.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,10 @@ void UGridMovementComponent::StopMovementImmediately()
145145
ChangeMovementMode(EGridMovementMode::Stationary);
146146
MovementPhase = EGridMovementPhase::Done;
147147
Distance = 0;
148-
Spline->ClearSplinePoints();
148+
if (IsValid(Spline))
149+
{
150+
Spline->ClearSplinePoints();
151+
}
149152
}
150153

151154
FTransform UGridMovementComponent::TransformFromPath(float DeltaTime)
@@ -254,15 +257,22 @@ void UGridMovementComponent::ConsiderUpdateCurrentTile()
254257
CurrentTile = Tile;
255258

256259
ANavGridGameState *GameState = Cast<ANavGridGameState>(UGameplayStatics::GetGameState(GetOwner()));
257-
AGridPawn *GridPawn = Cast<AGridPawn>(GetOwner());
258-
GameState->OnPawnEnterTile().Broadcast(GridPawn, CurrentTile);
260+
if (IsValid(GameState))
261+
{
262+
AGridPawn *GridPawn = Cast<AGridPawn>(GetOwner());
263+
GameState->OnPawnEnterTile().Broadcast(GridPawn, CurrentTile);
264+
}
259265
}
260266
}
261267
}
262268

263269
void UGridMovementComponent::GetTilesInRange(TArray<UNavTileComponent *> &OutTiles)
264270
{
265-
Grid->GetTilesInRange(Cast<AGridPawn>(GetOwner()), OutTiles);
271+
if (IsValid(Grid))
272+
{
273+
ConsiderUpdateCurrentTile();
274+
Grid->GetTilesInRange(Cast<AGridPawn>(GetOwner()), OutTiles);
275+
}
266276
}
267277

268278
UNavTileComponent *UGridMovementComponent::GetTile()

Source/Navgrid/Private/GridPawn.cpp

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,16 @@ void AGridPawn::BeginPlay()
6060
{
6161
Super::BeginPlay();
6262

63-
ATurnManager *TurnManager = GetWorld()->GetGameState<ANavGridGameState>()->GetTurnManager();
64-
TurnManager->OnRoundStart().AddDynamic(this, &AGridPawn::OnRoundStart);
65-
TurnManager->OnTurnStart().AddDynamic(this, &AGridPawn::OnAnyTurnStart);
66-
TurnManager->OnTurnEnd().AddDynamic(this, &AGridPawn::OnAnyTurnEnd);
67-
TurnManager->OnTeamTurnStart().AddDynamic(this, &AGridPawn::OnAnyTeamTurnStart);
68-
TurnManager->OnTeamTurnEnd().AddDynamic(this, &AGridPawn::OnAnyTeamTurnEnd);
69-
TurnManager->OnReadyForInput().AddDynamic(this, &AGridPawn::OnAnyPawnReadyForInput);
63+
ATurnManager *TurnManager =TurnComponent->GetTurnManager();
64+
if (IsValid(TurnManager))
65+
{
66+
TurnManager->OnRoundStart().AddDynamic(this, &AGridPawn::OnRoundStart);
67+
TurnManager->OnTurnStart().AddDynamic(this, &AGridPawn::OnAnyTurnStart);
68+
TurnManager->OnTurnEnd().AddDynamic(this, &AGridPawn::OnAnyTurnEnd);
69+
TurnManager->OnTeamTurnStart().AddDynamic(this, &AGridPawn::OnAnyTeamTurnStart);
70+
TurnManager->OnTeamTurnEnd().AddDynamic(this, &AGridPawn::OnAnyTeamTurnEnd);
71+
TurnManager->OnReadyForInput().AddDynamic(this, &AGridPawn::OnAnyPawnReadyForInput);
72+
}
7073

7174
SetGenericTeamId(TeamId);
7275

@@ -93,14 +96,10 @@ void AGridPawn::OnConstruction(const FTransform & Transform)
9396

9497
void AGridPawn::SetGenericTeamId(const FGenericTeamId & InTeamId)
9598
{
96-
ANavGridGameState *State = GetWorld()->GetGameState<ANavGridGameState>();
97-
ATurnManager *NewTM = State->GetTurnManager();
98-
if (IsValid(NewTM))
99-
{
100-
NewTM->RegisterTurnComponent(TurnComponent);
101-
}
102-
99+
// we must unregister before we change the team id
100+
TurnComponent->UnregisterWithTurnManager();
103101
TeamId = InTeamId;
102+
TurnComponent->RegisterWithTurnManager();
104103
}
105104

106105
void AGridPawn::OnAnyTurnStart(UTurnComponent *InTurnComponent)
@@ -113,7 +112,6 @@ void AGridPawn::OnAnyTurnStart(UTurnComponent *InTurnComponent)
113112

114113
void AGridPawn::OnTurnStart()
115114
{
116-
MovementComponent->ConsiderUpdateCurrentTile();
117115
if (SnapToGrid)
118116
{
119117
MovementComponent->SnapToGrid();

Source/Navgrid/Private/TurnComponent.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ void UTurnComponent::OnComponentDestroyed(bool bDestroyingHierarchy)
2323
UnregisterWithTurnManager();
2424
}
2525

26+
ATurnManager * UTurnComponent::GetTurnManager()
27+
{
28+
if (!IsValid(TurnManager))
29+
{
30+
RegisterWithTurnManager();
31+
}
32+
return TurnManager;
33+
}
34+
2635
void UTurnComponent::EndTurn()
2736
{
2837
if (IsValid(TurnManager))
@@ -86,8 +95,12 @@ AActor *UTurnComponent::GetCurrentActor() const
8695
void UTurnComponent::RegisterWithTurnManager()
8796
{
8897
UnregisterWithTurnManager();
89-
TurnManager = GetWorld()->GetGameState<ANavGridGameState>()->GetTurnManager();
90-
TurnManager->RegisterTurnComponent(this);
98+
ANavGridGameState *GameState = GetWorld()->GetGameState<ANavGridGameState>();
99+
if (IsValid(GameState))
100+
{
101+
TurnManager = GameState->GetTurnManager();
102+
TurnManager->RegisterTurnComponent(this);
103+
}
91104
}
92105

93106
void UTurnComponent::UnregisterWithTurnManager()

Source/Navgrid/Private/TurnManager.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,13 @@ void ATurnManager::Tick(float DeltaTime)
8282

8383
void ATurnManager::RegisterTurnComponent(UTurnComponent *TurnComponent)
8484
{
85+
UE_LOG(NavGrid, Verbose, TEXT("%s (team %i) registering"), *TurnComponent->GetName(), TurnComponent->TeamId().GetId());
8586
Teams.AddUnique(TurnComponent->TeamId(), TurnComponent);
8687
}
8788

8889
void ATurnManager::UnregisterTurnComponent(UTurnComponent * TurnComponent)
8990
{
91+
UE_LOG(NavGrid, Verbose, TEXT("%s (team %i) unregistering"), *TurnComponent->GetName(), TurnComponent->TeamId().GetId());
9092
Teams.RemoveSingle(TurnComponent->TeamId(), TurnComponent);
9193
if (CurrentComponent == TurnComponent)
9294
{

0 commit comments

Comments
 (0)