void UUModGameInstance::DestroyCurSession(IOnlineSessionPtr Sessions) { FName str = *CurSessionName; CurSessionName = TEXT(""); Sessions->EndSession(str); Sessions->DestroySession(str); }
/** 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 UOnlineSessionClient::EndOnlineSession(FName SessionName) { IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); if (SessionInterface.IsValid()) { FNamedOnlineSession* Session = SessionInterface->GetNamedSession(SessionName); if (Session && Session->SessionState == EOnlineSessionState::InProgress) { EndSessionCompleteHandle = SessionInterface->AddOnEndSessionCompleteDelegate_Handle(FOnStartSessionCompleteDelegate::CreateUObject(this, &UOnlineSessionClient::OnEndSessionComplete)); SessionInterface->EndSession(SessionName); } } }
FDelegateHandle UOnlineSessionClient::EndExistingSession_Impl(FName SessionName, FOnEndSessionCompleteDelegate& Delegate) { FDelegateHandle Result; IOnlineSessionPtr SessionInt = GetSessionInt(); if (SessionInt.IsValid()) { Result = SessionInt->AddOnEndSessionCompleteDelegate_Handle(Delegate); SessionInt->EndSession(SessionName); } else { Delegate.ExecuteIfBound(SessionName, true); } return Result; }
/** Ends the online game using the session name in the PlayerState */ void AShooterPlayerController::ClientEndOnlineGame_Implementation() { if (!IsPrimaryPlayer()) return; AShooterPlayerState* ShooterPlayerState = Cast<AShooterPlayerState>(PlayerState); if (ShooterPlayerState) { IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(); if (OnlineSub) { IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface(); if (Sessions.IsValid()) { UE_LOG(LogOnline, Log, TEXT("Ending session %s on client"), *ShooterPlayerState->SessionName.ToString() ); Sessions->EndSession(ShooterPlayerState->SessionName); } } } }
bool AFPSGPlayerController::endSession(FName sessionName) const { bool success = false; IOnlineSubsystem* onlineSubsystem = IOnlineSubsystem::Get(); IOnlineSessionPtr sessions = onlineSubsystem != NULL ? onlineSubsystem->GetSessionInterface() : NULL; if (sessions.IsValid()) { //End the session success = sessions->EndSession(sessionName); if (success) { GEngine->AddOnScreenDebugMessage(-1, 20.0f, FColor::Cyan, TEXT("AFPSGPlayerController::endSession success")); } else { GEngine->AddOnScreenDebugMessage(-1, 20.0f, FColor::Cyan, TEXT("AFPSGPlayerController::endSession NOT success")); } } return success; }