diff --git a/Content/Blueprints/GameModes/BP_TeamsGameMode.uasset b/Content/Blueprints/GameModes/BP_TeamsGameMode.uasset new file mode 100644 index 0000000..753c46e Binary files /dev/null and b/Content/Blueprints/GameModes/BP_TeamsGameMode.uasset differ diff --git a/Source/Blaster/GameMode/TeamsGameMode.cpp b/Source/Blaster/GameMode/TeamsGameMode.cpp new file mode 100644 index 0000000..95151bf --- /dev/null +++ b/Source/Blaster/GameMode/TeamsGameMode.cpp @@ -0,0 +1,67 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "TeamsGameMode.h" + +#include "Blaster/GameState/BlasterGameState.h" +#include "Kismet/GameplayStatics.h" + +void ATeamsGameMode::PostLogin(APlayerController* NewPlayer) +{ + Super::PostLogin(NewPlayer); + + AssignToTeam(NewPlayer->PlayerState.Get()); +} + +void ATeamsGameMode::Logout(AController* Exiting) +{ + Super::Logout(Exiting); + + BGameState = (BGameState == nullptr) ? Cast(UGameplayStatics::GetGameState(this)) : BGameState; + ABlasterPlayerState* BPState = Exiting->GetPlayerState(); + if (BGameState && BPState) + { + if (BGameState->RedTeam.Contains(BPState)) + { + BGameState->RedTeam.Remove(BPState); + } + if (BGameState->BlueTeam.Contains(BPState)) + { + BGameState->BlueTeam.Remove(BPState); + } + } +} + +void ATeamsGameMode::HandleMatchHasStarted() +{ + Super::HandleMatchHasStarted(); + + BGameState = (BGameState == nullptr) ? Cast(UGameplayStatics::GetGameState(this)) : BGameState; + if (BGameState == nullptr) return; + + for (auto PState : BGameState->PlayerArray) + { + AssignToTeam(PState); + } +} + +void ATeamsGameMode::AssignToTeam(APlayerState* PlayerState) +{ + BGameState = (BGameState == nullptr) ? Cast(UGameplayStatics::GetGameState(this)) : BGameState; + if (PlayerState == nullptr) return; + + ABlasterPlayerState* BPlayerState = Cast(PlayerState); + if (BPlayerState && BPlayerState->GetTeam() == ETeam::ET_NoTeam) + { + if (BGameState->BlueTeam.Num() >= BGameState->RedTeam.Num()) + { + BGameState->RedTeam.AddUnique(BPlayerState); + BPlayerState->SetTeam(ETeam::ET_RedTeam); + } + else + { + BGameState->BlueTeam.AddUnique(BPlayerState); + BPlayerState->SetTeam(ETeam::ET_BlueTeam); + } + } +} diff --git a/Source/Blaster/GameMode/TeamsGameMode.h b/Source/Blaster/GameMode/TeamsGameMode.h new file mode 100644 index 0000000..633ffb1 --- /dev/null +++ b/Source/Blaster/GameMode/TeamsGameMode.h @@ -0,0 +1,30 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "BlasterGameMode.h" +#include "TeamsGameMode.generated.h" + +/** + * + */ +UCLASS() +class BLASTER_API ATeamsGameMode : public ABlasterGameMode +{ + GENERATED_BODY() + +public: + virtual void PostLogin(APlayerController* NewPlayer) override; + virtual void Logout(AController* Exiting) override; + +protected: + virtual void HandleMatchHasStarted() override; + +private: + UPROPERTY() + class ABlasterGameState* BGameState; + + void AssignToTeam(APlayerState* PlayerState); + +};