Files
test/Documentation/NPC_Monster_Animation_Flows.md
2026-03-13 16:03:47 +07:00

268 lines
7.6 KiB
Markdown

# NPC and Monster Animation Flows
This document lists all the flows that play animations for NPCs and monsters in the codebase.
## Main Entry Points
### 1. **PlayModelAction()** - Primary Animation Method
**Location:** `CECNPC.cs:1447`
- Main entry point for playing NPC/Monster animations
- Calls `m_pNPCModelPolicy.PlayModelAction(iAction, bRestart, null)`
- Filters out animations if NPC is dead (except death animations)
---
## Animation Flows by Trigger
### 2. **Attack Animations**
#### Flow: Attack Result Message → Play Attack Animation
**Location:** `CECNPC.cs:258-307` (`OnMsgNPCAtkResult`)
1. Message `MSG_NM_NPCATKRESULT` received
2. Calls `PlayAttackEffect()``PlayAttackAction()``m_pNPCModelPolicy.PlayAttackAction()`
3. **CECNPCModelDefaultPolicy.cs:47** (`PlayAttackAction`)
- For Monsters/Pets: Random between `ACT_ATTACK1` or `ACT_ATTACK2`
- For NPCs: `ACT_NPC_ATTACK`
4. Calls `PlayModelAction()` with attack action
#### Flow: Attack Host Result → Play Attack Animation
**Location:** `CECNPC.cs:224-257` (`OnMsgAttackHostResult`)
1. Message received when NPC attacks host
2. Calls `PlayAttackEffect()``PlayAttackAction()` → Same flow as above
#### Attack Animation Details
**Location:** `CECNPCModelDefaultPolicy.cs:104-122` (for ACT_ATTACK1/ACT_ATTACK2)
- Plays attack start animation (with suffix "起")
- Queues attack fall animation (with suffix "落")
- Queues guard animation after attack
**Location:** `CECNPCModelDefaultPolicy.cs:149-166` (for ACT_NPC_ATTACK)
- Plays NPC attack start animation
- Queues NPC attack fall animation
- Queues NPC stand animation after attack
---
### 3. **Movement Animations**
#### Flow: Move Command → Play Move Animation
**Location:** `CECNPC.cs:1126-1196` (`MoveTo`)
1. `cmd_object_move` command received
2. Calls `StartWork(WT_NORMAL, WORK_MOVE)`
3. Calls `PlayMoveAction(iMoveMode)`
**Location:** `CECNPC.cs:1421-1440` (`PlayMoveAction`)
- **Run Mode** (`GP_MOVE_RUN` or `GP_MOVE_RETURN`):
- Monsters/Pets: `ACT_RUN`
- NPCs: `ACT_NPC_RUN`
- **Walk Mode** (other modes):
- Monsters/Pets: `ACT_WALK`
- NPCs: `ACT_NPC_WALK`
#### Flow: Stop Move Command → Play Move Animation
**Location:** `CECNPC.cs:1000-1113` (`StopMoveTo`)
1. `cmd_object_stop_move` command received
2. If not already moving, calls `StartWork(WT_NORMAL, WORK_MOVE)`
3. Calls `PlayMoveAction(iMoveMode)` if not passive move
---
### 4. **Stand/Idle Animations**
#### Flow: Work Stand → Play Stand Animation
**Location:** `CECNPC.cs:1328-1341` (`StartWork_Stand`)
1. `StartWork(WT_NORMAL, WORK_STAND)` called
2. If not in fight mode:
- Monsters/Pets: `ACT_STAND`
- NPCs: `ACT_NPC_STAND`
#### Flow: Idle Timer → Play Idle Animation
**Location:** `CECNPC.cs:525-542` (`TickWork_Stand`)
1. `TickWork_Stand()` called every frame when in WORK_STAND
2. Idle counter increments (period: 25000ms)
3. When counter completes:
- Monsters/Pets: `ACT_IDLE`
- NPCs: Random between `ACT_NPC_IDLE1` or `ACT_NPC_IDLE2`
**Idle Animation Details:**
**Location:** `CECNPCModelDefaultPolicy.cs:123-135` (ACT_IDLE)
- Plays idle animation
- Queues stand animation after 300ms
**Location:** `CECNPCModelDefaultPolicy.cs:136-148` (ACT_NPC_IDLE1/ACT_NPC_IDLE2)
- Plays NPC idle animation
- Queues NPC stand animation after 300ms
---
### 5. **Death Animations**
#### Flow: Killed → Play Death Animation
**Location:** `CECNPC.cs:748-762` (`Killed`)
1. `Killed()` called
2. Sets `GP_STATE_CORPSE` flag
3. Calls `StartWork(WT_NORMAL, WORK_DEAD)`
**Location:** `CECNPC.cs:1355-1361` (`StartWork_Dead`)
- Monsters/Pets: `ACT_DIE`
- NPCs: `ACT_NPC_DIE`
---
### 6. **Wounded/Hit Animations**
#### Flow: Damaged → Play Wounded Animation
**Location:** `CECNPC.cs:775-833` (`Damaged`)
1. `Damaged()` called when NPC takes damage
2. If damage is -1 or -2 (other player hit):
- If not in fight mode: `ACT_WOUNDED`
3. If damage > 0:
- If not in fight mode: `ACT_WOUNDED`
**Wounded Animation Details:**
**Location:** `CECNPCModelDefaultPolicy.cs:95-103`
- Tries to play `ACT_WOUNDED`
- If animation doesn't exist, tries `ACT_WOUNDED2`
---
### 7. **Disappear Animation**
#### Flow: Disappear → Play Disappear Animation
**Location:** `CECNPC.cs:763-769` (`Disappear`)
1. `Disappear()` called when NPC should fade out
2. Calls `PlayModelAction(ACT_NPC_DISAPPEAR)`
---
### 8. **Policy Action (Server-Controlled Actions)**
#### Flow: Policy Action Message → Play Policy Action
**Location:** `CECNPC.cs:197-203` (`OnMsgNPCStartPlayAction`)
1. Message `MSG_NM_NPCSTARTPLAYACTION` received
2. If already in policy action, stops it
3. Calls `StartWork(WT_INTERRUPT, WORK_POLICYACTION, 0, cmd)`
**Location:** `CECNPC.cs:1376-1387` (`StartWork_PolicyAction`)
- Currently commented out, but would handle server-controlled actions
---
### 9. **Born Animation**
#### Flow: Born Animation
**Location:** `CECNPCModelDefaultPolicy.cs:167-179`
- Plays `ACT_COMMON_BORN` animation
- Queues stand animation after 300ms
---
## Animation Implementation Details
### NPCVisual Class
**Location:** `NPCVisual.cs`
- **TryPlayAction()** (line 18): Actually plays the animation using Animancer
- Uses `NamedAnimancerComponent.TryPlay(animationName)`
- Supports attack event callbacks via `OnEnd` event
### CECNPCModelDefaultPolicy Class
**Location:** `CECNPCModelDefaultPolicy.cs`
- **PlayModelAction()** (line 86): Main animation policy implementation
- Handles special cases for different action types
- Queues follow-up animations using `CECModel.QueueAction()`
- **GetActionName()** (line 20): Converts action index to animation name string
### Action Name Resolution
**Location:** `CECNPC.cs:874-882` (`InitStaticRes`)
- Loads action names from "actions_npc" file
- **GetBaseActionName()** (line 990): Gets action name string from loaded table
---
## Work System Flow
NPCs use a work system to manage different states:
1. **WORK_STAND**: Idle/Standing state
- Entry: `StartWork_Stand()` → Plays stand animation
- Update: `TickWork_Stand()` → Plays idle animation periodically
2. **WORK_MOVE**: Moving state
- Entry: `StartWork_Move()` → Clears combat flags
- Update: `TickWork_Move()` → Updates position
- Animation: `PlayMoveAction()` → Plays run/walk animation
3. **WORK_FIGHT**: Fighting state
- Entry: `StartWork_Fight()` → No animation (controlled by attack messages)
- Update: `TickWork_Fight()` → Faces target, syncs position
4. **WORK_DEAD**: Dead state
- Entry: `StartWork_Dead()` → Plays death animation
- Update: `TickWork_Dead()` → Empty
5. **WORK_POLICYACTION**: Server-controlled action
- Entry: `StartWork_PolicyAction()` → Handles server commands
---
## Key Animation Action Indices
**Location:** `CECNPC.cs:1572-1603` (`NPCActionIndex` enum)
### Monster/Pet Actions:
- `ACT_STAND` (0)
- `ACT_IDLE` (1)
- `ACT_WALK` (4)
- `ACT_ATTACK1` (5)
- `ACT_ATTACK2` (6)
- `ACT_RUN` (7)
- `ACT_DIE` (8)
- `ACT_WOUNDED` (13)
### NPC Actions:
- `ACT_NPC_STAND` (19)
- `ACT_NPC_IDLE1` (17)
- `ACT_NPC_IDLE2` (18)
- `ACT_NPC_WALK` (20)
- `ACT_NPC_RUN` (21)
- `ACT_NPC_ATTACK` (22)
- `ACT_NPC_DIE` (23)
- `ACT_NPC_DISAPPEAR` (25)
---
## Summary of Animation Trigger Points
1. **Attack Messages** → Attack animations (ACT_ATTACK1/2, ACT_NPC_ATTACK)
2. **Move Commands** → Movement animations (ACT_RUN/WALK, ACT_NPC_RUN/WALK)
3. **Work Stand** → Stand animations (ACT_STAND, ACT_NPC_STAND)
4. **Idle Timer** → Idle animations (ACT_IDLE, ACT_NPC_IDLE1/2)
5. **Death** → Death animations (ACT_DIE, ACT_NPC_DIE)
6. **Damage** → Wounded animations (ACT_WOUNDED, ACT_WOUNDED2)
7. **Disappear** → Disappear animation (ACT_NPC_DISAPPEAR)
8. **Policy Action** → Server-controlled actions
9. **Born** → Born animation (ACT_COMMON_BORN)