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;
}