Regions and reset requests

How Gameplay Tag regions index the world, every field of FWSRFResetRequest and FWSRFResetReport, and the reset events you can bind.

Regions are Gameplay Tags

A region is a Gameplay Tag assigned to a state component or to a registration request. An Actor can belong to several regions at once.

Tags rather than an enumeration means your project defines its own vocabulary — WSRF.Region.Dungeon, WSRF.Region.Boss.Arena — without editing the plugin. The subsystem keeps a per-region index of Stable IDs, so Reset World Region visits only the records in that region instead of scanning the world.

The tags shipped by the plugin:

TagPurpose
WSRF.Region.DefaultA usable region out of the box
WSRF.Region.DemoHallUsed by the demo map
WSRF.Region.Test.A, .B, .StressUsed by the automation tests

Create project tags as children of WSRF.Region — the editor picker is filtered to that root, and the reason picker is similarly filtered to WSRF.Reset. The filter guides new data; it does not invalidate or erase existing serialized tags outside those roots.

Child regions

bIncludeChildRegions (default true) matches through the tag hierarchy: resetting WSRF.Region.Dungeon also resets WSRF.Region.Dungeon.Cellar. Set it to false to touch exactly one level of the hierarchy.

Changing regions at runtime

Set Region Membership updates the active subsystem record immediately. Use it only for deliberate runtime ownership changes — for authored setup, prefer the component Details panel or Assign Region in the WSRF context menu. On a World Partition map, rebuild and save the World Manifest after ID or region changes — see World Partition and World Manifest.

Reset reasons

The reason is also a Gameplay Tag. A record only responds when the request’s reason is present in its policy’s ResetTriggers.

TagTypical meaning
WSRF.Reset.RestThe player rested at a checkpoint
WSRF.Reset.PlayerDeathThe player died
WSRF.Reset.CheckpointA checkpoint was reached or reloaded
WSRF.Reset.RegionA region-scoped reset
WSRF.Reset.EncounterRestartAn encounter restarted
WSRF.Reset.ManualAn explicit manual or debug reset

This is what lets one world hold Actors that react differently to the same event: an enemy returns on Rest, a puzzle only resets on EncounterRestart, and a shortcut ignores both.

The most common integration mistake

If a reset appears to do nothing, compare the request’s reason with the Actor’s ResetTriggers before looking anywhere else. A mismatch produces a silent, correct no-op.

The request

FWSRFResetRequest:

FieldTypeDefaultMeaning
ReasonFGameplayTagnoneWhy the reset is happening
RegionFGameplayTagnoneWhich region to reset
InitiatorUObject*nullptrWhatever caused it; carried through to listeners
ContextFNameNAME_NoneFree-form label for your own diagnostics
bIncludeChildRegionsbooltrueMatch child region tags
ContainerContextFGuidinvalidAdvanced. Restrict to one Level Instance container

ResetWorldRegion(Region, Reason, Initiator, bIncludeChildRegions) is the convenience entry point that builds this struct for you. RequestReset(Request) takes the full struct when you need Context or ContainerContext.

The report

Both calls return FWSRFResetReport synchronously:

FieldMeaning
OperationIdA GUID identifying this reset operation
ScheduledRecords selected by the request
RestoredExisting Actors returned to their captured state
RespawnedDestroyed placed Actors recreated
RemovedRuntime-spawned Actors removed
SkippedRecords intentionally not processed
PendingRestoreRecords whose Actor is not currently loaded
FailedRecords that could not be processed
DurationMillisecondsWall-clock duration of the operation
ErrorsOne message per failure

WasSuccessful() is true when Failed is zero. A single invalid Actor never stops the rest of the region: it increments Failed, adds an error string, and the pipeline continues.

PendingRestore above zero is normal on a streamed map — those Actors are not loaded right now and will be reconciled when their container returns. See World Partition and World Manifest.

Reset pipeline order

Prepare and notify
    ↓
Remove matching runtime Actors
    ↓
Respawn missing placed Actors
    ↓
Restore automatic state
    ↓
Restore parent/child attachments
    ↓
Restore custom state
    ↓
Notify and report

Ordering inside each phase is deterministic: parents before attached children, then ascending ResetPriority, then Stable ID. Two runs over the same world produce the same order.

Because respawn happens before custom restore, a Custom State callback can safely resolve a Stable ID for an Actor that was destroyed before the reset started — by then it exists again.

Nested resets

A reset requested from inside a callback — an OnWorldResetCompleted handler, a WSRF Reset Completed event — is queued FIFO and starts only after the active reset has fully finished. There is no re-entrancy and no partially applied pipeline.

The immediate return of a queued request is a placeholder report: bWasQueued true, bWasExecuted false. Its OperationId is retained by the eventual completed report — match it in the completion delegates and judge that final report with the pure Was WSRF Reset Successful node, which is true only when bWasExecuted is true and Failed is zero.

One queue drain executes at most 64 queued resets. If callbacks keep generating requests, the remaining entries receive completion reports with bWasQueued true, bWasExecuted false, Failed = 1 and an explanatory error — a safety guard so a Blueprint callback loop cannot block the Game Thread indefinitely. Avoid requesting a reset unconditionally from a reset-completed event.

Reset requests are Game Thread only; an off-thread call is rejected with an explicit error report.

GetResetOperationState reports where the subsystem currently is: Idle, Preparing, RemovingRuntimeActors, RespawningMissingActors, RestoringAutomaticState, RestoringAttachments, RestoringCustomState or Finalizing.

Events

On UWSRFWorldStateSubsystem:

DelegateParametersFires
OnWorldResetStartedFWSRFResetRequestA reset begins
OnWorldResetCompletedFWSRFResetRequest, FWSRFResetReportA reset finishes
OnRegionResetStartedFWSRFResetRequestA region-scoped reset begins
OnRegionResetCompletedFWSRFResetRequest, FWSRFResetReportA region-scoped reset finishes
OnActorResetStartedFWSRFActorId, FWSRFResetRequestOne Actor starts being processed
OnActorResetCompletedFWSRFActorId, FWSRFResetRequestOne Actor is done

Per-Actor callbacks are also available locally on the state component and through IWSRFResettable, which is usually the better place for gameplay logic.

Resetting inside a Level Instance

ResetWorldRegionInContext(Region, Reason, ContextActor, Initiator, bIncludeChildRegions) limits the reset to the container that owns ContextActor. Two copies of the same Level Instance therefore reset independently. Normal maps should keep using Reset World Region.

Last updated: 2026-09-04

Type to search titles, sections and keywords.