/** Starts the online game using the session name in the PlayerState */ void AShooterPlayerController::ClientStartOnlineGame_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("Starting session %s on client"), *ShooterPlayerState->SessionName.ToString() ); Sessions->StartSession(ShooterPlayerState->SessionName); } } } else { // Keep retrying until player state is replicated GetWorld()->GetTimerManager().SetTimer(FTimerDelegate::CreateUObject(this, &AShooterPlayerController::ClientStartOnlineGame_Implementation), 0.2f, false); } }
void AKinectPlayerController::TickActor(float DeltaTime, enum ELevelTick TickType, FActorTickFunction& ThisTickFunction) { Super::TickActor(DeltaTime, TickType, ThisTickFunction); // Is this the first frame after the game has ended if (bGameEndedFrame) { bGameEndedFrame = false; // ONLY PUT CODE HERE WHICH YOU DON'T WANT TO BE DONE DUE TO HOST LOSS // Do we need to show the end of round scoreboard? if (IsPrimaryPlayer()) { bChangeMapFrame = true; } } };
/** 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); } } } }
void AShooterPlayerController::ClientGameEnded_Implementation(class AActor* EndGameFocus, bool bIsWinner) { Super::ClientGameEnded_Implementation(EndGameFocus, bIsWinner); // Allow only looking around SetIgnoreMoveInput(true); bAllowGameActions = false; // Make sure that we still have valid view target SetViewTarget(GetPawn()); // Show scoreboard AShooterHUD* ShooterHUD = GetShooterHUD(); if (ShooterHUD) { ShooterHUD->SetMatchState(bIsWinner ? EShooterMatchState::Won : EShooterMatchState::Lost); if (IsPrimaryPlayer()) { ShooterHUD->ShowScoreboard(true); } } }