void AShooterGameMode::FinishMatch() { AShooterGameState* const MyGameState = Cast<AShooterGameState>(GameState); if (IsMatchInProgress()) { EndMatch(); DetermineMatchWinner(); // notify players for (FConstControllerIterator It = GetWorld()->GetControllerIterator(); It; ++It) { AShooterPlayerState* PlayerState = Cast<AShooterPlayerState>((*It)->PlayerState); const bool bIsWinner = IsWinner(PlayerState); (*It)->GameHasEnded(NULL, bIsWinner); } // lock all pawns // pawns are not marked as keep for seamless travel, so we will create new pawns on the next match rather than // turning these back on. for (FConstPawnIterator It = GetWorld()->GetPawnIterator(); It; ++It) { (*It)->TurnOff(); } // set up to restart the match MyGameState->RemainingTime = TimeBetweenMatches; } }
void ALabyrinthGameMode::FinishMatch() { ALGameState* const MyGameState = Cast<ALGameState>(GameState); if (IsMatchInProgress()) { EndMatch(); DetermineMatchWinner(); // notify players for (FConstPlayerControllerIterator It = GetWorld()->GetPlayerControllerIterator(); It; It++) { ALPlayerState* PlayerState = Cast<ALPlayerState>((*It)->PlayerState); if (PlayerState) { const bool bIsWinner = IsWinner(PlayerState); (*It)->GameHasEnded(NULL, bIsWinner); } } // lock all pawns // pawns are not marked as keep for seamless travel, so we will create new ones // instead of turning these back on for (FConstPawnIterator It = GetWorld()->GetPawnIterator(); It; It++) { (*It)->TurnOff(); } // Setup to restart the match MyGameState->RemainingTime = TimeBetweenMatches; } }
void AGameState::DefaultTimer() { if (IsMatchInProgress()) { ++ElapsedTime; if (GetNetMode() != NM_DedicatedServer) { OnRep_ElapsedTime(); } } GetWorldTimerManager().SetTimer(TimerHandle_DefaultTimer, this, &AGameState::DefaultTimer, 1.0f / GetWorldSettings()->GetEffectiveTimeDilation(), true); }
void ASGameMode::DefaultTimer() { /* Immediately start the match while playing in editor */ //if (GetWorld()->IsPlayInEditor()) { if (GetMatchState() == MatchState::WaitingToStart) { StartMatch(); } } /* Only increment time of day while game is active */ if (IsMatchInProgress()) { ASGameState* MyGameState = Cast<ASGameState>(GameState); if (MyGameState) { /* Increment our time of day */ MyGameState->ElapsedGameMinutes += MyGameState->GetTimeOfDayIncrement(); /* Determine our state */ MyGameState->GetAndUpdateIsNight(); /* Trigger events when night starts or ends */ bool CurrentIsNight = MyGameState->GetIsNight(); if (CurrentIsNight != LastIsNight) { EHUDMessage MessageID = CurrentIsNight ? EHUDMessage::Game_SurviveStart : EHUDMessage::Game_SurviveEnded; MyGameState->BroadcastGameMessage(MessageID); /* The night just ended, respawn all dead players */ if (!CurrentIsNight) { OnNightEnded(); } /* Update bot states */ if (CurrentIsNight) { WakeAllBots(); } else { PassifyAllBots(); } } LastIsNight = MyGameState->bIsNight; } } }
void AHeliGameModeLobby::PostLogin(APlayerController* NewPlayer) { // Place player on a team before Super (VoIP team based init, findplayerstart, etc) AHeliPlayerState* NewPlayerState = CastChecked<AHeliPlayerState>(NewPlayer->PlayerState); const int32 TeamNum = ChooseTeam(NewPlayerState); NewPlayerState->SetTeamNumber(TeamNum); Super::PostLogin(NewPlayer); AHeliPlayerController* NewPC = Cast<AHeliPlayerController>(NewPlayer); // notify new player if match is already in progress if (NewPC && IsMatchInProgress()) { NewPC->ClientGameStarted(); NewPC->ClientStartOnlineGame(); } // debug players roles //PrintNetModeInfo(NewPlayer->GetNetMode()); //PrintRoleInfo(NewPlayer->Role); //PrintController(NewPlayer); // if i'm the host, (hosting a match, e.g., the server) set my custom states (playername, etc...) UHeliGameInstance* MyGameInstance = GetWorld() != NULL ? Cast<UHeliGameInstance>(GetWorld()->GetGameInstance()) : NULL; //if (NewPlayer->GetNetMode() == NM_ListenServer && MyGameInstance) //if (NewPlayer->IsLocalController() && MyGameInstance) if (NewPlayer->IsLocalPlayerController() && MyGameInstance) // using IsLocalPlayerController() since it is controlled by humans { if (!MyGameInstance->CustomPlayerName.IsEmpty()) { NewPlayer->PlayerState->SetPlayerName(MyGameInstance->CustomPlayerName); } } AHeliLobbyGameState* MyGameState = Cast<AHeliLobbyGameState>(GameState); if (MyGameState) { // force the replication of players custom atributes on clients for displaying name, etc on lobby widget MyGameState->bShouldUpdateLobbyWidget++; } }
void AShooterGameMode::PostLogin(APlayerController* NewPlayer) { Super::PostLogin(NewPlayer); // update spectator location for client AShooterPlayerController* NewPC = Cast<AShooterPlayerController>(NewPlayer); if (NewPC && NewPC->GetPawn() == NULL) { NewPC->ClientSetSpectatorCamera(NewPC->GetSpawnLocation(), NewPC->GetControlRotation()); } // notify new player if match is already in progress if (NewPC && IsMatchInProgress()) { NewPC->ClientGameStarted(); NewPC->ClientStartOnlineGame(); } }
void ASGameMode::FinishMatch() { ASGameState* const MyGameState = Cast<ASGameState>(GameState); if (IsMatchInProgress()) { EndMatch(); /* Stop spawning bots */ GetWorldTimerManager().ClearTimer(TimerHandle_BotSpawns); for (FConstPlayerControllerIterator It = GetWorld()->GetPlayerControllerIterator(); It; It++) { ASPlayerController* MyController = Cast<ASPlayerController>(*It); if (MyController) { MyController->ClientHUDStateChanged(EHUDState::MatchEnd); } } } }
void ALabyrinthGameMode::PostLogin(APlayerController* NewPlayer) { Super::PostLogin(NewPlayer); // Update the spectator location for client ALPlayerController* NewPC = Cast<ALPlayerController>(NewPlayer); if (NewPC && NewPC->GetPawn() == NULL) { // TO-DO: Add this to ALPlayerController //NewPC->ClientSetSpectatorCamera(NewPC->GetSpawnLocation(), NewPC->GetControlRotation); } // Notify the new plaer if match is already in progress if (NewPC && IsMatchInProgress()) { // TO-DO: Add this to the ALPlayerController //NewPC->ClientGameStarted(); //NewPC->ClientStartOnlineGame(); } }
void ASGameMode::DefaultTimer() { /* This function is called every 1 second. */ Super::DefaultTimer(); /* Immediately start the match while playing in editor */ //if (GetWorld()->IsPlayInEditor()) { if (GetMatchState() == MatchState::WaitingToStart) { StartMatch(); } } /* Only increment time of day while game is active */ if (IsMatchInProgress()) { ASGameState* MyGameState = Cast<ASGameState>(GameState); if (MyGameState) { /* Increment our time of day */ MyGameState->ElapsedGameMinutes += MyGameState->GetTimeOfDayIncrement(); /* Determine our state */ MyGameState->GetAndUpdateIsNight(); /* Trigger events when night starts or ends */ bool CurrentIsNight = MyGameState->GetIsNight(); if (CurrentIsNight != LastIsNight) { FString MessageText = CurrentIsNight ? "SURVIVE!" : "You Survived! Now prepare for the coming night!"; ASGameState* MyGameState = Cast<ASGameState>(GameState); if (MyGameState) { MyGameState->BroadcastGameMessage(MessageText); } /* The night just ended, respawn all dead players */ if (!CurrentIsNight) { /* Respawn spectating players that died during the night */ for (FConstPlayerControllerIterator It = GetWorld()->GetPlayerControllerIterator(); It; It++) { /* Look for all players that are spectating */ ASPlayerController* MyController = Cast<ASPlayerController>(*It); if (MyController) { if (MyController->PlayerState->bIsSpectator) { RestartPlayer(MyController); MyController->ClientHUDStateChanged(EHUDState::Playing); } else { /* Player still alive, award him some points */ ASCharacter* MyPawn = Cast<ASCharacter>(MyController->GetPawn()); if (MyPawn && MyPawn->IsAlive()) { ASPlayerState* PS = Cast<ASPlayerState>(MyController->PlayerState); if (PS) { PS->ScorePoints(NightSurvivedScore); } } } } } } /* Update bot states */ if (CurrentIsNight) { WakeAllBots(); } else { PassifyAllBots(); } } LastIsNight = MyGameState->bIsNight; } } }