Triage Tt Metal Asserts
tenstorrent/tt-mlir
Triage a tt-metal uplift diff or digest of TTFATAL validation changes against what tt-mlir guarantees at each optimization level (0: workarounds only, 1: optimizer with DRAM-only fallback, 2: L1…
A skill your agent uses when writing multiplayer C++: replicating a property, choosing an RPC type, tuning relevancy or dormancy, registering replicated subobjects, or turning on push model or Iris.
$ npx skills add quodsoler/unreal-engine-skills --skill ue-networking-replication -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install quodsoler/unreal-engine-skills ue-networking-replication --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/ue-networking-replication .claude/skills/ue-networking-replication && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ue-networking-replication" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-networking-replication into .claude/skills/ue-networking-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-networking-replication", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-networking-replicationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add quodsoler/unreal-engine-skills --skill ue-networking-replication -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install quodsoler/unreal-engine-skills ue-networking-replication --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/ue-networking-replication .agents/skills/ue-networking-replication && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ue-networking-replication" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-networking-replication into .agents/skills/ue-networking-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-networking-replication", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add quodsoler/unreal-engine-skills --skill ue-networking-replication -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install quodsoler/unreal-engine-skills ue-networking-replication --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/ue-networking-replication .cursor/skills/ue-networking-replication && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ue-networking-replication" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-networking-replication into .cursor/skills/ue-networking-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-networking-replication", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/quodsoler/unreal-engine-skills.git --path skills/ue-networking-replication--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add quodsoler/unreal-engine-skills --skill ue-networking-replication -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install quodsoler/unreal-engine-skills ue-networking-replication --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/ue-networking-replication .gemini/skills/ue-networking-replication && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ue-networking-replication" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-networking-replication into .gemini/skills/ue-networking-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-networking-replication", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install quodsoler/unreal-engine-skills ue-networking-replicationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add quodsoler/unreal-engine-skills --skill ue-networking-replication -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/ue-networking-replication .github/skills/ue-networking-replication && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ue-networking-replication" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-networking-replication into .github/skills/ue-networking-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-networking-replication", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add quodsoler/unreal-engine-skills --skill ue-networking-replication -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install quodsoler/unreal-engine-skills ue-networking-replication --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/ue-networking-replication .opencode/skills/ue-networking-replication && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ue-networking-replication" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-networking-replication into .opencode/skills/ue-networking-replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-networking-replication", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ue-networking-replicationA skill your agent uses when writing multiplayer C++: replicating a property, choosing an RPC type, tuning relevancy or dormancy, registering replicated subobjects, or turning on push model or Iris.
Ue Networking Replication is an agent skill from quodsoler/unreal-engine-skills. Use when writing multiplayer C++: replicating a property, choosing an RPC type, tuning relevancy or dormancy, registering replicated subobjects, or turning on push model or Iris. Also use when the user mentions 'replicate a variable', 'OnRep', 'DOREPLIFETIME', 'GetLifetimeReplicatedProps', 'Server RPC', 'NetMulticast', 'WithValidation', 'CONDOwnerOnly', 'HasAuthority', 'ENetRole', 'FFastArraySerializer', 'MARKPROPERTYDIRTYFROMNAME', 'net dormancy', 'replication graph', 'dedicated server' or 'listen server'. For…
Its SKILL.md is about 7.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/replication-patterns.md` and `references/rpc-decision-guide.md`).
It sits in Databases, covering Database administration. It works with C++. The repository describes itself as: Unreal Engine C++ skills for AI coding agents. 27 skills covering gameplay, rendering, networking, animation, and more. Works with Claude Code, Cursor, Windsurf, and any agent… The licence is MIT.
Read from SKILL.md and the folder at commit f3742d7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are cpp and ini).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ue Networking Replication loads about 7.1k tokens when it runs, and up to ~15k if it reads all its reference files. Until then it costs about 172 tokens; SKILL.md has 1,964 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from quodsoler/unreal-engine-skills at commit f3742d7, republished under its MIT licence (© quodsoler). 1,964 words, ~7,098 tokens.
.claude/skills/ue-networking-replication/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Target engine: UE 5.8. APIs below are verified against the 5.8 headers; older forms are listed under "Deprecated — do not use".
Server-authoritative replication for actors, components and subobjects. Core APIs live in the Engine module (GameFramework/Actor.h, Engine/NetDriver.h, Net/UnrealNetwork.h) and the NetCore module (Net/Core/PushModel/PushModel.h, Net/Serialization/FastArraySerializer.h). ELifetimeCondition and REPNOTIFY_* come from CoreUObject (UObject/CoreNetTypes.h). Optional systems: the Iris replication system (IrisCore module, SetupIrisSupport(Target) in Build.cs) and the ReplicationGraph plugin (Beta in 5.8, Build.cs module ReplicationGraph).
Read .agents/ue-project-context.md if it exists (module names, conventions, enabled plugins, GAS/networking setup). Do not stop if it is missing.
Identify the area from the request and the codebase. Ask only when two plausible readings would produce different code.
| Request is about… | Go to |
|---|---|
| Authority checks, roles, dedicated vs listen server | Net Roles, Net Modes and Authority |
Replicating a variable, OnRep_, GetLifetimeReplicatedProps | Property Replication |
Who receives a property (COND_*) | Lifetime Conditions |
| Cutting per-frame comparison cost | Push Model |
| Replicated arrays / inventories | Fast Array Serialization |
| Server/Client/Multicast calls, validation | Remote Procedure Calls |
SetOwner, relevancy, culling, dormancy | Ownership, Relevancy and Dormancy |
Replicating UObjects owned by an actor or component | Subobject Replication |
| Simulated bodies, physics prediction | Physics Replication |
Iris, net.Iris.UseIrisReplication | Iris Replication System |
| 50+ connections, spatial relevancy | Replication Graph |
UNetDriver, UNetConnection, disconnect detection | Net Driver and Connections |
Worked end-to-end examples: replication patterns. RPC selection tables and verbatim engine RPC declarations: RPC decision guide.
ENetRole is declared in Engine/Classes/Engine/EngineTypes.h; the accessors are on AActor.
ROLE_None // not replicated
ROLE_SimulatedProxy // remote copy driven by replicated state
ROLE_AutonomousProxy // remote copy of the locally controlled pawn/controller
ROLE_Authority // owns and may mutate this actorFrom GameFramework/Actor.h:
ENetRole GetLocalRole() const;
ENetRole GetRemoteRole() const;
bool HasAuthority() const;
ENetMode GetNetMode() const;
bool IsNetMode(ENetMode Mode) const;ENetMode (Engine/Classes/Engine/EngineBaseTypes.h): NM_Standalone, NM_DedicatedServer, NM_ListenServer, NM_Client. Every mode below NM_Client is a server.
| Machine | GetLocalRole() | GetRemoteRole() |
|---|---|---|
| Server | ROLE_Authority | ROLE_AutonomousProxy or ROLE_SimulatedProxy |
| Owning client | ROLE_AutonomousProxy | ROLE_Authority |
| Other clients | ROLE_SimulatedProxy | ROLE_Authority |
On a listen server the host is ROLE_Authority and locally controlled: use APawn::IsLocallyControlled() to skip host-only or client-only paths.
// MyReplicatedActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyReplicatedActor.generated.h"
UCLASS()
class MYGAME_API AMyReplicatedActor : public AActor
{
GENERATED_BODY()
public:
AMyReplicatedActor();
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
protected:
UPROPERTY(ReplicatedUsing = OnRep_Health)
float Health = 100.f;
UPROPERTY(Replicated)
int32 TeamId = 0;
UFUNCTION()
void OnRep_Health(float PreviousHealth);
};// MyReplicatedActor.cpp
#include "MyReplicatedActor.h"
#include "Net/UnrealNetwork.h"
AMyReplicatedActor::AMyReplicatedActor()
{
bReplicates = true; // or SetReplicates(true) at runtime
SetReplicateMovement(true);
SetNetUpdateFrequency(10.f); // replication considerations per second
SetMinNetUpdateFrequency(2.f); // throttled floor when nothing changes
SetNetCullDistanceSquared(225000000.f); // 150 m squared
NetPriority = 1.f; // still a public field in 5.8
}
void AMyReplicatedActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps); // never omit
DOREPLIFETIME(AMyReplicatedActor, Health);
DOREPLIFETIME_CONDITION(AMyReplicatedActor, TeamId, COND_InitialOnly);
}
void AMyReplicatedActor::OnRep_Health(float PreviousHealth)
{
// Clients only. Must be idempotent: relevancy changes re-fire it.
}Rules:
OnRep_ must be a UFUNCTION(). Its optional single parameter is the previous value and must match the property type.OnRep_ does not fire on the machine that made the change.UPROPERTY(NotReplicated) inside a replicated struct excludes a member.FVector_NetQuantize / _NetQuantize10 / _NetQuantize100 / _NetQuantizeNormal (Engine/NetSerialization.h) cut world-position bandwidth: 0, 1 and 2 decimal places, and 16 bits per component for normals.FRepMovement (Engine/Classes/Engine/ReplicatedState.h) carries location/rotation/velocity when SetReplicateMovement(true); override virtual void OnRep_ReplicatedMovement() to post-process it. UCharacterMovementComponent replicates moves itself — see ue-character-movement.COND_InitialOnly.Macros (Net/UnrealNetwork.h): DOREPLIFETIME, DOREPLIFETIME_CONDITION, DOREPLIFETIME_CONDITION_NOTIFY, DOREPLIFETIME_WITH_PARAMS, DOREPLIFETIME_WITH_PARAMS_FAST, DOREPLIFETIME_WITH_PARAMS_FAST_STATIC_ARRAY, DOREPLIFETIME_ACTIVE_OVERRIDE, DOREPLIFETIME_ACTIVE_OVERRIDE_FAST, DISABLE_REPLICATED_PROPERTY.
FDoRepLifetimeParams (Net/UnrealNetwork.h) is the struct behind the _WITH_PARAMS forms:
ELifetimeCondition Condition = COND_None;
ELifetimeRepNotifyCondition RepNotifyCondition = REPNOTIFY_OnChanged; // or REPNOTIFY_Always
bool bIsPushBased = false;Full ELifetimeCondition enum, CoreUObject/Public/UObject/CoreNetTypes.h:
| Value | Sends to |
|---|---|
COND_None | every connection |
COND_InitialOnly | initial bunch only |
COND_OwnerOnly | the actor's owning connection |
COND_SkipOwner | everyone except the owner |
COND_SimulatedOnly | connections where the actor is a simulated proxy |
COND_AutonomousOnly | connections where the actor is an autonomous proxy |
COND_SimulatedOrPhysics | simulated proxies or bRepPhysics actors |
COND_InitialOrOwner | initial bunch, or the owner |
COND_Custom | always eligible; toggled at runtime via the active-override macros |
COND_ReplayOrOwner | replay connection or the owner |
COND_ReplayOnly | replay connection only |
COND_SimulatedOnlyNoReplay | simulated proxies, never replay |
COND_SimulatedOrPhysicsNoReplay | simulated or bRepPhysics, never replay |
COND_SkipReplay | everything except the replay connection |
COND_Dynamic | condition is overridden at runtime; replicates until you set one |
COND_Never | never replicated |
COND_NetGroup | subobjects only — connections in the same net condition group |
COND_NetGroup pairs with UE::Net::FNetConditionGroupManager (Net/Core/Misc/NetConditionGroupManager.h, module NetCore), reached through UNetworkSubsystem::GetNetConditionGroupManager() (Net/Subsystems/NetworkSubsystem.h):
#include "Net/Core/Misc/NetConditionGroupManager.h"
#include "Net/Subsystems/NetworkSubsystem.h"
AddReplicatedSubObject(MySubObject, COND_NetGroup); // on the owning actor/component
UNetworkSubsystem* NetSubsystem = GetWorld()->GetSubsystem<UNetworkSubsystem>();
NetSubsystem->GetNetConditionGroupManager().RegisterSubObjectInGroup(MySubObject, FName("RedTeam"));
MyPlayerController->IncludeInNetConditionGroup(FName("RedTeam"));UE::Net::NetGroupOwner and UE::Net::NetGroupReplay are engine-managed groups; do not add a player controller to them. APlayerController also exposes RemoveFromNetConditionGroup, IsMemberOfNetConditionGroup and GetNetConditionGroups.
Push model removes the per-frame memcmp of replicated properties: the property is only compared when you mark it dirty. It works with the classic net driver and with Iris — it is not an Iris feature.
// MyPushActor.cpp
#include "MyPushActor.h"
#include "Net/UnrealNetwork.h"
#include "Net/Core/PushModel/PushModel.h"
void AMyPushActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
FDoRepLifetimeParams Params;
Params.bIsPushBased = true;
Params.Condition = COND_OwnerOnly;
DOREPLIFETIME_WITH_PARAMS_FAST(AMyPushActor, Ammo, Params);
}
void AMyPushActor::ConsumeAmmo(int32 Count)
{
if (!HasAuthority())
{
return;
}
Ammo -= Count;
MARK_PROPERTY_DIRTY_FROM_NAME(AMyPushActor, Ammo, this);
}MARK_PROPERTY_DIRTY_FROM_NAME(ClassName, PropertyName, Object) is the preferred marker. Static arrays use MARK_PROPERTY_DIRTY_FROM_NAME_STATIC_ARRAY_INDEX(ClassName, PropertyName, ArrayIndex, Object) or MARK_PROPERTY_DIRTY_FROM_NAME_STATIC_ARRAY(ClassName, PropertyName, Object).bWithPushModel = true; in the game/server *.Target.cs (defaults to true only for Editor targets, TargetRules.cs:1524) and Net.IsPushModelEnabled=1 (defaults to false, PushModel.cpp:434). Until both are on, properties are compared as usual.WITH_PUSH_MODEL is off, so the code is always safe to ship (exception: the no-push MARK_PROPERTY_DIRTY_FROM_NAME_STATIC_ARRAY stub takes 4 arguments, PushModel.h:489, so the 3-argument form fails to compile there).FFastArraySerializer sends only changed items instead of the whole array.
#include "Net/Serialization/FastArraySerializer.h" // module NetCoreItem struct derives from FFastArraySerializerItem and may implement any of:
void PreReplicatedRemove(const struct FMyItemArray& InArraySerializer);
void PostReplicatedAdd(const struct FMyItemArray& InArraySerializer);
void PostReplicatedChange(const struct FMyItemArray& InArraySerializer);The array struct derives from FFastArraySerializer, implements NetDeltaSerialize via FastArrayDeltaSerialize<ItemType, ArrayType>(Items, DeltaParms, *this), and needs TStructOpsTypeTraits<...> { WithNetDeltaSerializer = true }. It may also implement the array-level receive hook:
void PostReplicatedReceive(const FFastArraySerializer::FPostReplicatedReceiveParameters& Parameters);FPostReplicatedReceiveParameters::OldArraySize is the size before the update, which makes this the right place for "the whole list changed, rebuild the UI" work.
Dirty rules — both are mandatory, and both are common sources of "my array does not replicate":
MarkItemDirty(Item) after adding or mutating an item.MarkArrayDirty() after removing an item (it also invalidates the ID map).Full inventory implementation: replication patterns, Pattern 3.
UFUNCTION network specifiers (UObject/ObjectMacros.h): Server, Client, NetMulticast, Reliable, Unreliable, WithValidation, BlueprintAuthorityOnly, BlueprintCosmetic. Reliable/Unreliable are only valid together with Server, Client or NetMulticast.
// Client calls, server executes. WithValidation generates the _Validate pair.
UFUNCTION(Server, Reliable, WithValidation)
void ServerFireWeapon(FVector_NetQuantize Origin, FVector_NetQuantizeNormal Direction);
// Server calls, the owning client executes.
UFUNCTION(Client, Reliable)
void ClientShowKillConfirm(int32 VictimId);
// Server calls, server and every client with this actor relevant execute.
UFUNCTION(NetMulticast, Unreliable)
void MulticastPlayHitEffect(FVector_NetQuantize ImpactPoint);You write _Implementation bodies; with WithValidation you also write _Validate, and returning false disconnects the caller.
| Rule | Detail |
|---|---|
| Ownership | A Server RPC only routes if the calling client owns the actor through its SetOwner chain up to its APlayerController. Unowned actors drop the call; the only trace is a LogNet Warning "No owning connection for actor…" (NetDriver.cpp:8274). |
| Client RPC target | Needs an actor whose owning connection exists; APlayerController is the reliable choice. |
| Reliability | Reliable for state changes, Unreliable for high-frequency cosmetics. Do not send Reliable RPCs every tick: once a channel has more than RELIABLE_BUFFER (512, NetConnection.h:82) unacked reliable bunches the connection is closed with ReliableBufferOverflow (DataChannel.cpp:1445). |
| Late joiners | Multicasts are not replayed. Persistent state belongs in a replicated property. |
| Parameters | Net-addressable types only. A UObject* that is neither replicated nor stably named (asset, class, map-placed actor) arrives as nullptr; pass an id and resolve remotely. |
| Direction | Client/NetMulticast called on a client are never sent; they just run locally on that client (Actor.cpp:5569-5573, 5587-5592). Guard call sites with HasAuthority(). |
Decision tables, reliability matrices and verbatim PlayerController.h declarations: RPC decision guide.
Weapon->SetOwner(OwningPlayerController); // server only; drives RPC routing and COND_OwnerOnlyRelevancy fields and hooks on AActor:
bAlwaysRelevant = true; // ignore distance culling
bOnlyRelevantToOwner = true; // owner connection only
virtual bool IsNetRelevantFor(const AActor* RealViewer, const AActor* ViewTarget, const FVector& SrcLocation) const override;
virtual float GetNetPriority(const FVector& ViewPos, const FVector& ViewDir, AActor* Viewer, AActor* ViewTarget, UActorChannel* InChannel, float Time, bool bLowBandwidth) override;SetNetCullDistanceSquared() sets the squared radius; NetPriority breaks ties when bandwidth saturates; GetReplayPriority() does the same for replay recording.
Dormancy (ENetDormancy in EngineTypes.h: DORM_Never, DORM_Awake, DORM_DormantAll, DORM_DormantPartial, DORM_Initial):
NetDormancy = DORM_Initial; // constructor: map-placed actors start dormant
SetNetDormancy(DORM_DormantAll); // runtime
FlushNetDormancy(); // push one update, then return to dormantA waking dormant actor is diffed against the replicator the connection kept when it went dormant (DataChannel.cpp:2510-2519), so normally only changes are sent; an actor whose channel closed on relevancy gets a full initial bunch when it re-enters range, which fires its OnRep_s again. Write OnRep_ handlers that tolerate repeats.
bReplicateUsingRegisteredSubObjectList defaults to false in 5.8 (GDefaultUseSubObjectReplicationList = false in Engine/Private/Components/ActorComponent.cpp, project-wide CVar net.SubObjects.DefaultUseSubObjectReplicationList). Opt in per class, or nothing you register replicates:
AMyQuestActor::AMyQuestActor()
{
bReplicates = true;
bReplicateUsingRegisteredSubObjectList = true; // protected field; set in the constructor
}AActor registration API (GameFramework/Actor.h); UActorComponent (Components/ActorComponent.h) mirrors all but the ActorComponent variants:
void AddReplicatedSubObject(UObject* SubObject, ELifetimeCondition NetCondition = COND_None);
void RemoveReplicatedSubObject(UObject* SubObject);
void AddActorComponentReplicatedSubObject(UActorComponent* OwnerComponent, UObject* SubObject, ELifetimeCondition NetCondition = COND_None);
void RemoveActorComponentReplicatedSubObject(UActorComponent* OwnerComponent, UObject* SubObject);
void DestroyReplicatedSubObjectOnRemotePeers(UObject* SubObject);
void TearOffReplicatedSubObjectOnRemotePeers(UObject* SubObject);
bool IsUsingRegisteredSubObjectList() const;RemoveReplicatedSubObject only stops future updates — the client keeps its copy. Use DestroyReplicatedSubObjectOnRemotePeers to delete it remotely, or TearOffReplicatedSubObjectOnRemotePeers to leave an orphaned local copy. The subobject must override virtual bool IsSupportedForNetworking() const to return true and declare its own GetLifetimeReplicatedProps.
When the flag is false, the engine instead calls the still-live virtual:
virtual bool ReplicateSubobjects(class UActorChannel* Channel, class FOutBunch* Bunch, FReplicationFlags* RepFlags) override;Inside it, forward to Super:: and call Channel->ReplicateSubobject(SubObject, *Bunch, *RepFlags). Registered subobjects: replication patterns, Pattern 5.
EPhysicsReplicationMode (EngineTypes.h) selects how a simulated body is corrected: Default, PredictiveInterpolation, Resimulation, None.
SetPhysicsReplicationMode(EPhysicsReplicationMode::PredictiveInterpolation);
EPhysicsReplicationMode Mode = GetPhysicsReplicationMode();PredictiveInterpolation and Resimulation require Project Settings → Physics → Physics Prediction. Keep every interacting body on the same mode. For rollback-style networked physics use UNetworkPhysicsComponent (Engine/Public/Physics/NetworkPhysicsComponent.h) and the FAsyncPhysicsTimestamp handshake on APlayerController (ClientSetupNetworkPhysicsTimestamp, ServerSendLatestAsyncPhysicsTimestamp); collision and body setup belong to ue-physics-collision.
Iris is the alternative replication backend (plugin Iris, Beta flag in 5.8; Epic's 5.8 notes call it production-ready for licensees). Runtime module IrisCore under Source/Runtime/Net/Iris, engine glue under Engine/Public/Net/Iris.
SetupIrisSupport(Target);Iris plugin (EnabledByDefault: false) and set the runtime switch net.Iris.UseIrisReplication=1; it defaults to 0, the classic replication system (IrisConfig.cpp:14).Actor hooks when Iris is active (GameFramework/Actor.h):
virtual void FillReplicationParams(const FFillReplicationParamsContext& Context, FActorReplicationParams& OutParams) override; // public
virtual void OnReplicationStartedForIris(const FOnReplicationStartedParams&) override; // protected
virtual void OnStopReplicationForIris(const FOnStopReplicationParams&) override; // protectedUReplicationBridge and UObjectReplicationBridge (Iris/ReplicationSystem/) are internal; gameplay code should not derive from them. UReplicationBridge no longer has the separate base class it used to; treat it as internal.
For high connection counts, replace per-connection relevancy scanning with the ReplicationGraph plugin (Beta in 5.8). Build.cs module: ReplicationGraph.
; DefaultEngine.ini
[/Script/OnlineSubsystemUtils.IpNetDriver]
ReplicationDriverClassName="/Script/MyGame.MyReplicationGraph"// MyReplicationGraph.h
#pragma once
#include "CoreMinimal.h"
#include "ReplicationGraph.h"
#include "MyReplicationGraph.generated.h"
UCLASS()
class MYGAME_API UMyReplicationGraph : public UReplicationGraph
{
GENERATED_BODY()
public:
virtual void InitGlobalActorClassSettings() override;
virtual void InitGlobalGraphNodes() override;
virtual void InitConnectionGraphNodes(UNetReplicationGraphConnection* ConnectionManager) override;
};Node classes (ReplicationGraph.h): UReplicationGraphNode_GridSpatialization2D (world grid), UReplicationGraphNode_AlwaysRelevant (game state, managers), UReplicationGraphNode_AlwaysRelevant_ForConnection (controller, player state), UReplicationGraphNode_ActorList (hand-built lists), UReplicationGraphNode_DormancyNode, UReplicationGraphNode_DynamicSpatialFrequency.
UNetDriver (Engine/Classes/Engine/NetDriver.h) owns the connections and drives replication for a world.
if (UNetDriver* Driver = GetWorld()->GetNetDriver())
{
// Driver->ClientConnections — server side, one per client
// Driver->ServerConnection — client side, the single upstream connection
}UNetConnection (Engine/Classes/Engine/NetConnection.h) is one client's connection. Reach it with AActor::GetNetConnection() (overridden by APlayerController). Split-screen players get a UChildConnection (Engine/ChildConnection.h) hanging off the parent.
UE::Net::FConnectionHandle Handle = Connection->GetConnectionHandle();
UNetConnection* Found = Driver->GetConnectionByHandle(Handle);
const bool bGone = Connection->IsClosingOrClosed(); // USOCK_Closing or USOCK_Closed
EConnectionState State = Connection->GetConnectionState();Prefer AGameModeBase::Logout for disconnect handling over polling connection state.
APlayerController exists only on the server and its owning client. Data every client needs goes on APawn, APlayerState or AGameStateBase — see ue-gameplay-framework.
| Do not emit | Use in 5.8 | Source |
|---|---|---|
NetUpdateFrequency = X; | SetNetUpdateFrequency(X) / GetNetUpdateFrequency() | UE_DEPRECATED(5.5) in GameFramework/Actor.h |
MinNetUpdateFrequency = X; | SetMinNetUpdateFrequency(X) / GetMinNetUpdateFrequency() | UE_DEPRECATED(5.5) in GameFramework/Actor.h |
NetCullDistanceSquared = X; | SetNetCullDistanceSquared(X) / GetNetCullDistanceSquared() | UE_DEPRECATED(5.5) in GameFramework/Actor.h |
virtual void BeginReplication() | OnReplicationStartedForIris or FillReplicationParams | UE_DEPRECATED(5.7) in GameFramework/Actor.h |
virtual void EndReplication(EEndPlayReason::Type) | OnStopReplicationForIris | UE_DEPRECATED(5.7) in GameFramework/Actor.h |
BeginReplication(const FActorReplicationParams&) | override FillReplicationParams | UE_DEPRECATED(5.7) in GameFramework/Actor.h |
UNetConnection::GetConnectionId() | GetConnectionHandle() | UE_DEPRECATED(5.6) in Engine/NetConnection.h |
UNetConnection::SetConnectionId() | nothing — external code must not set it (SetConnectionHandle() is protected, NetConnection.h:2006) | UE_DEPRECATED(5.6) in Engine/NetConnection.h |
UNetConnection::GetParentConnectionId() | GetConnectionHandle() | UE_DEPRECATED(5.6) in Engine/NetConnection.h |
UNetDriver::GetConnectionById(uint32) | GetConnectionByHandle(FConnectionHandle) | UE_DEPRECATED(5.6) in Engine/NetDriver.h |
UNetDriver::SetPendingDestruction() | RequestNetDriverDestruction() | UE_DEPRECATED(5.6) in Engine/NetDriver.h |
FPostReplicatedReceiveParameters::bHasMoreUnmappedReferences | read OldArraySize only | UE_DEPRECATED(5.4) in Net/Serialization/FastArraySerializer.h |
UObjectReplicationBridge::DetachInstanceFromRemote | DetachRootObjectFromRemote / DetachSubObjectFromRemote | UE_DEPRECATED(5.8) in Iris/ReplicationSystem/ObjectReplicationBridge.h |
UNetObjectFactory::FDestroyedContext | FDetachContext | UE_DEPRECATED(5.8) in Iris/ReplicationSystem/NetObjectFactory.h |
Assuming the registered subobject list is on: it defaults to false, so AddReplicatedSubObject alone replicates nothing. Set bReplicateUsingRegisteredSubObjectList = true in the constructor (or flip net.SubObjects.DefaultUseSubObjectReplicationList) and confirm with IsUsingRegisteredSubObjectList().
Omitting Super::GetLifetimeReplicatedProps: every inherited replicated property is dropped, including engine state on AActor and APawn. Call Super first, always.
Mutating replicated state on a client: the next server update overwrites it and no rollback happens. Guard with if (!HasAuthority()) return; and apply authoritative values in OnRep_.
Push model without a marker: a property declared with Params.bIsPushBased = true and never marked dirty simply stops replicating. Every write path needs MARK_PROPERTY_DIRTY_FROM_NAME.
Removing from a fast array without MarkArrayDirty(): removals do not reach clients. MarkItemDirty covers mutation only.
Using NetMulticast for persistent state: late joiners never receive it. Multicast is for one-shot cosmetics; state belongs in a replicated property.
Server RPC on an unowned actor: the call is dropped with only a LogNet Warning. Call SetOwner() on the server after spawning, and keep the chain intact up to the APlayerController.
Non-UFUNCTION OnRep_: UHT rejects ReplicatedUsing pointing at a plain member function. Declare UFUNCTION() above it.
Server RPC without WithValidation that mutates state: a client can send any parameter values. Validate in _Validate, or better, send an id and look up the authoritative data server-side.
OnRep_ that is not idempotent: relevancy changes re-send the full state and re-fire callbacks. Do not treat OnRep_ as an "exactly once" event.
ue-cpp-foundations — UPROPERTY/UFUNCTION specifier reference, module includes, reflection basicsue-gameplay-framework — AGameModeBase (server only), AGameStateBase/APlayerState replication scope, APawn possessionue-gameplay-abilities — GAS prediction keys, attribute set replication, gameplay effect replication modesue-character-movement — CMC move replication, saved moves, server correction and network smoothingue-actor-component-architecture — component lifecycle, SetIsReplicated, subobject ownershipue-async-threading — off-thread work feeding replicated state, task graph and async patternsue-serialization-savegames — persisting state that outlives a session, NetSerialize vs Serializeue-gameplay-tags-messaging — native and ini gameplay tags, containers, queries and the async message systemue-mover — the Mover plugin: movement modes, layered moves and rollback networkingue-physics-collision — collision channels, traces, overlaps and Chaos physicsue-world-level-streaming — World Partition, level streaming, data layers and travel© quodsoler, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in skills/ue-networking-replication of quodsoler/unreal-engine-skills.
Open the folder on GitHubat commit f3742d7
Ue Networking Replication next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ue Networking Replication this skillquodsoler/unreal-engine-skills | 359 | — | ~7.1k | Automated safety check: Pass | MIT | |
| Triage Tt Metal Assertstenstorrent/tt-mlir | 312 | — | ~7.8k | Automated safety check: Pass | Apache-2.0 | |
| Tlaplus Spec GeneratorArabelaTso/Skills-4-SE | 253 | — | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| Hybrid Cloud Outboxesgetsentry/sentry | 46k | — | ~4.8k | Automated safety check: Pass | Custom licence | |
| Ue Specifiersfjz13/UnrealSpecifiers | 1.1k | — | ~1.4k | Automated safety check: Pass | Custom licence | |
| Sea Orm 2FlyinPancake/yoink | 112 | — | ~2.9k | Automated safety check: Pass | Apache-2.0 |
tenstorrent/tt-mlir
Triage a tt-metal uplift diff or digest of TTFATAL validation changes against what tt-mlir guarantees at each optimization level (0: workarounds only, 1: optimizer with DRAM-only fallback, 2: L1…
ArabelaTso/Skills-4-SE
Automatically generate TLA+ specifications from source code (C/C++, Python) for formal verification of distributed systems.
getsentry/sentry
Guide for creating and maintaining outbox-based eventually consistent operations in Sentry.
fjz13/UnrealSpecifiers
A skill your agent uses when writing, editing, reviewing, validating, or explaining Unreal Engine C++ reflected declarations: UCLASS, USTRUCT, UENUM, UINTERFACE, UPROPERTY, UFUNCTION, UPARAM, UMETA…
FlyinPancake/yoink
Expert guidance for SeaORM 2.0, Rust's async ORM with strongly-typed columns, nested ActiveModels, Entity Loader API, and entity-first workflow.
elodin-sys/elodin
Work with Elodin-DB, the time-series telemetry database. An agent skill from elodin-sys/elodin.
quodsoler/unreal-engine-skills
Unreal Engine C++ guidance for AActor and UActorComponent: lifecycle hooks, spawning, component creation and attachment, ticking, interfaces and composition.
quodsoler/unreal-engine-skills
Guides Unreal Engine C++ AI work across AI controllers, behavior trees, blackboards, perception, navmesh pathfinding, EQS and Smart Objects.
quodsoler/unreal-engine-skills
Reference for writing and debugging Unreal Engine 5.8 animation C++: AnimInstance and proxy, montages, notifies, curves, blend spaces, state machines, linked layers and root motion.
quodsoler/unreal-engine-skills
Picks and applies the right Unreal Engine C++ concurrency API, from UE::Tasks and FPipe to ParallelFor, FRunnable, locks and timers, with game-thread safety rules.
quodsoler/unreal-engine-skills
A skill your agent uses when playing, mixing or debugging sound in Unreal Engine — one-shot SFX, looping ambience, music, dialogue or procedural audio.
quodsoler/unreal-engine-skills
Reference for exposing Unreal Engine C++ to Blueprint and calling Blueprint from C++, covering UFUNCTION and UPROPERTY specifiers, latent and async nodes, and interfaces.
Works with
Categories
A skill your agent uses when writing multiplayer C++: replicating a property, choosing an RPC type, tuning relevancy or dormancy, registering replicated subobjects, or turning on push model or Iris. Ue Networking Replication is an agent skill from quodsoler/unreal-engine-skills. Use when writing multiplayer C++: replicating a property, choosing an RPC type, tuning relevancy or dormancy, registering replicated subobjects, or turning on push model or Iris.
Ue Networking Replication fits situations like: writing multiplayer C++: replicating a property; choosing an RPC type; tuning relevancy; registering replicated subobjects.
Run `npx skills add quodsoler/unreal-engine-skills --skill ue-networking-replication -a claude-code`. Or copy the skill folder (skills/ue-networking-replication in quodsoler/unreal-engine-skills) into .claude/skills/ue-networking-replication in your project. Claude Code loads it when a task matches its description.
Run `npx skills add quodsoler/unreal-engine-skills --skill ue-networking-replication -a codex`. Or copy the skill folder (skills/ue-networking-replication in quodsoler/unreal-engine-skills) into .agents/skills/ue-networking-replication in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add quodsoler/unreal-engine-skills --skill ue-networking-replication -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ue-networking-replication, .gemini/skills/ue-networking-replication, .github/skills/ue-networking-replication and .opencode/skills/ue-networking-replication in your project.
SKILL.md names no scripts, command-line tools or credentials: Ue Networking Replication is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Ue Networking Replication is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.1k tokens (SKILL.md is roughly 28k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 8.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Ue Networking Replication: Triage Tt Metal Asserts (tenstorrent/tt-mlir, 312 stars), Tlaplus Spec Generator (ArabelaTso/Skills-4-SE, 253 stars), Hybrid Cloud Outboxes (getsentry/sentry, 46k stars) and Ue Specifiers (fjz13/UnrealSpecifiers, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
quodsoler (a GitHub user) maintains it in quodsoler/unreal-engine-skills, which has 359 GitHub stars. The repository holds 31 skills in this directory. The repository was last updated on September 28, 2026.
Source: quodsoler/unreal-engine-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.