// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Engine/EngineTypes.h" #include "GameFramework/PlayerStart.h" #include "GameplayTagContainer.h" #include "UObject/ObjectPtr.h" #include "UObject/UObjectGlobals.h" #include "LyraPlayerStart.generated.h" class AController; class UObject; enum class ELyraPlayerStartLocationOccupancy { Empty, Partial, Full }; /** * ALyraPlayerStart * * Base player starts that can be used by a lot of modes. */ UCLASS(Config = Game) class LYRAGAME_API ALyraPlayerStart : public APlayerStart { GENERATED_BODY() public: ALyraPlayerStart(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); const FGameplayTagContainer& GetGameplayTags() { return StartPointTags; } ELyraPlayerStartLocationOccupancy GetLocationOccupancy(AController* const ControllerPawnToFit) const; /** Did this player start get claimed by a controller already? */ bool IsClaimed() const; /** If this PlayerStart was not claimed, claim it for ClaimingController */ bool TryClaim(AController* OccupyingController); protected: /** Check if this PlayerStart is still claimed */ void CheckUnclaimed(); /** The controller that claimed this PlayerStart */ UPROPERTY(Transient) TObjectPtr ClaimingController = nullptr; /** Interval in which we'll check if this player start is not colliding with anyone anymore */ UPROPERTY(EditDefaultsOnly, Category = "Player Start Claiming") float ExpirationCheckInterval = 1.f; /** Tags to identify this player start */ UPROPERTY(EditAnywhere) FGameplayTagContainer StartPointTags; /** Handle to track expiration recurring timer */ FTimerHandle ExpirationTimerHandle; };