# 03 — Interaction & World Manipulation Systems (Systems 16-23) **Category Purpose:** These 8 systems handle everything the player can do with the world — detecting interactable objects, opening doors, solving puzzles, traversing obstacles, dragging physics objects, using world devices (levers, buttons), viewing diegetic displays, and finding hiding spots. The `BPC_InteractionDetector` is the central hub; all other systems respond to its dispatchers or interface calls. --- ## System Index | # | System | Asset Type | Role | |---|--------|-----------|------| | 16 | `BPC_InteractionDetector` | Component | Raycast interaction detection hub; holds/press/double-tap | | 17 | `I_HidingSpot` | Interface | Interface for hideable world objects | | 18 | `BPC_DiegeticDisplay` | Component | In-world screens (wristwatch, monitors, holograms) | | 19 | `BP_DoorActor` | Actor | Physical door: 6-state machine, lock/barricade/key | | 20 | `BP_PuzzleDeviceActor` | Actor | Puzzle device base: state machine, solution checking | | 21 | `BPC_ContextualTraversalSystem` | Component | Vault/mantle/slide/squeeze via Motion Warping | | 22 | `BPC_PhysicsDragSystem` | Component | Grab/drag/release physics objects | | 23 | `BPC_UsableWorldObjectSystem` | Component | Generic world objects: levers, valves, buttons, panels | --- ## Category Data Flow ``` ┌────────────────────────────────────────────────────────────────────┐ │ INTERACTION FLOW │ │ │ │ BPC_InteractionDetector (runs on player) │ │ │ Timer-based sphere trace every 0.1s │ │ │ Filters by: I_Interactable interface │ │ │ Sorts by: Priority (Emergency > High > Normal > Low) │ │ │ then Distance (closest wins) │ │ ├─► OnTargetFound → WBP_InteractionPromptDisplay (show prompt) │ │ │ │ │ │ On player input: │ │ ├─► Press: immediate interaction │ │ ├─► Hold: radial progress fill → interaction on complete │ │ └─► DoubleTap: two rapid presses │ │ │ │ Target types are routed: │ │ ├─► BP_DoorActor.Interact_Implementation → door logic │ │ ├─► BP_PuzzleDeviceActor.Interact_Implementation → puzzle │ │ ├─► BP_ItemPickup.Interact_Implementation → inventory add │ │ ├─► BP_ContainerInventory.Interact_Implementation → container │ │ ├─► BP_UsableWorldObject.Interact_Implementation → lever/etc. │ │ └─► I_HidingSpot → BPC_HidingSystem.EnterHideSpot() │ │ │ │ Independent systems (not through InteractionDetector): │ │ ├─► BPC_ContextualTraversalSystem (movement-based, auto-detect) │ │ └─► BPC_PhysicsDragSystem (grab input, physics constraint) │ └────────────────────────────────────────────────────────────────────┘ ``` --- ## 16 — BPC_InteractionDetector: The Interaction Hub **What It Does:** The player's "interaction eye" — performs continuous sphere traces forward from the camera, detects all `I_Interactable` actors within range, sorts them by priority and distance, selects the best target, and manages the interaction prompt UI. Every interactive object in the game funnels through this component. **How It Works Internally:** **Detection Loop:** - Timer fires every `ScanInterval` (default 0.1s) - Sphere trace forward: `InteractionRange` (default 250cm), `DetectionAngle` cone, `TraceRadius` sphere - Each hit actor checked for `I_Interactable` implementation - Duplicates removed, sorted by `Priority` descending then `Distance` ascending - Clamped to `MaxTargetsInRange` (default 16) - `DetectionState` tracks: NoTarget → TargetInRange → TargetConfirmed → Interacting **Input Modes:** - `Press`: Single press to interact (standard) - `Hold`: Hold button for `HoldDuration` seconds with progress bar - `DoubleTap`: Two rapid presses within threshold - `Auto`: Triggers on proximity without input **Interaction Protocol:** 1. Player presses interact → `OnInputInteractPressed` 2. If `DetectionState >= TargetConfirmed` and input mode matches: - Press mode: calls `PerformInteraction(Press)` immediately - Hold mode: starts hold timer, fires `OnHoldProgressUpdated` each tick (for radial UI fill) - DoubleTap mode: waits for second press within window 3. `PerformInteraction` sets `bIsPerformingInteraction = true`, calls `CurrentTarget.InterfaceRef.ExecuteInteraction(Instigator)` 4. Waits for interaction completion or timeout 5. On completion/cancel: resumes scanning **Blocking Conditions:** - During death (`bBlockDuringDeath`): interaction blocked - While hidden (`bBlockDuringHiding`): blocked (player is inside a locker) - During combat (`bBlockDuringCombat`): optionally blocked - While already interacting (`bIsPerformingInteraction`): blocked (no double-interact) **Target Scoring:** - `CalculateInteractionScore()`: `Score = Priority * 100 - Distance * 0.5` - Facing bonus: if camera angle to target < 15°, add 50 - Best target = highest score within range **Implementation Patterns:** - Trace pauses while interacting, resumes after completion - `ForceSetTarget(Actor)` for scripted interactions (cutscene buttons) - Highlight effect applied to current target via `I_Interactable.SetHighlighted()` - Enter/exit tracking: fires `OnTargetEntered`/`OnTargetExited` when actors enter/leave range **Integration Points:** - **Broadcasts:** `OnTargetFound/Lost`, `OnInteractionStarted/Completed/Cancelled/Error`, `OnHoldProgressUpdated` - **Calls:** `I_Interactable.ExecuteInteraction()` on target, `I_Interactable.SetHighlighted()` - **Listens to:** `BPC_MovementStateSystem.OnPostureChanged`, `BPC_HealthSystem.OnDeathStateChanged` --- ## 17 — I_HidingSpot: Hiding Spot Interface **What It Does:** Interface that all hideable world objects must implement. Provides slot management, entry/exit transforms, peek capability, and type classification. **Key Functions:** - `GetHideSpotInfo()` → returns `S_HideSpotInfo` (type, slots, peek sockets, exit location, tags) - `HasAvailableSlots()` → boolean for occupancy check - `OnPlayerEntered(Player)` / `OnPlayerExited(Player)` → notify on occupancy change - `GetEntryAnimation()` / `GetExitAnimation()` → animation montages for smooth transitions - `IsDetectableFrom(EnemyLocation)` → LOS check helper **Implementation:** Actors like lockers, wardrobes, beds, tall grass volumes, and shadow volumes implement this interface. The `BPC_HidingSystem` calls these functions to manage hide state. --- ## 18 — BPC_DiegeticDisplay: In-World Screens **What It Does:** Manages in-world display surfaces — the player's wristwatch UI, computer monitors, holographic projectors, and security camera feeds. These are diegetic (exist in the game world) rather than screen-space UI. **Key Features:** - Renders widget blueprints onto world-space surfaces via `WidgetComponent` - Supports multiple display types: wristwatch, monitor, hologram, projection - Screen power states: on/off/damaged/static - Distortion effects for damaged screens - Interaction-based activation (press E on monitor to view) --- ## 19 — BP_DoorActor: Physical Door System **What It Does:** Powers all door-like actors — hinged doors, sliding doors, double doors, roll-up doors, and trap doors. Manages a 6-state machine with lock/key mechanics, barricade health, one-way passage, auto-close, and puzzle-linked unlocking. **State Machine:** ``` Closed → Opening → Open → Closing → Closed ↑ ↓ Locked ← (unlock transitions to Closed) ↑ Barricaded → (break) → Closed ``` **Lock Types:** Unlocked, KeyRequired (specific key item), ItemRequired (crowbar/code), PuzzleLinked (external puzzle), Breachable (force/weapon) **Animation System:** - Uses Timeline to interpolate door rotation (hinged) or translation (sliding) from 0→OpenAngle - `OpenSpeed` and `CloseSpeed` control animation rate - `AutoCloseDelay` starts timer after open; resets on re-open - `LinkedActors` array notified on open/close (lights, alarms, traps) **Implementation Patterns:** - Implements `I_Interactable` — called by InteractionDetector - `TryUnlockWithItem()` queries `BPC_InventorySystem` for required key - `DamageBarricade()` reduces health, broadcasts `OnBarricadeBroken` at 0 - `ForceSetState()` for save/load restoration — bypasses animation - One-way doors track which side was opened from (`bIsOpenFromFront`) **Integration Points:** - **Called by:** `BPC_InteractionDetector` (interact) - **Queries:** `BPC_InventorySystem` (key check) - **Notifies:** `LinkedActors`, AI perception (pathfinding update), AudioManager (door sounds), Save System --- ## 20 — BP_PuzzleDeviceActor: Puzzle Device Base **What It Does:** Base class for puzzle devices — combination locks, pressure plate sequences, symbol matching, pipe routing, and any interactive puzzle. Manages a state machine, validates solutions, and provides hints and rewards. **Features:** - State machine: Idle → Active → Solved → Failed - Solution checking against `DA_PuzzleData` Data Asset - Hint system with configurable hint count and cooldown - Reward dispatching on solve (item grant, door unlock, narrative flag set) - Linked actor notifications (unlock connected door, activate machine) - Timer-based puzzles with configurable countdown --- ## 21 — BPC_ContextualTraversalSystem: Vaulting & Climbing **What It Does:** Handles player traversal of environmental obstacles using UE5 Motion Warping. Detects traversable surfaces (low walls, ledges, gaps, barriers) and plays root motion traversal montages with precise target alignment. **Traversal Types:** Vault (low obstacles), Mantle (ledges), Slide (under barriers), Squeeze (narrow gaps), LedgeGrab (hang from ledges) **Detection:** - Forward capsule trace at waist, chest, and head heights - Classifies obstacles by height: Low (step up), Medium (vault), High (mantle) - Cooldown between traversals prevents animation spam **Motion Warping:** - Calculates exact target location for landing - Warps root motion to hit target precisely - `bIsTraversing` flag blocks input and other actions during animation --- ## 22 — BPC_PhysicsDragSystem: Object Grabbing **What It Does:** Enables the player to grab, drag, and release physics-simulated objects. Uses physics constraints for smooth dragging and supports throw mechanics. **Features:** - Grab detection via line trace from camera - Physics constraint attaches object to player's "hold position" - Rotation control while held (mouse wheel or gamepad) - Throw with configurable force on release - Weight limit: heavier objects require more time to lift - Works with `I_Holdable` interface for puzzle-specific objects --- ## 23 — BPC_UsableWorldObjectSystem: Generic World Devices **What It Does:** Provides a generic interaction system for world objects that don't fit into door/puzzle/pickup categories — levers, valves, buttons, switches, panels, dials, and crank handles. **Features:** - Implements `I_Interactable`, `I_Toggleable`, and `I_Adjustable` interfaces - Binary devices (levers, buttons): toggle on/off - Analog devices (valves, dials): continuous adjustment via mouse wheel or hold-and-drag - Linked actor notifications: pulling a lever opens a gate elsewhere - Animation playback with configurable duration - State persistence via `I_Persistable` --- ## Common Implementation Patterns in This Category 1. **Interface-Driven Detection:** `BPC_InteractionDetector` doesn't know about doors, pickups, or puzzles — it only checks for `I_Interactable`. Any new interactable just implements the interface. 2. **Priority Sorting:** Emergency targets (hide spots in combat) always selected over Low priority (ambient items). 3. **State Machines on Actors:** Doors, puzzles, and devices all use discrete state machines exposed via dispatchers — never polling. 4. **Linked Actor Pattern:** Doors/puzzles/devices can notify other actors (lights, traps, doors) on state change via `LinkedActors` array. 5. **Input Mode Variety:** Press for quick actions, Hold for deliberate actions (pick lock, solve puzzle), DoubleTap for rapid actions. 6. **Save-Aware:** All interactive objects implement `I_Persistable` for state restoration. --- ## Multiplayer Networking ### Category Authority Map | System | Authority | Client Request Pattern | |--------|-----------|----------------------| | `BPC_InteractionDetector` | Detection runs locally; interaction validated by server | `Server_PerformInteraction` RPC | | `BP_DoorActor` | Server-authoritative state machine | `Server_Interact` → server validates → OnRep animates | | `BP_PuzzleDeviceActor` | Server-authoritative | `Server_TrySolution` RPC | | `BPC_ContextualTraversalSystem` | Client-predicted movement | Server validates traversal target | | `BPC_PhysicsDragSystem` | Client-predicted physics | Server periodically corrects position | | `BPC_UsableWorldObjectSystem` | Server-authoritative toggle/adjust | `Server_Use` RPC | ### Interaction Flow (Multiplayer) ``` Client looks at door → local trace detects it → shows "Press E" Client presses E → calls Server_Interact(DoorActor) Server: validates range, door state, lock → If valid: door state changes → RepNotify broadcasts → All clients: OnRep plays door animation → If locked: server rejects, Client_ShowError RPC to requesting client ``` ### Full Spec See [`docs/architecture/multiplayer-networking.md`](../architecture/multiplayer-networking.md) Section 3.3. --- *Developer Reference v1.0 — 03 Interaction Systems. Companion to docs/blueprints/03-interaction/ specs.*