Now · Updated Jun 16, 2026
System Link — Risk Register
System Link — Risk Register
Known technical risks, their likelihood, impact, and mitigation. Add new risks here before implementing anything non-trivial.
#RISK-002 — SidearmDrawing loose tag stale if ability cancelled mid-draw ⚠️ Needs fix
Feature: Sidearm draw delay — SidearmDrawing added as a loose tag in GA_SidearmMode BP graph Status: Open — fix required before shipping
Risk: SidearmDrawing is added as a loose tag in the BP activation graph, then removed after the Delay node. If LT is released before the delay completes, the ability ends (cancelled) and the Remove Loose Gameplay Tag node never executes. The tag stays on the ASC permanently, blocking sidearm fire until the player dies/respawns.
Likelihood: High — releasing LT during the draw window is a normal player action.
Impact: High — sidearm fire permanently blocked until respawn.
Fix: Add Event On End Ability to the BP_GA_SL_SidearmMode graph:
Event On End Ability (bWasCancelled)
→ Get Ability System Component → Remove Loose Gameplay Tag (SLTags.States.Weapon.SidearmDrawing)
Remove Loose Gameplay Tag is safe to call when the tag isn't present — no side effect if the delay already removed it.
#RISK-003 — LinkAnimClassLayers(null) unlinks primary weapon anim layer
Feature: UpdateSidearmMesh in USLWeaponsComponent Status: Open — fix required
Risk: When AnimLayerClass is null on the sidearm data asset (e.g. before ABP_MC_FP/TP_Pistol are created and assigned), UpdateSidearmMesh calls LinkAnimClassLayers(nullptr) on FPMesh/TPMesh. In UE, passing null clears ALL linked anim layers — this silently unlinks the primary weapon's ALI_SL_Weapon layer, breaking arm poses for the primary weapon.
Likelihood: High during development — AnimLayerClass is empty until the character arm ABPs are authored and assigned.
Impact: Medium — primary weapon arm pose disappears. No crash but visually broken.
Fix: Guard the LinkAnimClassLayers calls in UpdateSidearmMesh — only call when AnimLayerClass is non-null:
if (TPAnimLayer)
{
if (USkeletalMeshComponent* TPCharMesh = Character->GetTPMesh())
TPCharMesh->LinkAnimClassLayers(TPAnimLayer);
}
#RISK-004 — Draw/Fire states in sidearm ABP need "Always Reset on Entry"
Feature: SidearmStateMachine inside ALI_SL_Sidearm ABPs Status: Open — content authoring note
Risk: The Draw and Fire states use non-looping animations. If "Always Reset on Entry" is not enabled, the asset player sits at t=end after the first play. Re-entering the state produces no visible animation. Same root cause as BUG-002 (shotgun fire animation).
Likelihood: High — easy to miss, same mistake was made on the shotgun.
Impact: Low — cosmetic only. Draw/fire animations play once then silently stop working.
Fix: Enable Always Reset on Entry on the Draw and Fire states in every sidearm state machine (FP and TP). Looping states (Idle) don't need it. See feedback_animbp_state_reset_on_entry.md.
#RISK-005 — ApplyViewMode BP must handle sidearm mesh visibility on FP/TP toggle
Feature: View mode switching while sidearm is drawn Status: Open — BP implementation step
Risk: OnSidearmTagChanged handles mesh visibility when the sidearm is drawn/holstered, but NOT when the view mode changes. If the player toggles FP/TP while the sidearm is drawn, ApplyViewMode fires but FPSidearmMesh/TPSidearmMesh aren't included in its logic. The wrong mesh stays visible.
Likelihood: Medium — depends on whether FP/TP toggle is an active game feature.
Impact: Medium — visual glitch, wrong mesh visible after view toggle.
Fix: In the ApplyViewMode BP implementation, check AnimStateSnapshot.bIsSidearmActive. If true, show the correct sidearm mesh for the new view mode and hide the other.
#RISK-001 — Delay node in Local Predicted ability causes client/server tag drift
Feature: Sidearm draw — SidearmDrawing tag removed via BP Delay in GA_SidearmMode Status: Accepted
Risk: GA_SidearmMode is Local Predicted — the ability runs independently on the owning client and the server. The BP Delay node uses each machine's world timer. Latency-induced drift means SidearmDrawing tag removal may occur at slightly different times on each side.
Likelihood: Low — both machines start the ability within a network round-trip of each other and the delay values are 0.4s+.
Impact: Low — worst case is the sidearm fire ability activates on the client a few ms before the server allows it. Standard GAS prediction mismatch — self-corrects automatically. No gameplay consequence.
Mitigation:
- Keep
SidearmDrawDurationat 0.4s minimum. Short delays amplify drift as a percentage of total duration.
- Do not use this pattern for anything with a hard server-side consequence (damage, ability grant). Drawing a weapon is cosmetic-adjacent — the misalignment window is imperceptible.
- If drift becomes noticeable in testing, replace the
Delaynode with aWaitDelayability task which has slightly better GAS integration.
#RISK-006 — Sidearm actor orphaned on player death
Feature: Sidearm slot / death cleanup Status: Open — see BUG-013
Risk: SidearmWeapon is never destroyed on player death. The actor persists attached to the ragdoll. On respawn, LoadDefaultLoadout spawns a new sidearm, leaving the old one orphaned in the level permanently.
Likelihood: High — happens on every death.
Impact: Medium — actor leak accumulates over a match. No crash but memory/performance degrades over time in long sessions.
Fix: Add DestroySidearmOnDeath() to ASLCharacterBase — destroys the actor directly (no pickup spawn) and nulls SidearmWeapon. Call from the death cleanup BP. See BUG-013.