AActor* AGameModeBase::FindPlayerStart_Implementation(AController* Player, const FString& IncomingName) { UWorld* World = GetWorld(); // If incoming start is specified, then just use it if (!IncomingName.IsEmpty()) { const FName IncomingPlayerStartTag = FName(*IncomingName); for (TActorIterator<APlayerStart> It(World); It; ++It) { APlayerStart* Start = *It; if (Start && Start->PlayerStartTag == IncomingPlayerStartTag) { return Start; } } } // Always pick StartSpot at start of match if (ShouldSpawnAtStartSpot(Player)) { if (AActor* PlayerStartSpot = Player->StartSpot.Get()) { return PlayerStartSpot; } else { UE_LOG(LogGameMode, Error, TEXT("Error - ShouldSpawnAtStartSpot returned true but the Player StartSpot was null.")); } } AActor* BestStart = ChoosePlayerStart(Player); if (BestStart == nullptr) { // No player start found UE_LOG(LogGameMode, Log, TEXT("Warning - PATHS NOT DEFINED or NO PLAYERSTART with positive rating")); // This is a bit odd, but there was a complex chunk of code that in the end always resulted in this, so we may as well just // short cut it down to this. Basically we are saying spawn at 0,0,0 if we didn't find a proper player start BestStart = World->GetWorldSettings(); } return BestStart; }
void ANinjaGameModeBase::BeginRound() { UWorld* World = GetWorld(); if (World) { ClearPlayerStartTags(); for (APlayerState* CurrState : GameState->PlayerArray) { ANinjaPlayerState* State = (ANinjaPlayerState*)CurrState; if (State) { APlayerController* Cont = (APlayerController*) State->GetOwner(); GEngine->AddOnScreenDebugMessage(-1, 1.5, FColor::Blue, FString::Printf(TEXT("%s"), *Cont->GetName())); if (State->GetChosenCharacter()) { GEngine->AddOnScreenDebugMessage(-1, 1.5, FColor::Red, FString::Printf(TEXT("%s - %s"), *Cont->GetName(), *State->GetChosenCharacter()->GetName())); } if (Cont) { ACharacter* Character = Cont->GetCharacter(); APlayerStart* PS = (APlayerStart*)ChoosePlayerStart(Cont); if (PS) { PS->PlayerStartTag = FName(TEXT("Taken")); if (Character) { Character->Destroy(); } FActorSpawnParameters Params; Params.Owner = Cont; ANinjaCharacter* SpawnedChar = World->SpawnActor<ANinjaCharacter>(State->GetChosenCharacter(), PS->GetActorLocation(), PS->GetActorRotation(), Params); if (SpawnedChar) { Cont->Possess(SpawnedChar); } } } } } } }