# Interaction Systems — Asset Creation Sheet (8 assets)

> **UE5 Path:** `Content/Framework/Interaction/`

---

## BPC_InteractionDetector (Component)

**Parent:** `ActorComponent` → Attach to player pawn

| Variable | Type | Default |
|----------|------|---------|
| `InteractionRange` | Float | `300.0` |
| `InteractionChannel` | TraceChannel | `Visibility` |
| `HoldDuration` | Float | `0.5` |
| `CurrentFocusedActor` | Actor | None |

**Key Logic:**
```
Tick → LineTraceByChannel(Camera Forward * Range)
  ├─ Hit actor implements I_Interactable?
  │   True → if different from CurrentFocused → Call OnFocusBegin on new, OnFocusEnd on old
  │   False → Clear focus
  ├─ If holding interact → accumulate hold timer
  │   Timer >= HoldDuration → trigger OnInteract
  └─ Fire dispatchers: OnFocusBegin, OnFocusEnd, OnHoldProgress
```

**Dispatchers:** `OnInteractionDetected(Actor, PromptText)`, `OnFocusLost`, `OnHoldProgress(Float)`

---

## I_HidingSpot (Interface)

**Create:** Right-click → **Blueprint → Blueprint Interface** → Name: `I_HidingSpot`

| Function | Inputs | Outputs |
|----------|--------|---------|
| `CanPlayerHide` | `Player` (Actor) | `Boolean`, `BlockReason` (Text) |
| `OnPlayerEnter` | `Player` (Actor) | — |
| `OnPlayerExit` | `Player` (Actor) | — |
| `GetEntryTransform` | — | `Transform` |
| `GetPeekTransforms` | — | `Array<Transform>` |
| `IsOccupied` | — | `Boolean` |
| `GetHidingSpotType` | — | `GameplayTag` |

---

## BPC_DiegeticDisplay (Component)

**Parent:** `ActorComponent` → Attach to wristwatch/helmet actor

| Variable | Type | Default |
|----------|------|---------|
| `DisplayWidgetClass` | `WBP_DiegeticHUDFrame` | Assign |
| `RenderTarget` | `TextureRenderTarget2D` | 512x512 |
| `bIsActive` | Boolean | `false` |

---

## BP_DoorActor (Actor)

**Parent:** `Actor` → Add StaticMesh (door frame) + StaticMesh (door panel)

| Variable | Type | Default |
|----------|------|---------|
| `DoorState` | GameplayTag | `Framework.Interaction.Door.Closed` |
| `bIsLocked` | Boolean | `false` |
| `RequiredKeyTag` | GameplayTag | Empty |
| `OpenAngle` | Float | `90.0` |
| `OpenSpeed` | Float | `3.0` |

**Implements:** `I_Interactable`, `I_Lockable`, `I_Toggleable`, `I_Persistable`

---

## BP_PuzzleDeviceActor (Actor)

**Parent:** `Actor` → Base class for all puzzle devices

| Variable | Type | Default |
|----------|------|---------|
| `PuzzleData` | `DA_PuzzleData` | Assign |
| `CurrentStep` | Integer | `0` |
| `bIsSolved` | Boolean | `false` |
| `ActivationSequence` | `Array<Actor>` | Linked devices |

---

## BPC_ContextualTraversalSystem (Component)

**Attach to:** Player pawn — works with GASP Motion Warping

| Variable | Type | Default |
|----------|------|---------|
| `TraversalTraceDistance` | Float | `200.0` |
| `VaultHeight` | Float | `120.0` |
| `MantleHeight` | Float | `200.0` |

---

## BPC_PhysicsDragSystem (Component)

**Attach to:** Player pawn

| Variable | Type | Default |
|----------|------|---------|
| `DragForce` | Float | `500.0` |
| `HoldDistance` | Float | `200.0` |
| `HeldActor` | Actor | None |

---

## BPC_UsableWorldObjectSystem (Component)

**Attach to:** Player pawn

| Variable | Type | Default |
|----------|------|---------|
| `CurrentUsable` | Actor | None |
| `bIsUsing` | Boolean | `false` |

---

## Test These
- [ ] Walk up to door → prompt "Open Door [E]" → press E → door opens
- [ ] Locked door → prompt "Locked — Requires Key Card" → can't open
- [ ] Run toward low wall → auto-vault (ContextualTraversal)
- [ ] Grab physics object → drags in front of player → release throws
