// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "ReplicationGraph.h" #include "LyraReplicationGraphTypes.h" #include "LyraReplicationGraph.generated.h" class AGameplayDebuggerCategoryReplicator; DECLARE_LOG_CATEGORY_EXTERN(LogLyraRepGraph, Display, All); /** Lyra Replication Graph implementation. See additional notes in LyraReplicationGraph.cpp! */ UCLASS(transient, config=Engine) class ULyraReplicationGraph : public UReplicationGraph { GENERATED_BODY() public: ULyraReplicationGraph(); virtual void ResetGameWorldState() override; virtual void InitGlobalActorClassSettings() override; virtual void InitGlobalGraphNodes() override; virtual void InitConnectionGraphNodes(UNetReplicationGraphConnection* RepGraphConnection) override; virtual void RouteAddNetworkActorToNodes(const FNewReplicatedActorInfo& ActorInfo, FGlobalActorReplicationInfo& GlobalInfo) override; virtual void RouteRemoveNetworkActorToNodes(const FNewReplicatedActorInfo& ActorInfo) override; UPROPERTY() TArray> AlwaysRelevantClasses; UPROPERTY() TObjectPtr GridNode; UPROPERTY() TObjectPtr AlwaysRelevantNode; TMap AlwaysRelevantStreamingLevelActors; #if WITH_GAMEPLAY_DEBUGGER void OnGameplayDebuggerOwnerChange(AGameplayDebuggerCategoryReplicator* Debugger, APlayerController* OldOwner); #endif void PrintRepNodePolicies(); private: void AddClassRepInfo(UClass* Class, EClassRepNodeMapping Mapping); void RegisterClassRepNodeMapping(UClass* Class); EClassRepNodeMapping GetClassNodeMapping(UClass* Class) const; void RegisterClassReplicationInfo(UClass* Class); bool ConditionalInitClassReplicationInfo(UClass* Class, FClassReplicationInfo& ClassInfo); void InitClassReplicationInfo(FClassReplicationInfo& Info, UClass* Class, bool Spatialize) const; EClassRepNodeMapping GetMappingPolicy(UClass* Class); bool IsSpatialized(EClassRepNodeMapping Mapping) const { return Mapping >= EClassRepNodeMapping::Spatialize_Static; } TClassMap ClassRepNodePolicies; /** Classes that had their replication settings explictly set by code in ULyraReplicationGraph::InitGlobalActorClassSettings */ TArray ExplicitlySetClasses; }; UCLASS() class ULyraReplicationGraphNode_AlwaysRelevant_ForConnection : public UReplicationGraphNode_AlwaysRelevant_ForConnection { GENERATED_BODY() public: virtual void NotifyAddNetworkActor(const FNewReplicatedActorInfo& Actor) override { } virtual bool NotifyRemoveNetworkActor(const FNewReplicatedActorInfo& ActorInfo, bool bWarnIfNotFound=true) override { return false; } virtual void NotifyResetAllNetworkActors() override { } virtual void GatherActorListsForConnection(const FConnectionGatherActorListParameters& Params) override; virtual void LogNode(FReplicationGraphDebugInfo& DebugInfo, const FString& NodeName) const override; void OnClientLevelVisibilityAdd(FName LevelName, UWorld* StreamingWorld); void OnClientLevelVisibilityRemove(FName LevelName); void ResetGameWorldState(); #if WITH_GAMEPLAY_DEBUGGER AGameplayDebuggerCategoryReplicator* GameplayDebugger = nullptr; #endif private: TArray > AlwaysRelevantStreamingLevelsNeedingReplication; bool bInitializedPlayerState = false; }; /** This is a specialized node for handling PlayerState replication in a frequency limited fashion. It tracks all player states but only returns a subset of them to the replication driver each frame. This is an optimization for large player connection counts, and not a requirement. */ UCLASS() class ULyraReplicationGraphNode_PlayerStateFrequencyLimiter : public UReplicationGraphNode { GENERATED_BODY() ULyraReplicationGraphNode_PlayerStateFrequencyLimiter(); virtual void NotifyAddNetworkActor(const FNewReplicatedActorInfo& Actor) override { } virtual bool NotifyRemoveNetworkActor(const FNewReplicatedActorInfo& ActorInfo, bool bWarnIfNotFound=true) override { return false; } virtual bool NotifyActorRenamed(const FRenamedReplicatedActorInfo& Actor, bool bWarnIfNotFound=true) override { return false; } virtual void GatherActorListsForConnection(const FConnectionGatherActorListParameters& Params) override; virtual void PrepareForReplication() override; virtual void LogNode(FReplicationGraphDebugInfo& DebugInfo, const FString& NodeName) const override; /** How many actors we want to return to the replication driver per frame. Will not suppress ForceNetUpdate. */ int32 TargetActorsPerFrame = 2; private: TArray ReplicationActorLists; FActorRepListRefView ForceNetUpdateReplicationActorList; };