// Copyright Epic Games, Inc. All Rights Reserved. #include "MassReplicationFragments.h" #include "MassReplicationSubsystem.h" #include "MassReplicationProcessor.h" #include "MassExecutionContext.h" #include "Engine/World.h" //----------------------------------------------------------------------// // UMassNetworkIDFragmentInitializer //----------------------------------------------------------------------// UMassNetworkIDFragmentInitializer::UMassNetworkIDFragmentInitializer() : EntityQuery(*this) { ExecutionFlags = (int32)(EProcessorExecutionFlags::Standalone | EProcessorExecutionFlags::Server); ObservedType = FMassNetworkIDFragment::StaticStruct(); Operation = EMassObservedOperation::Add; } void UMassNetworkIDFragmentInitializer::ConfigureQueries(const TSharedRef& EntityManager) { EntityQuery.AddRequirement(EMassFragmentAccess::ReadWrite); EntityQuery.AddSubsystemRequirement(EMassFragmentAccess::ReadWrite); } void UMassNetworkIDFragmentInitializer::Execute(FMassEntityManager& EntityManager, FMassExecutionContext& Context) { QUICK_SCOPE_CYCLE_COUNTER(MassProcessor_InitNetworkID_Run); const UWorld* World = EntityManager.GetWorld(); const ENetMode NetMode = World->GetNetMode(); if (NetMode != NM_Client) { #if UE_REPLICATION_COMPILE_SERVER_CODE EntityQuery.ForEachEntityChunk(Context, [](FMassExecutionContext& Context) { UMassReplicationSubsystem& ReplicationSubsystem = Context.GetMutableSubsystemChecked(); const TArrayView NetworkIDList = Context.GetMutableFragmentView(); for (FMassExecutionContext::FEntityIterator EntityIt = Context.CreateEntityIterator(); EntityIt; ++EntityIt) { NetworkIDList[EntityIt].NetID = ReplicationSubsystem.GetNextAvailableMassNetID(); } }); #endif //UE_REPLICATION_COMPILE_SERVER_CODE } } //----------------------------------------------------------------------// // FMassReplicationParameters //----------------------------------------------------------------------// FMassReplicationParameters::FMassReplicationParameters() { LODDistance[EMassLOD::High] = 0.f; LODDistance[EMassLOD::Medium] = 1000.f; LODDistance[EMassLOD::Low] = 2500.f; LODDistance[EMassLOD::Off] = 5000.f; LODMaxCount[EMassLOD::High] = 1600; LODMaxCount[EMassLOD::Medium] = 3200; LODMaxCount[EMassLOD::Low] = 48000; LODMaxCount[EMassLOD::Off] = 0; LODMaxCountPerViewer[EMassLOD::High] = 100; LODMaxCountPerViewer[EMassLOD::Medium] = 200; LODMaxCountPerViewer[EMassLOD::Low] = 300; LODMaxCountPerViewer[EMassLOD::Off] = 0; UpdateInterval[EMassLOD::High] = 0.1f; UpdateInterval[EMassLOD::Medium] = 0.2f; UpdateInterval[EMassLOD::Low] = 0.3f; UpdateInterval[EMassLOD::Off] = 0.5f; } //----------------------------------------------------------------------// // FMassReplicationSharedFragment //----------------------------------------------------------------------// FMassReplicationSharedFragment::FMassReplicationSharedFragment(UMassReplicationSubsystem& ReplicationSubsystem, const FMassReplicationParameters& Params) { LODCalculator.Initialize(Params.LODDistance, Params.BufferHysteresisOnDistancePercentage / 100.0f, Params.LODMaxCountPerViewer); // Setting the LODMaxCoundPerViewer as the MAXCount as the processor will be called for each client and will recalculate it per client BubbleInfoClassHandle = ReplicationSubsystem.GetBubbleInfoClassHandle(Params.BubbleInfoClass); CachedReplicator = Params.ReplicatorClass.GetDefaultObject(); checkf(CachedReplicator, TEXT("Expecting a valid replicator class")) }