Files
2025-05-18 13:04:45 +08:00

87 lines
3.6 KiB
C++

// 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<FMassEntityManager>& EntityManager)
{
EntityQuery.AddRequirement<FMassNetworkIDFragment>(EMassFragmentAccess::ReadWrite);
EntityQuery.AddSubsystemRequirement<UMassReplicationSubsystem>(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<UMassReplicationSubsystem>();
const TArrayView<FMassNetworkIDFragment> NetworkIDList = Context.GetMutableFragmentView<FMassNetworkIDFragment>();
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"))
}