Goran Lazarevski 3bcab085f8 Initial commit
2025-03-20 11:06:26 +01:00

99 lines
3.4 KiB
C++

// 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<ULyraExperienceManagerComponent> ExperienceManagerComponent;
// The ability system component subobject for game-wide things (primarily gameplay cues)
UPROPERTY(VisibleAnywhere, Category = "Lyra|GameState")
TObjectPtr<ULyraAbilitySystemComponent> 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<APlayerState> RecorderPlayerState;
UFUNCTION()
void OnRep_RecorderPlayerState();
};