// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "AbilitySystemInterface.h" #include "ModularGameState.h" #include "LyraGameState.generated.h" struct FLyraVerbMessage; class APlayerState; class UAbilitySystemComponent; class ULyraAbilitySystemComponent; class ULyraExperienceManagerComponent; class UObject; struct FFrame; /** * ALyraGameState * * The base game state class used by this project. */ UCLASS(Config = Game) class LYRAGAME_API ALyraGameState : public AModularGameStateBase, public IAbilitySystemInterface { GENERATED_BODY() public: ALyraGameState(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); //~AActor interface virtual void PreInitializeComponents() override; virtual void PostInitializeComponents() override; virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; virtual void Tick(float DeltaSeconds) override; //~End of AActor interface //~AGameStateBase interface virtual void AddPlayerState(APlayerState* PlayerState) override; virtual void RemovePlayerState(APlayerState* PlayerState) override; virtual void SeamlessTravelTransitionCheckpoint(bool bToTransitionMap) override; //~End of AGameStateBase interface //~IAbilitySystemInterface virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override; //~End of IAbilitySystemInterface // Gets the ability system component used for game wide things UFUNCTION(BlueprintCallable, Category = "Lyra|GameState") ULyraAbilitySystemComponent* GetLyraAbilitySystemComponent() const { return AbilitySystemComponent; } // Send a message that all clients will (probably) get // (use only for client notifications like eliminations, server join messages, etc... that can handle being lost) UFUNCTION(NetMulticast, Unreliable, BlueprintCallable, Category = "Lyra|GameState") void MulticastMessageToClients(const FLyraVerbMessage Message); // Send a message that all clients will be guaranteed to get // (use only for client notifications that cannot handle being lost) UFUNCTION(NetMulticast, Reliable, BlueprintCallable, Category = "Lyra|GameState") void MulticastReliableMessageToClients(const FLyraVerbMessage Message); // Gets the server's FPS, replicated to clients float GetServerFPS() const; // Indicate the local player state is recording a replay void SetRecorderPlayerState(APlayerState* NewPlayerState); // Gets the player state that recorded the replay, if valid APlayerState* GetRecorderPlayerState() const; // Delegate called when the replay player state changes DECLARE_MULTICAST_DELEGATE_OneParam(FOnRecorderPlayerStateChanged, APlayerState*); FOnRecorderPlayerStateChanged OnRecorderPlayerStateChangedEvent; private: // Handles loading and managing the current gameplay experience UPROPERTY() TObjectPtr ExperienceManagerComponent; // The ability system component subobject for game-wide things (primarily gameplay cues) UPROPERTY(VisibleAnywhere, Category = "Lyra|GameState") TObjectPtr AbilitySystemComponent; protected: UPROPERTY(Replicated) float ServerFPS; // The player state that recorded a replay, it is used to select the right pawn to follow // This is only set in replay streams and is not replicated normally UPROPERTY(Transient, ReplicatedUsing = OnRep_RecorderPlayerState) TObjectPtr RecorderPlayerState; UFUNCTION() void OnRep_RecorderPlayerState(); };