Modification made to playerstate from gamemode won't stand

Hey internet,

I’m a starter in UE4 and doing a very basic multiplayer setup (2 players).
I made a custom Gamemode to set teams and pick a PlayerStart based on the team in the playerState.
I first override the function AGameMode::PostLogin to set a different team for each player (it’s a bool: teamA or not).
I tested that and I am sure that both player have their own team.

I then override the function AGameMode::ChoosePlayerStart_Implementation to set a PlayerStart for each player. The problem is, Both my players start at the same PlayerStart. I made some output to see what’s going on and both my players are back in the same team at the start of that function(both bool teamA are set to false)!?

I really don’t get it. It is as if my change won’t apply… any help would be appreciated!

PlayerState.h

UCLASS()
class PROJETDEC_API AMyPlayerState : public APlayerState
{
	GENERATED_BODY()

public:
	UPROPERTY(Replicated)
		bool teamA;
};

PlayerState.cpp

void AMyPlayerState::GetLifetimeReplicatedProps(TArray<FLifetimeProperty> & OutLifetimeProps) const {
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	DOREPLIFETIME(AMyPlayerState, teamA);
}

GameMode.h

UCLASS()
class PROJETDEC_API AStandardGameMode : public AGameMode
{
	GENERATED_BODY()

public:
	AStandardGameMode(const FObjectInitializer& ObjectInitializer);
		
	void PostLogin(APlayerController * NewPlayer) override;

	AActor * ChoosePlayerStart_Implementation(AController * Player) override;
};

GameMode.cpp

AStandardGameMode::AStandardGameMode(const FObjectInitializer& ObjectInitializer)
	:Super(ObjectInitializer)
{

	DefaultPawnClass = ACameraPawn::StaticClass();

	PlayerStateClass = AMyPlayerState::StaticClass();
}

void AStandardGameMode::PostLogin(APlayerController * NewPlayer) {
	Super::PostLogin(NewPlayer);

	if (NewPlayer) {
		AMyPlayerState * PS = Cast<AMyPlayerState>(NewPlayer->PlayerState);
		if (PS && GameState) {
			int8 NumTeamA = 0;
			int8 NumTeamB = 0;
			for (APlayerState * It : GameState->PlayerArray) {
				AMyPlayerState * OtherPS = Cast<AMyPlayerState>(It);
				if (OtherPS) {
					if (OtherPS->teamA) {
						NumTeamA++;
					}
					else {
						NumTeamB++;
					}
				}
			}
			if(NumTeamA < NumTeamB) {
				PS->teamA = true;
			}
		}
	}
}

AActor * AStandardGameMode::ChoosePlayerStart_Implementation(AController * Player) {
	if (Player) {
		AMyPlayerState * PS = Cast<AMyPlayerState>(Player->PlayerState);
		if (PS) {
			TArray<AGeneralPlayerStart *> Starts;
			for (TActorIterator<AGeneralPlayerStart> StartItr(GetWorld()); StartItr; ++StartItr) {
				if (StartItr->teamA == PS->teamA) {
					Starts.Add(*StartItr);
				}
			}
			return Starts[0];
		}
	}
	return NULL;
}

Found it.

It has something to do with ‘bool ShouldSpawnAtStartSpot(AController * Player)’. You have, for some reason to make it return false.

That solved my problem.

Thanks!