void AFPSGPlayerController::onClickEndGame() const { //Make sure it is the server calling the function if (Role < ROLE_Authority && GetNetMode() == NM_Client) return; //GEngine->AddOnScreenDebugMessage(-1, 40.0f, FColor::Cyan, "AFPSGPlayerController::onClickEndGame"); IOnlineSubsystem* onlineSubsystem = IOnlineSubsystem::Get(); IOnlineSessionPtr sessions = onlineSubsystem != NULL ? onlineSubsystem->GetSessionInterface() : NULL; if (sessions.IsValid()) { UWorld* world = GetWorld(); AFPSGGameState* gameState = world != NULL ? world->GetGameState<AFPSGGameState>() : NULL; if (gameState != NULL) { //Retrieve the session state and match state EOnlineSessionState::Type sessionState = sessions->GetSessionState(GameSessionName); FName matchState = gameState->GetMatchState(); //Only attempt to end the game if both the session and match are in progress if (sessionState == EOnlineSessionState::Type::InProgress && matchState == MatchState::InProgress) { gameState->onClickEndGame(); } } } }
void AFPSGPlayerController::onClickQuitToMainMenu() { //GEngine->AddOnScreenDebugMessage(-1, 40.0f, FColor::Cyan, "AFPSGPlayerController::onClickQuitToMainMenu"); IOnlineSubsystem* onlineSubsystem = IOnlineSubsystem::Get(); IOnlineSessionPtr sessions = onlineSubsystem != NULL ? onlineSubsystem->GetSessionInterface() : NULL; if (!sessions.IsValid()) return; UWorld* world = GetWorld(); AFPSGGameState* gameState = world != NULL ? world->GetGameState<AFPSGGameState>() : NULL; if (gameState != NULL) { //Retrieve the session state and match state FName matchState = gameState->GetMatchState(); EOnlineSessionState::Type sessionState = EOnlineSessionState::Type::NoSession; if (Role == ROLE_Authority && GetNetMode() < NM_Client) { sessionState = sessions->GetSessionState(GameSessionName); } else { sessionState = PlayerState != NULL ? sessions->GetSessionState(PlayerState->SessionName) : EOnlineSessionState::Type::NoSession; } //Only attempt to end the game if both the session and match are in progress if (sessionState == EOnlineSessionState::Type::InProgress && matchState == MatchState::InProgress) { //Check if it is a server or client that wants to quit to the main menu if (Role == ROLE_Authority && GetNetMode() < NM_Client) { gameState->onClickQuitToMainMenu(); } else { //Client will end and destroy its session locally, and then return to the main menu clientEndSession(); clientOnlineMatchHasEnded(EEndMatchReason::NONE); clientDestroySession(); ClientReturnToMainMenu_Implementation(""); } } } }
void UAdvancedSessionsLibrary::GetSessionState(TEnumAsByte<EBPOnlineSessionState::Type> &SessionState) { IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(); if (!SessionInterface.IsValid()) { UE_LOG(AdvancedSessionsLog, Warning, TEXT("GetSessionState couldn't get the session interface!")); return; } SessionState = ((EBPOnlineSessionState::Type)SessionInterface->GetSessionState(GameSessionName)); }
/** Ends and/or destroys game session */ void AShooterPlayerController::CleanupSessionOnReturnToMenu() { bool bPendingOnlineOp = false; // end online game and then destroy it AShooterPlayerState* ShooterPlayerState = Cast<AShooterPlayerState>(PlayerState); if (ShooterPlayerState) { IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(); if (OnlineSub) { IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface(); if (Sessions.IsValid()) { EOnlineSessionState::Type SessionState = Sessions->GetSessionState(ShooterPlayerState->SessionName); UE_LOG(LogOnline, Log, TEXT("Session %s is '%s'"), *ShooterPlayerState->SessionName.ToString(), EOnlineSessionState::ToString(SessionState)); if (EOnlineSessionState::InProgress == SessionState) { UE_LOG(LogOnline, Log, TEXT("Ending session %s on return to main menu"), *ShooterPlayerState->SessionName.ToString() ); Sessions->AddOnEndSessionCompleteDelegate(OnEndSessionCompleteDelegate); Sessions->EndSession(ShooterPlayerState->SessionName); bPendingOnlineOp = true; } else if (EOnlineSessionState::Ending == SessionState) { UE_LOG(LogOnline, Log, TEXT("Waiting for session %s to end on return to main menu"), *ShooterPlayerState->SessionName.ToString() ); Sessions->AddOnEndSessionCompleteDelegate(OnEndSessionCompleteDelegate); bPendingOnlineOp = true; } else if (EOnlineSessionState::Ended == SessionState || EOnlineSessionState::Pending == SessionState) { UE_LOG(LogOnline, Log, TEXT("Destroying session %s on return to main menu"), *ShooterPlayerState->SessionName.ToString() ); Sessions->AddOnDestroySessionCompleteDelegate(OnDestroySessionCompleteDelegate); Sessions->DestroySession(ShooterPlayerState->SessionName); bPendingOnlineOp = true; } else if (EOnlineSessionState::Starting == SessionState) { UE_LOG(LogOnline, Log, TEXT("Waiting for session %s to start, and then we will end it to return to main menu"), *ShooterPlayerState->SessionName.ToString() ); Sessions->AddOnStartSessionCompleteDelegate(OnStartSessionCompleteEndItDelegate); bPendingOnlineOp = true; } } } } if (!bPendingOnlineOp) { GEngine->HandleDisconnect(GetWorld(), GetWorld()->GetNetDriver()); } }
void UUModGameInstance::Tick(float DeltaTime) { if (DelayedRunMap) { ticks++; if (ticks >= 5) { if (IsLAN) { FString opt = FString("game=") + AUModGameMode::StaticClass()->GetPathName() + FString("?listen?bIsLanMatch"); UGameplayStatics::OpenLevel(GetWorld(), FName(*CurSessionMapName), true, opt); } else { FString opt = FString("game=") + AUModGameMode::StaticClass()->GetPathName() + FString("?listen"); UGameplayStatics::OpenLevel(GetWorld(), FName(*CurSessionMapName), true, opt); } IsLAN = false; CurSessionMapName = NULL; DelayedRunMap = false; ticks = 0; } } else if (DelayedServerConnect) { ticks++; if (ticks >= 5) { ULocalPlayer* const Player = GetFirstGamePlayer(); Player->PlayerController->ClientTravel(ConnectIP, ETravelType::TRAVEL_Absolute); ticks = 0; } } if (!CurSessionName.IsEmpty()) { IOnlineSubsystem* const OnlineSub = IOnlineSubsystem::Get(); IOnlineSessionPtr Sessions = NULL; if (OnlineSub == NULL) { return; } Sessions = OnlineSub->GetSessionInterface(); if (!Sessions.IsValid()) { return; } EOnlineSessionState::Type state = Sessions->GetSessionState(*CurSessionName); if (state == EOnlineSessionState::Ended) { Disconnect(FString("Lost Connection...")); } } }
void UOnlineSessionClient::JoinSession(FName SessionName, const FOnlineSessionSearchResult& SearchResult) { // Clean up existing sessions if applicable IOnlineSessionPtr SessionInt = GetSessionInt(); if (SessionInt.IsValid()) { EOnlineSessionState::Type SessionState = SessionInt->GetSessionState(SessionName); if (SessionState != EOnlineSessionState::NoSession) { CachedSessionResult = SearchResult; OnEndForJoinSessionCompleteDelegateHandle = EndExistingSession_Impl(SessionName, OnEndForJoinSessionCompleteDelegate); } else { GetGameInstance()->JoinSession(GetGameInstance()->GetFirstGamePlayer(), SearchResult); } } }