Hey, I am making my first online multiplayer game. I want to make an among us like system where there are normal players and some random impostors. What I am trying to arrange these roles randomly and spawn and possess the respective pawns after on PostSeamlessTravel, but only sometimes characters actually get spawned and possessed. I think it might have to do with the client not being ready at this time. What should i do?
ABolinaGameMode::ABolinaGameMode()
{
DefaultPawnClass = nullptr;
NumImpostors = 1;
}
void ABolinaGameMode::StartMatch()
{
Super::StartMatch();
}
/*
* Creates an array of random character classes to be possessed
* @return
*/
TArray<TSubclassOf<ABolinaBaseCharacter>> ABolinaGameMode::InitializePendingRoles()
{
TArray<TSubclassOf<ABolinaBaseCharacter>> pendingRoles;
for (int i = 0; i < NumImpostors; i++)
{
pendingRoles.Add(IntruderClass);
}
for (int i = 0; i < GameState->PlayerArray.Num() - NumImpostors; i++)
{
pendingRoles.Add(CrewMateClass);
}
Test::Shuffle(pendingRoles);
return pendingRoles;
}
void ABolinaGameMode::BeginPlay()
{
Super::BeginPlay();
}
void ABolinaGameMode::AssignPlayerRolesAndSpawnCharacters()
{
TArray<TSubclassOf<ABolinaBaseCharacter>> pendingRoles = InitializePendingRoles();
UWorld* world = GetWorld();
for (APlayerState* playerState : GameState->PlayerArray)
{
APlayerController* pc = playerState->GetPlayerController();
TSubclassOf<ABolinaBaseCharacter> roleClass = pendingRoles.Pop();
AActor* playerStart = FindPlayerStart(pc);
if (playerStart == nullptr)
{
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, "Player Start is null");
}
ABolinaBaseCharacter* spawnedCharacter = world->SpawnActor<ABolinaBaseCharacter>(roleClass, playerStart->GetActorTransform());
if (spawnedCharacter == nullptr)
{
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, "Spawned is null");
}
pc->Possess(spawnedCharacter);
}
}
void ABolinaGameMode::PostSeamlessTravel()
{
Super::PostSeamlessTravel();
AssignPlayerRolesAndSpawnCharacters();
}
void ABolinaGameMode::HandleSeamlessTravelPlayer(AController*& C)
{
Super::HandleSeamlessTravelPlayer(C);
}