From c42c82bb6412abe97e2e54c9dd8fca6760766e86 Mon Sep 17 00:00:00 2001 From: Ieva Vasiljeva Date: Thu, 6 Jun 2019 17:23:52 +0100 Subject: [PATCH 1/2] Fix an issue where native launch would crash due to assuming that we have a Spatial net driver. --- .../Private/Game/GDKSessionGameState.cpp | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Game/GDKSessionGameState.cpp b/Game/Source/GDKShooter/Private/Game/GDKSessionGameState.cpp index aa13789c..e408be95 100644 --- a/Game/Source/GDKShooter/Private/Game/GDKSessionGameState.cpp +++ b/Game/Source/GDKShooter/Private/Game/GDKSessionGameState.cpp @@ -45,13 +45,7 @@ void AGDKSessionGameState::RemovePlayerState(APlayerState* PlayerState) void AGDKSessionGameState::OnRep_SessionProgress() { - USpatialNetDriver* SpatialNetDriver = Cast(GetWorld()->GetNetDriver()); - bool bAuthoritativeOverSessionEntity = SpatialNetDriver->StaticComponentView->HasAuthority(SessionEntityId, SessionComponentId); - - if (bAuthoritativeOverSessionEntity) - { - SendStateUpdate(SessionProgress); - } + SendStateUpdate(SessionProgress); TimerEvent.Broadcast(SessionProgress, SessionTimer); } @@ -78,47 +72,45 @@ void AGDKSessionGameState::TickGameTimer() { SessionTimer--; - USpatialNetDriver* SpatialNetDriver = Cast(GetWorld()->GetNetDriver()); - bool bAuthoritativeOverSessionEntity = SpatialNetDriver->StaticComponentView->HasAuthority(SessionEntityId, SessionComponentId); - if (SessionProgress == EGDKSessionProgress::Lobby && SessionTimer <= 0) { UE_LOG(LogGDK, Log, TEXT("Advance GameState to Running")); SessionProgress = EGDKSessionProgress::Running; - if (bAuthoritativeOverSessionEntity) - { - SendStateUpdate(SessionProgress); - } + SendStateUpdate(SessionProgress); SessionTimer = GameSessionLength; } if (SessionProgress == EGDKSessionProgress::Running && SessionTimer <= 0) { UE_LOG(LogGDK, Log, TEXT("Advance GameState to Results")); SessionProgress = EGDKSessionProgress::Results; - if (bAuthoritativeOverSessionEntity) - { - SendStateUpdate(SessionProgress); - } + SendStateUpdate(SessionProgress); SessionTimer = ResultsSessionLength; } if (SessionProgress == EGDKSessionProgress::Results && SessionTimer <= 0) { UE_LOG(LogGDK, Log, TEXT("Advance GameState to Finished")); SessionProgress = EGDKSessionProgress::Finished; - if (bAuthoritativeOverSessionEntity) - { - SendStateUpdate(SessionProgress); - } + SendStateUpdate(SessionProgress); } } } void AGDKSessionGameState::SendStateUpdate(EGDKSessionProgress SessionProgressState) { + // Only send the state update if we're using Spatial networking and if we have authority over the session entity. if (!GetWorld()->GetNetDriver() || !GetWorld()->GetNetDriver()->IsA()) { return; } + else + { + USpatialNetDriver* SpatialNetDriver = Cast(GetWorld()->GetNetDriver()); + bool bAuthoritativeOverSessionEntity = SpatialNetDriver->StaticComponentView->HasAuthority(SessionEntityId, SessionComponentId); + if (!bAuthoritativeOverSessionEntity) + { + return; + } + } // There's an offset of 1 between the corresponding states of session progress and session state. int SessionState = static_cast(SessionProgressState) + 1; From 8633e5ddf83dca4c45bea3f914424fb2f97b9530 Mon Sep 17 00:00:00 2001 From: Ieva Vasiljeva Date: Fri, 7 Jun 2019 12:26:20 +0100 Subject: [PATCH 2/2] Refactor to make code cleaner. --- .../Private/Game/GDKSessionGameState.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Game/GDKSessionGameState.cpp b/Game/Source/GDKShooter/Private/Game/GDKSessionGameState.cpp index e408be95..62419446 100644 --- a/Game/Source/GDKShooter/Private/Game/GDKSessionGameState.cpp +++ b/Game/Source/GDKShooter/Private/Game/GDKSessionGameState.cpp @@ -98,18 +98,17 @@ void AGDKSessionGameState::TickGameTimer() void AGDKSessionGameState::SendStateUpdate(EGDKSessionProgress SessionProgressState) { // Only send the state update if we're using Spatial networking and if we have authority over the session entity. - if (!GetWorld()->GetNetDriver() || !GetWorld()->GetNetDriver()->IsA()) + UNetDriver* NetDriver = GetWorld()->GetNetDriver(); + if (NetDriver == nullptr || !NetDriver->IsA()) { return; } - else + + USpatialNetDriver* SpatialNetDriver = Cast(NetDriver); + bool bAuthoritativeOverSessionEntity = SpatialNetDriver->StaticComponentView->HasAuthority(SessionEntityId, SessionComponentId); + if (!bAuthoritativeOverSessionEntity) { - USpatialNetDriver* SpatialNetDriver = Cast(GetWorld()->GetNetDriver()); - bool bAuthoritativeOverSessionEntity = SpatialNetDriver->StaticComponentView->HasAuthority(SessionEntityId, SessionComponentId); - if (!bAuthoritativeOverSessionEntity) - { - return; - } + return; } // There's an offset of 1 between the corresponding states of session progress and session state. @@ -121,7 +120,7 @@ void AGDKSessionGameState::SendStateUpdate(EGDKSessionProgress SessionProgressSt component_update.schema_type = Schema_CreateComponentUpdate(SessionComponentId); Schema_Object* fields_object = Schema_GetComponentUpdateFields(component_update.schema_type); Schema_AddInt32(fields_object, 1, SessionState); - Cast(GetWorld()->GetNetDriver())->Connection->SendComponentUpdate(target_entity_id, &component_update); + SpatialNetDriver->Connection->SendComponentUpdate(target_entity_id, &component_update); }