XForge - Stats X

Advanced Stats, status effects & modifiers system for UE5. Visual Status Forge editor, network-ready, C++ performance. Build simple card games or complex RPGs, combat system & more!

Discord | Documentation & Tutorial

x2 Demo.exe โ€” Dev build and Shipping build! Use the command "\Stat StatsX" in the Dev build to profile.

_______________________________________________________________________________________________________________________
Stats_X is a complete, production-ready solution for managing attributes, status effects and modifiers in Unreal Engine 5 โ€“ an easier, but complete, alternative to GAS!
Stop reinventing the wheel โ€“ focus on your game, not your infrastructure.
_______________________________________________________________________________________________________________________


๐ŸŽฏ CORE SYSTEMS

๐Ÿ“Š Flexible Attribute System

Create unlimited attributes using GameplayTags. Health, Mana, Stamina, Strength, custom data โ€“ anything you need.
Each attribute has Current, Max and Base values with automatic clamping. Enable Overflow mode to use attributes for locations, AI data, or any unclamped values you desire.


๐Ÿ”ฅ Status Forge โ€“ Visual Editor

Design complex status effects without writing code. The node-based Status Forge editor lets you create Poison, Burn, Shields, Lifesteal, door opening, level travel and any effect you can imagine in this EditorOnly asset.
When "COMPILE" is clicked, it creates a DataAsset split into a hot-path and a cold-path ready to be interpreted in native C++ for maximum performance โ€” no Blueprint VM overhead. These Status data assets are stored as soft references in the StatsXSubsystem and called with one function โ€” Cast Status โ€” using just one GameplayTag to choose the status.

โšก Smart Modifier System

Apply buffs and debuffs that stack correctly. The formula Max = (Base + ฮฃ Additive) ร— ฮ  Multiplicative handles all combinations. Track modifiers by InstanceID, OwnerID, AttributeTag or SourceTag for precise control. A modifier can have both Additive and Multiplicative values.

๐ŸŽฏ Interceptor System

Intercept and modify events in real-time. Build shields that absorb damage, implement lifesteal, block status effects, or redirect damage to another Attribute. PRE and POST events give you full control over the execution flow.
You can register Interceptors by the Status Forge. To do that you want to create a Status that has a duration and use the node RegisterInterceptor, when the status expires, all interceptors registered with it are removed automatically. To trigger an Interceptor you want to insert a GameplayTag to a node parameter of a Status Forge node.

๐Ÿ“ˆ Threshold System

Trigger events when values cross boundaries. Death at HP โ‰ค 0, low health warnings, level-up notifications, achievements โ€” all without polling. Four comparison types: LessOrEqual, GreaterOrEqual, CrossingBelow, CrossingAbove.

๐ŸŒ Network Ready

Built for multiplayer from day one. All attributes, modifiers, and status core data replicate automatically using UE's Fast Array serialization. Late joiners receive the correct game state instantly. Zero configuration required.

_______________________________________________________________________________________________________________________

โšก PERFORMANCE

Benchmarked and optimized for scale:

  • 120 FPS maintained with 500+ actors under interval looping status effects

  • 5000+ concurrent interval looping status on a single actor

  • 10-100x lighter event-based status vs looping

  • Zero GC allocations โ€” full object pooling

  • Smart tick management โ€” components auto-disable when no looping statuses are active

_______________________________________________________________________________________________________________________

๐Ÿ› ๏ธ BUILT FOR DEVELOPERS

  • 100% Blueprint Compatible โ€” Full API exposed, no C++ required, All Documented

  • Extensible โ€” Create custom nodes, interceptors, and formulas (such as resistances, mitigations and immunities)

  • GameplayTag Based โ€” Clean, hierarchical organization

  • Event Dispatchers โ€” React to every attribute and status change

  • Comprehensive Documentation โ€” Detailed guides with examples

  • Discord Support โ€” Community space with guaranteed direct support with optional ticket system to request help in private

_______________________________________________________________________________________________________________________

๐ŸŽฎ PERFECT FOR

  • RPG stat systems

  • Combat with damage types, resistances, immunities & combos

  • Ability systems with cooldowns, costs & counteractions

  • Survival mechanics (hunger, thirst, temperature)

  • Buff/debuff management

  • Achievement & progression tracking

  • Cars, Cards, Board games โ€” whatever your project, Stats_X fits

  • Any game needing replicated dynamic values

_______________________________________________________________________________________________________________________

๐Ÿ“ฆ WHAT'S INCLUDED

  • StatsX Component (add to any Actor)

  • Status Forge visual editor

  • Complete Blueprint API

  • Full documentation

  • Discord support access

Stop building infrastructure. Start building your game.

_______________________________________________________________________________________________________________________

TECHNICAL DETAILS

Supported Platforms: Windows, Mac, Linux & all UE5 platforms | Network Replicated: Yes (automatic) | Documentation: Full documentation included + Discord private/public support | 109 Exposed Blueprint Functions

1 Like

:package: Stats_X Update! โ€” v1.5

The Prediction Update โ€” Full Client-Side Prediction & Push-Model Replication โ€“ changelog


Stats_X v1.5 is the biggest networking update in the pluginโ€™s history. The entire replication layer moves to Unrealโ€™s Push Model, and Stats_X gains a complete, server-authoritative client prediction pipeline: status casts, attributes, modifiers, cosmetic cues, ForgeEvents and interceptors can now be predicted instantly on the owning client and are automatically confirmed, corrected or rolled back when the server responds. Under the hood, the whole runtime has been refactored to data-oriented storage for AAA-grade cache performance, backed by a new anti-cheat validation layer and an automation suite of 190 tests.


:bullseye: Highlights

  • :high_voltage: Client-Side Prediction โ€” cast statuses, apply attribute changes, add/remove modifiers, fire cues, resume events and trigger interceptors with zero perceived latency on the owning client. The server stays 100% authoritative: every prediction is validated, then confirmed, corrected or rolled back automatically.
  • :satellite: Push-Model Replication โ€” every replicated property now uses UEโ€™s Push Model with centralized dirty marking and opt-in dormancy wake-up: less server CPU, identical observable behavior.
  • :high_speed_train: Data-Oriented Runtime โ€” TMap/TSet eliminated from every hot path (tick, VM execution, replication callbacks, stat recalculation, cue dispatch) in favor of dense arrays, sorted lookups and 4-byte generational handles.
  • :locked_with_key: Anti-Cheat by Design โ€” deny-all whitelists, per-connection rate limiting, POD-only network payloads, server-side caster ownership validation, deterministic definition hashing and a centralized ownership guard for every predicted mutation.
  • :artist_palette: Prediction Authoring in StatusForge per-status Prediction Policy (None / CosmeticOnly / LogicOnly / Full), per-node Prediction Behavior (ServerOnly / Predict / SkipOnClient) with the entire built-in catalog (139 nodes) explicitly classified, plus IsPredicting() for custom logics and interceptors.
  • :bullseye: Pop-Free Reconciliation โ€” exact correlation via prediction keys, lifecycle serials and attribute watermarks: no double-apply, no value pops, deterministic cosmetic-cue dedup, and client/server-matched deterministic RNG.
  • :eye: Presented Reads for UI โ€” a new Presented* API family to read exactly what the player currently sees (authoritative + predicted) for statuses, attributes and modifiers.
  • :test_tube: Hardened & Tested โ€” new Stats_XTests automation module (not shipped by default) (190 tests, all green), network-emulation campaign (packet loss, reorder, high RTT, join-in-progress, dedicated server) and dedicated runtime hardening for late-join, dormancy and listen-server scenarios.

:satellite: Replication โ€” Push Model

  • All replicated state (attributes, modifiers, casted/received status tags, status seeds, status updates, NetCue Relay state) is now registered as push-based.
  • Centralized dirty helpers: every server-side mutation marks its property dirty exactly once, in one audited place.
  • Opt-in dormancy support: dirty helpers automatically wake dormant owners via FlushNetDormancy(); dormancy policy itself remains in your projectโ€™s hands.
  • Fixed: updating an existing state cue on the NetCue Relay could return early without forcing a net update โ€” state cue updates now reach clients immediately.
  • bGlobalRelay converted from bitfield to bool; NetCore promoted to public module dependency.
  • Development-only validation flow via net.PushModelValidateProperties; join-in-progress clients verified to receive the full initial state.

:brick: New Core Types

  • New public header StatsXCoreTypes.h:
    • FStatsXHandle โ€” 4-byte generational handle (index + generation, with a dedicated predicted-namespace bit). Now the runtime identity for status instances, modifiers and predicted records, with stale-handle rejection.
    • FStatsXPredictionKey โ€” per-connection prediction key.
    • FStatsXPredictionResult โ€” server ack payload (accepted/reject reason/server handle/server status ID).
    • EForgeExecutionMode (Authoritative / Predicted / Reconciling), now part of the Forge VM context.
    • EStatsXPredictionPolicy, EStatsXNodePrediction, EStatsXPredictionRejectReason.
  • UPDA_StatusDefinition now stores a deterministic 64-bit RuntimeDefinitionHash used to verify client/server definition parity.

:high_speed_train: Data-Oriented Runtime Refactor

  • Attribute storage moved from TMap to a dense, authoring-ordered array with a sorted tag lookup.
  • Removed every hot-path lookup map: attribute index caches, threshold maps, damage-resistance map, all modifier lookup/contribution maps, replicated tag & seed caches โ€” replaced with sorted arrays, buckets and sidecar indices.
  • Status instance pool is now handle-based: O(1) FindByHandle with generation checks; tag buckets and tick scheduling with no TSet.
  • Forge event listener and interceptor registries (world + component) rebuilt as dense buckets with safe deferred removal.
  • Net cue dedup and local VFX/SFX registries converted to sorted arrays.
  • New StatsXDenseLookup.h with reusable binary-search primitives.

:satellite_antenna: Prediction Transport & Authority

  • New UStatsX_PredictionProxyComponent โ€” a replicated, net-owned component (PlayerController / Pawn / owned actor) that is the single host of all prediction RPCs, prediction keys, the client journal and all predicted overlays.
  • RequestPredictedStatus() on the proxy (+ convenience wrapper on the stats component): returns a prediction key, starts local prediction when allowed, and always sends the validated server request.
  • RequestPredictedEvent() for input-driven ForgeEvents, with its own whitelist.
  • Owner-only, push-based, ring-buffered prediction result stream with the OnPredictionResultReceived Blueprint delegate.
  • Server-side validation pipeline before any authoritative execution: payload validation (WithValidation), monotonic key check (stale/duplicate drop), per-connection rate limiting, exact-match status whitelist (deny-all by default), definition-hash comparison, caster-ownership anti-spoof check and a lenient read-only cost/requirement pre-pass.
  • POD-only network payloads: object/class variable overrides never cross the wire.
  • Client authority gate: ExecuteStatus, CastStatusSync, CastStatusAsync and SendForgeEvent are authoritative-only on networked clients (explicit warning + no-op, before any asset load).

:compass: Prediction Classification & Ownership

  • PredictionPolicy per status definition, editable in Details/StatusForge and compiled into the asset.
  • PredictionBehavior per node definition with JSON round-trip and a new Prediction dropdown in the custom-node creation dialog.
  • Node classification is compiled into spare bits of each VM instruction โ€” the runtime reads it with zero editor dependencies (instruction size unchanged).
  • IsPredicting() and GetPredictionKey() (BlueprintPure) on custom logics and interceptors, plus per-class PredictionBehavior defaults.
  • Centralized ownership guard: predicted mutations only apply to components that opted in (bAllowClientPredictedMutations, default off) and belong to the requesting connection; CanAcceptPredictedMutationFrom is virtual for advanced ownership models (vehicles, mounts, pets, weapons).
  • Deterministic RuntimeDefinitionHash generation at compile time; editor-only data (positions, comments, colors) never affects the hash.
  • New compiler warnings for unsafe prediction combinations.

:ledger: Prediction Journal & Reconciliation

  • Client-side prediction journal on the proxy: bounded, dense, allocation-friendly.
  • Accepted results enter an accepted-awaiting-replication bridge, so predicted values never pop before the authoritative replication lands.
  • Bounded client-side timeouts with automatic rollback; late acks are safely ignored.
  • Attribute rebasing: presentation = authoritative base + pending predicted deltas (single final clamp), recomputed automatically on every replication callback.
  • Zero-overhead fast path for components without active predictions.
  • Local โ†’ server handle remap tables with generation guards.

:high_voltage: M1 Prediction โ€” Casts, Attributes, Cues, Events, Interceptors

  • Predicted VM execution: the scheduler honors node classification โ€” executes Predict, skips SkipOnClient, conservatively stops at ServerOnly (under-prediction, never invented data).
  • Predicted status lifecycle overlay: local instances with local handles, initialized exactly like authoritative ones; rolled back on reject/timeout, remapped on accept.
  • Predicted attribute mutations (ModifyAttribute / SetAttribute) journaled as explicit deltas.
  • Predicted cosmetic cues with dedup: cue stream keys now carry the prediction key + status tag, so the serverโ€™s duplicate cue is suppressed โ€” one visible VFX/SFX/montage, never two.
  • Predicted ForgeEvents: RequestPredictedEvent + server RPC with separate whitelist; SendForgeEvent split into an external (client-gated) path and the internal VM path.
  • Predicted WaitForEvent / WaitForEvents listeners with journaled MaxTriggers and full rollback.
  • Predicted interceptors: rollbackable local registrations merged only into predicted broadcasts; global interceptors remain server-only.
  • Deterministic RNG: CheckChance, RandomFloatInRange, RandomIntegerInRange are seeded from (prediction key, node, status tag, definition hash) โ€” client prediction and the serverโ€™s mirrored execution roll the same results.

:abacus: M2 Prediction โ€” Modifiers

  • Client-only predicted modifier overlay on the target component: predicted adds contribute to stat formulas immediately.
  • Predicted removal of authoritative modifiers via rollbackable masks โ€” the replicated modifier array is never touched client-side.
  • FStatModifier now carries ModifierHandle, OwnerStatusHandle and PredictionKey (legacy InstanceID/OwnerID remain as compatibility bridges).
  • Deterministic confirm pairing: one cast producing N modifiers remaps each local handle to the correct server modifier, in order โ€” even on the same attribute.
  • Unified attribute presentation: modifier recompute โ†’ direct deltas โ†’ single clamp โ†’ single broadcast (no competing writers between attribute and modifier prediction).
  • New handle-aware APIs: AddModifierHandle (server), RemoveModifierByHandle, ResolveModifierHandleFromLegacyID.

:bullseye: Exact Prediction Correlation

  • Status seeds now carry prediction key + lifecycle serial: each authoritative seed confirms exactly one predicted lifecycle โ€” same-tag concurrency, nested casts with a shared key and mid-sequence server drops can no longer mispair.
  • Replicated attributes carry a cumulative prediction watermark: the client consumes exactly the deltas already included in the server value โ€” concurrent predictions on the same attribute no longer overshoot.
  • All heuristic fallbacks (tag matching, value matching) removed from the reconcile path.
  • Stale-key hygiene on pool/slot reuse; replication metadata can never false-confirm on non-owner clients.

:shield: Runtime Hardening

  • Late join / relevancy fix: replicated status tags and modifiers are initialized before the initial replication bunch and self-heal from replicated items โ€” late joiners see correct status tags and modifiers immediately.
  • Fixed a possible check() crash in the attribute FastArray add callback on authority edge cases.
  • Standalone & listen-server host support for RequestPredictedStatus / RequestPredictedEvent: requests execute directly through the same validation gates (whitelist parity with clients) instead of failing silently.
  • Server RPC validation never sync-loads assets on client input: whitelisted definitions are preloaded, or the request is rejected with the new DefinitionNotLoaded reason.
  • SetEnableReplicated(false) now properly removes the replicated attribute โ€” no stale values on existing clients or late joiners.
  • Predicted overlay hygiene: interceptor slot identity survives object invalidation, event buckets use stable actor keys, listener generations prevent re-entrant slot reuse.
  • Accepted instant statuses (no lifecycle) can no longer leak predicted overlays.
  • Clear API contract: GetAttributeValue stays authoritative; new GetPresentedAttributeValue / GetPresentedSubAttributeValue return what the player sees during prediction.
  • Documented target security contract: TargetActor is intentionally not ownership-checked (enemy/world targets are legitimate) โ€” range/LOS/faction checks belong in the definitionโ€™s authoritative Requirements.

:eye: Presentation Reads for UI

  • New strictly read-only Presented* API family (authoritative OR locally predicted):
    • HasPresentedCastedStatus / HasPresentedReceivedStatus + Exact / Any / All variants.
    • GetPresentedCastedStatusInfos / GetPresentedReceivedStatusInfos โ€” FStatusInstanceInfo gains a bPredicted field (predicted entries expose StatusID == 0).
    • GetPresentedModifiersForAttribute + GetPresentedModifierCountForAttribute โ€” include predicted adds, hide predicted-removed authoritative modifiers.
    • IsAttributePredicted(Tag) and HasPendingPredictions() introspection.
  • Presented reads never mutate prediction state and gracefully degrade to authoritative values on servers or clients without prediction.

:card_index_dividers: Built-In Node Catalog Prediction Audit

  • All 139 built-in nodes now declare an explicit PredictionBehavior: 121 Predict, 17 ServerOnly, 1 SkipOnClient โ€” predicted graphs run as deep as safely possible instead of stopping at the first unclassified node.
  • Read nodes (GetAttributeValue, CheckCost, CheckAttributeRequirement, CheckTags, GetStatusRemainingTime, GetStatusStackCount, GetStatusStacks) now read presented values inside predicted execution โ€” cost and requirement checks see your predicted state.
  • The modifier trio (AddModifier / AddTypedModifier / RemoveModifier) is hard-enforced as Predict at compile time.
  • Custom native nodes are first-class citizens: default ServerOnly, with the chosen policy (definition or class default) compiled into instructions and the full prediction toolkit available to custom code.
  • New catalog gates: any future executable node without explicit classification fails the test suite.

:gear: New Runtime Settings (Project Settings โ†’ Stats_X Runtime)

  • Prediction | Transport: ClientPredictedStatusWhitelist (deny-all by default), PredictionMaxRequestsPerSecond (30), PredictionResultRingSize (64), override count/byte limits.
  • Prediction | Journal: ack timeout (0.75s), accepted-bridge timeout (1.0s), max pending entries / mutation records, maintenance interval.
  • Prediction | M1: ClientPredictedEventWhitelist, caps for predicted statuses / event listeners / interceptors, bPredictionRequireRuntimeDefinitionHash.
  • Prediction | M2: caps for predicted modifiers, predicted removals and matches-per-remove.

:test_tube: Testing & Documentation

  • New Stats_XTests automation module: 190 tests covering replication, core types, DOD equivalence, transport, classification, journal, M1, M2, correlation, hardening, presentation reads and the node catalog โ€” all green.
  • Cross-cutting integration campaign: every ack/replication ordering, packet loss/reorder, high RTT, duplicate/late acks, dormancy/relevancy, join-in-progress, dedicated server and a full security campaign (spoofed casters/targets, whitelist bypass attempts, oversize payloads, request spam).

:warning: Breaking Changes & Migration Notes

  • Attribute authoring: StatsAttributes moved from a map to an array of entries.
  • Client-side authoritative calls: ExecuteStatus, CastStatusSync, CastStatusAsync and SendForgeEvent are now no-ops (with a warning) on networked clients โ€” use RequestPredictedStatus / RequestPredictedEvent through the prediction proxy or StatsXStatsComponentBase (ExecuteStatus, CastStatusSync, CastStatusAsync and SendForgeEvent behavior is unchanged if called with authority).
  • Prediction is fully opt-in: nothing predicts until you whitelist statuses/events in the runtime settings, set a statusโ€™ PredictionPolicy, and enable bAllowClientPredictedMutations on target components. Without setup, behavior remains classic server-authoritative replication.
  • SetEnableReplicated(false) now removes the attribute on clients instead of leaving the last replicated value.
  • Wire format changed: replicated structs gained prediction metadata.