void ASGameMode::CheckMatchEnd() { bool bHasAlivePlayer = false; for (FConstPawnIterator It = GetWorld()->GetPawnIterator(); It; It++) { ASCharacter* MyPawn = Cast<ASCharacter>(*It); if (MyPawn && MyPawn->IsAlive()) { ASPlayerState* PS = Cast<ASPlayerState>(MyPawn->PlayerState); if (PS) { if (!PS->bIsABot) { /* Found one player that is still alive, game will continue */ bHasAlivePlayer = true; break; } } } } /* End game is all players died */ if (!bHasAlivePlayer) { FinishMatch(); } }
void ALabyrinthGameMode::DefaultTimer() { Super::DefaultTimer(); // don't update timers for play in editor mode, it's not a real match if (GetWorld()->IsPlayInEditor()) { // start the match if necessary if (GetMatchState() == MatchState::WaitingToStart) { StartMatch(); } return; } ALGameState* const MyGameState = Cast<ALGameState>(GameState); if (MyGameState && MyGameState->RemainingTime > 0 && !MyGameState->bIsTimerPaused) { MyGameState->RemainingTime--; if (MyGameState->RemainingTime <= 0) { if (GetMatchState() == MatchState::WaitingPostMatch) { RestartGame(); } else if (GetMatchState() == MatchState::InProgress) { FinishMatch(); // Send end round events ALGameState* const MyGameState = Cast<ALGameState>(GameState); for (FConstControllerIterator It = GetWorld()->GetControllerIterator(); It; It++) { ALPlayerController* PlayerController = Cast<ALPlayerController>(*It); if (PlayerController && MyGameState) { ALPlayerState* PlayerState = Cast<ALPlayerState>((*It)->PlayerState); const bool bIsWinner = IsWinner(PlayerState); // TO-DO: Add this to the Player controller //PlayerController->ClientSendRoundEndEvent(bIsWinner, MyGameState->ElapsedTime); } } } else if (GetMatchState() == MatchState::WaitingToStart) { StartMatch(); } } } }
void AShooterGameMode::DefaultTimer() { // don't update timers for Play In Editor mode, it's not real match if (GetWorld()->IsPlayInEditor()) { // start match if necessary. if (GetMatchState() == MatchState::WaitingToStart) { StartMatch(); } return; } AShooterGameState* const MyGameState = Cast<AShooterGameState>(GameState); if (MyGameState && MyGameState->RemainingTime > 0 && !MyGameState->bTimerPaused) { MyGameState->RemainingTime--; if (MyGameState->RemainingTime <= 0) { if (GetMatchState() == MatchState::WaitingPostMatch) { RestartGame(); } else if (GetMatchState() == MatchState::InProgress) { FinishMatch(); // Send end round events for (FConstControllerIterator It = GetWorld()->GetControllerIterator(); It; ++It) { AShooterPlayerController* PlayerController = Cast<AShooterPlayerController>(*It); if (PlayerController && MyGameState) { AShooterPlayerState* PlayerState = Cast<AShooterPlayerState>((*It)->PlayerState); const bool bIsWinner = IsWinner(PlayerState); PlayerController->ClientSendRoundEndEvent(bIsWinner, MyGameState->ElapsedTime); } } } else if (GetMatchState() == MatchState::WaitingToStart) { StartMatch(); } } } }
void ALabyrinthGameMode::RequestFinishAndExitToMainMenu() { FinishMatch(); // TO-DO: Change this to ULGameInstance UGameInstance* const GI = GetGameInstance(); if (GI) { //GI->RemoveSplitScreenPlayers; } ALPlayerController* LocalPrimaryController = nullptr; for (FConstPlayerControllerIterator It = GetWorld()->GetPlayerControllerIterator(); It; It++) { ALPlayerController* Controller = Cast<ALPlayerController>(*It); if (Controller == NULL) { continue; } if (!Controller->IsLocalController()) { const FString RemoteReturnReason = NSLOCTEXT("Network Errors", "HostHasLeft", "Host has left the game.").ToString(); Controller->ClientReturnToMainMenu(RemoteReturnReason); } else { LocalPrimaryController = Controller; } } // GameInstance should call this from an EndState. So call the PC function that performs cleanup // not the one that sets GI state if (LocalPrimaryController != NULL) { // TO-DO: Add this to the player Controller. //LocalPrimaryController->HandleReturnToMainMenu(); } }
void AShooterGameMode::RequestFinishAndExitToMainMenu() { FinishMatch(); UShooterGameInstance* const GameInstance = Cast<UShooterGameInstance>(GetGameInstance()); if (GameInstance) { GameInstance->RemoveSplitScreenPlayers(); } AShooterPlayerController* LocalPrimaryController = nullptr; for (FConstPlayerControllerIterator Iterator = GetWorld()->GetPlayerControllerIterator(); Iterator; ++Iterator) { AShooterPlayerController* Controller = Cast<AShooterPlayerController>(*Iterator); if (Controller == NULL) { continue; } if (!Controller->IsLocalController()) { const FString RemoteReturnReason = NSLOCTEXT("NetworkErrors", "HostHasLeft", "Host has left the game.").ToString(); Controller->ClientReturnToMainMenu(RemoteReturnReason); } else { LocalPrimaryController = Controller; } } // GameInstance should be calling this from an EndState. So call the PC function that performs cleanup, not the one that sets GI state. if (LocalPrimaryController != NULL) { LocalPrimaryController->HandleReturnToMainMenu(); } }