diff --git a/Content/Framework/CGameMode_BP.uasset b/Content/Framework/CGameMode_BP.uasset index 7d59d2f..10ff9d4 100644 --- a/Content/Framework/CGameMode_BP.uasset +++ b/Content/Framework/CGameMode_BP.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a884609c7fad203e64e5d0223d1d659d7008329c83067fadf602f30b2a1b5947 -size 21251 +oid sha256:3a723ace2e67c2745b2b0ed5a8bf66218e2db32e48a96a47f3e2109c85a54e98 +size 21486 diff --git a/Content/Maps/GameLevel.umap b/Content/Maps/GameLevel.umap index cf3bb4b..fe4b131 100644 --- a/Content/Maps/GameLevel.umap +++ b/Content/Maps/GameLevel.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36cc3ecc3d1ade399fa8586305580de9c36b5370ba6959d1009ac189e404204f -size 15335523 +oid sha256:1d5b946910f74e69d6a7a519630591c27f05269541d3062346cded272a51f344 +size 15354151 diff --git a/Source/Crunch/Private/Game/CGameMode.cpp b/Source/Crunch/Private/Game/CGameMode.cpp index 4f625c9..c090103 100644 --- a/Source/Crunch/Private/Game/CGameMode.cpp +++ b/Source/Crunch/Private/Game/CGameMode.cpp @@ -2,3 +2,46 @@ #include "Crunch/Public/Game/CGameMode.h" + +#include "EngineUtils.h" +#include "GameFramework/PlayerStart.h" + +APlayerController* ACGameMode::SpawnPlayerController(ENetRole InRemoteRole, const FString& Options) +{ + const auto NewPlayerController{Super::SpawnPlayerController(InRemoteRole, Options)}; + const auto NewPlayerControllerTeamInterface{Cast(NewPlayerController)}; + const FGenericTeamId TeamId{GetTeamIDForPlayer(NewPlayerController)}; + if (NewPlayerControllerTeamInterface) + { + NewPlayerControllerTeamInterface->SetGenericTeamId(TeamId); + } + NewPlayerController->StartSpot = FindNextStartSpotForTeam(TeamId); + + return NewPlayerController; +} + +FGenericTeamId ACGameMode::GetTeamIDForPlayer(const APlayerController* PlayerController) const +{ + static int PlayerCount{0}; + ++PlayerCount; + return FGenericTeamId(PlayerCount % 2); +} + +AActor* ACGameMode::FindNextStartSpotForTeam(const FGenericTeamId& TeamId) const +{ + const auto StartSpotTag{TeamStartSpotTagMap.Find(TeamId)}; + if (!StartSpotTag) + { + return nullptr; + } + auto World{GetWorld()}; + for (TActorIterator It(World); It; ++It) + { + if (It->PlayerStartTag == *StartSpotTag) + { + It->PlayerStartTag = FName("Taken"); + return *It; + } + } + return nullptr; +} diff --git a/Source/Crunch/Public/Game/CGameMode.h b/Source/Crunch/Public/Game/CGameMode.h index 10ab051..d9327a0 100644 --- a/Source/Crunch/Public/Game/CGameMode.h +++ b/Source/Crunch/Public/Game/CGameMode.h @@ -3,6 +3,7 @@ #pragma once #include "CoreMinimal.h" +#include "GenericTeamAgentInterface.h" #include "GameFramework/GameModeBase.h" #include "CGameMode.generated.h" @@ -10,4 +11,13 @@ UCLASS() class CRUNCH_API ACGameMode : public AGameModeBase { GENERATED_BODY() +public: + virtual APlayerController* SpawnPlayerController(ENetRole InRemoteRole, const FString& Options) override; +private: + FGenericTeamId GetTeamIDForPlayer(const APlayerController* PlayerController) const; + + AActor* FindNextStartSpotForTeam(const FGenericTeamId& TeamId) const; + + UPROPERTY(EditDefaultsOnly, Category="Team") + TMap TeamStartSpotTagMap; };