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(); } }
void AShooterWeapon::SimulateWeaponFire() { if (Role == ROLE_Authority && CurrentState != EWeaponState::Firing) { return; } if (MuzzleFX) { USkeletalMeshComponent* UseWeaponMesh = GetWeaponMesh(); if (!bLoopedMuzzleFX || MuzzlePSC == NULL) { // Split screen requires we create 2 effects. One that we see and one that the other player sees. if( (MyPawn != NULL ) && ( MyPawn->IsLocallyControlled() == true ) ) { AController* PlayerCon = MyPawn->GetController(); if( PlayerCon != NULL ) { Mesh1P->GetSocketLocation(MuzzleAttachPoint); MuzzlePSC = UGameplayStatics::SpawnEmitterAttached(MuzzleFX, Mesh1P, MuzzleAttachPoint); MuzzlePSC->bOwnerNoSee = false; MuzzlePSC->bOnlyOwnerSee = true; Mesh3P->GetSocketLocation(MuzzleAttachPoint); MuzzlePSCSecondary = UGameplayStatics::SpawnEmitterAttached(MuzzleFX, Mesh3P, MuzzleAttachPoint); MuzzlePSCSecondary->bOwnerNoSee = true; MuzzlePSCSecondary->bOnlyOwnerSee = false; } } else { MuzzlePSC = UGameplayStatics::SpawnEmitterAttached(MuzzleFX, UseWeaponMesh, MuzzleAttachPoint); } } } if (!bLoopedFireAnim || !bPlayingFireAnim) { PlayWeaponAnimation(FireAnim); bPlayingFireAnim = true; } if (bLoopedFireSound) { if (FireAC == NULL) { FireAC = PlayWeaponSound(FireLoopSound); } } else { PlayWeaponSound(FireSound); } AShooterPlayerController* PC = (MyPawn != NULL) ? Cast<AShooterPlayerController>(MyPawn->Controller) : NULL; if (PC != NULL && PC->IsLocalController()) { if (FireCameraShake != NULL) { PC->ClientPlayCameraShake(FireCameraShake, 1); } if (FireForceFeedback != NULL) { PC->ClientPlayForceFeedback(FireForceFeedback, false, "Weapon"); } } }