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

263 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Flash Move Skill: Server Protocol Responses Comparison
## Summary
After the client sends `CAST_POS_SKILL` (command ID 89), the server responds with a sequence of protocols. This document compares the server responses received by both C++ and C# clients.
## Client Request (Both Same)
### C++ Client
```
[17:10:03.501] CLIENT - CAST_POS_SKILL(89)
```
### C# Client
```
[16:58:15.286] [GameSession] Sending protocol: gamedatasend (Type: PROTOCOL_GAMEDATASEND) + Type=34 - CMD_ID: CAST_POS_SKILL
```
---
## Server Response Sequence
### Immediate Response (Within ~64ms)
| Order | C++ Log | C# Log | Command ID | Command Name | Status |
|-------|---------|--------|------------|--------------|--------|
| 1-9 | OBJECT_MOVE(15) × 9 | CMDID 15 × 6 | 15 | OBJECT_MOVE | ✅ Same |
| 10 | OBJECT_STOP_MOVE(35) | CMDID 35 | 35 | OBJECT_STOP_MOVE | ✅ Same |
| 11 | SET_MOVE_STAMP(205) | CMDID 205 (Unhandled) | 205 | SET_MOVE_STAMP | ⚠️ C# Unhandled |
| 12 | OBJECT_CAST_POS_SKILL(204) | CMDID 204 | 204 | OBJECT_CAST_POS_SKILL | ✅ Same |
| 13 | SKILL_PERFORM(88) | CMDID 88 | 88 | SKILL_PERFORM | ✅ Same |
| 14 | SET_COOLDOWN(198) | CMDID 198 | 198 | SET_COOLDOWN | ✅ Same |
| 15 | COMBO_SKILL_PREPARE(394) | CMDID 394 | 394 | COMBO_SKILL_PREPARE | ✅ Same |
| 16 | ENCHANT_RESULT(139) | CMDID 139 | 139 | ENCHANT_RESULT | ✅ Same |
| 17 | SELF_INFO_00(38) | CMDID 38 | 38 | SELF_INFO_00 | ✅ Same |
| 18 | UPDATE_EXT_STATE(124) | CMDID 124 (Unhandled) | 124 | UPDATE_EXT_STATE | ⚠️ C# Unhandled |
| 19 | ICON_STATE_NOTIFY(125) | CMDID 125 (Unhandled) | 125 | ICON_STATE_NOTIFY | ⚠️ C# Unhandled |
### Delayed Response (~1 second later)
| Order | C++ Log | C# Log | Command ID | Command Name | Status |
|-------|---------|--------|------------|--------------|--------|
| 20 | OBJECT_MOVE(15) × 2 | CMDID 15 × 2 | 15 | OBJECT_MOVE | ✅ Same |
| 21 | OBJECT_STOP_MOVE(35) | CMDID 35 | 35 | OBJECT_STOP_MOVE | ✅ Same |
| 22 | OBJECT_MOVE(15) × 2 | CMDID 15 × 2 | 15 | OBJECT_MOVE | ✅ Same |
| 23 | HOST_STOP_SKILL(123) | CMDID 123 | 123 | HOST_STOP_SKILL | ✅ Same |
| 24 | UPDATE_EXT_STATE(124) | CMDID 124 (Unhandled) | 124 | UPDATE_EXT_STATE | ⚠️ C# Unhandled |
| 25 | ICON_STATE_NOTIFY(125) | CMDID 125 (Unhandled) | 125 | ICON_STATE_NOTIFY | ⚠️ C# Unhandled |
---
## Detailed Protocol Analysis
### ✅ Fully Handled Protocols (Both Implementations)
#### 1. OBJECT_MOVE (15)
- **C++:** `SERVER - OBJECT_MOVE(15), size=21`
- **C#:** `### GameDataSend: CMDID 15`
- **Purpose:** Updates object position during flash move
- **Status:** ✅ Both handle correctly
#### 2. OBJECT_STOP_MOVE (35)
- **C++:** `SERVER - OBJECT_STOP_MOVE(35), size=20`
- **C#:** `### GameDataSend: CMDID 35`
- **Purpose:** Stops object movement
- **Status:** ✅ Both handle correctly
#### 3. OBJECT_CAST_POS_SKILL (204)
- **C++:** `SERVER - OBJECT_CAST_POS_SKILL(204), size=27`
- **C#:** `### GameDataSend: CMDID 204`
- **Purpose:** Confirms the position skill cast
- **Status:** ✅ Both handle correctly
- **C++ Debug Log:**
```
[SKILL_CAST_DEBUG] OnMsgPlayerCastSkill: Received OBJECT_CAST_POS_SKILL,
skillID=58, target=0, pos=(858.33, 60.93, -149.44)
```
- **C# Debug Log:**
```
[DISTANCE_DEBUG] OBJECT_CAST_POS_SKILL: Received, skillID=58,
hostPosBefore=(860.71, 59.59, -130.28), destPos=(860.62, 60.73, -145.39)
```
#### 4. SKILL_PERFORM (88)
- **C++:** `SERVER - SKILL_PERFORM(88), size=0`
- **C#:** `### GameDataSend: CMDID 88`
- **Purpose:** Signals skill execution completion
- **Status:** ✅ Both handle correctly
- **C++ Debug Log:**
```
[SKILL_CAST_DEBUG] OnMsgPlayerCastSkill: Received SKILL_PERFORM,
m_pCurSkill=0, m_pPrepSkill=0 (clearing)
```
#### 5. SET_COOLDOWN (198)
- **C++:** `SERVER - SET_COOLDOWN(198), size=8`
- **C#:** `### GameDataSend: CMDID 198`
- **Purpose:** Sets skill cooldown timer
- **Status:** ✅ Both handle correctly
#### 6. COMBO_SKILL_PREPARE (394)
- **C++:** `SERVER - COMBO_SKILL_PREPARE(394), size=20`
- **C#:** `### GameDataSend: CMDID 394`
- **Purpose:** Prepares combo skill chain
- **Status:** ✅ Both handle correctly
- **C++ Log:** `Receive COMBO_SKILL_PREPARE cmd from server.`
#### 7. ENCHANT_RESULT (139)
- **C++:** `SERVER - ENCHANT_RESULT(139), size=19`
- **C#:** `### GameDataSend: CMDID 139`
- **Purpose:** Returns enchantment/effect result
- **Status:** ✅ Both handle correctly
#### 8. SELF_INFO_00 (38)
- **C++:** `SERVER - SELF_INFO_00(38), size=36`
- **C#:** `### GameDataSend: CMDID 38`
- **Purpose:** Updates host player basic info
- **Status:** ✅ Both handle correctly
#### 9. HOST_STOP_SKILL (123)
- **C++:** `SERVER - HOST_STOP_SKILL(123), size=0`
- **C#:** `### GameDataSend: CMDID 123`
- **Purpose:** Stops the skill execution
- **Status:** ✅ Both handle correctly
- **C++ Log:** `CECHPWork::WORK_FLASHMOVE priority=2 killed`
---
### ⚠️ Unhandled Protocols in C# (But Received)
#### 1. SET_MOVE_STAMP (205)
- **C++:** `SERVER - SET_MOVE_STAMP(205), size=2`
- **C#:** `### GameDataSend: CMDID 205 (Unhandled CMDID 205 (payloadBytes=2))`
- **Purpose:** Sets movement synchronization stamp
- **Status:** ⚠️ C# receives but doesn't handle
- **Impact:** May cause movement desynchronization issues
#### 2. UPDATE_EXT_STATE (124)
- **C++:** `SERVER - UPDATE_EXT_STATE(124), size=28`
- **C#:** `### GameDataSend: Unhandled CMDID 124 (payloadBytes=28)`
- **Purpose:** Updates extended state (buffs, debuffs, effects)
- **Status:** ⚠️ C# receives but doesn't handle
- **Impact:** Extended states may not update correctly
#### 3. ICON_STATE_NOTIFY (125)
- **C++:** `SERVER - ICON_STATE_NOTIFY(125), size=10` (first) / `size=8` (second)
- **C#:** `### GameDataSend: Unhandled CMDID 125 (payloadBytes=10)` / `(payloadBytes=8)`
- **Purpose:** Notifies icon state changes (UI updates)
- **Status:** ⚠️ C# receives but doesn't handle
- **Impact:** UI icons may not reflect correct state
---
## Protocol Sequence Timeline
### C++ Timeline (EC.log)
```
[17:10:03.501] CLIENT - CAST_POS_SKILL(89)
[17:10:03.565] SERVER - OBJECT_MOVE(15) × 9
[17:10:03.565] SERVER - OBJECT_STOP_MOVE(35)
[17:10:03.565] SERVER - SET_MOVE_STAMP(205) ← 64ms delay
[17:10:03.565] SERVER - OBJECT_CAST_POS_SKILL(204)
[17:10:03.565] SERVER - SKILL_PERFORM(88)
[17:10:03.565] SERVER - SET_COOLDOWN(198)
[17:10:03.565] SERVER - COMBO_SKILL_PREPARE(394)
[17:10:03.565] SERVER - ENCHANT_RESULT(139)
[17:10:03.766] SERVER - SELF_INFO_00(38) ← 265ms delay
[17:10:03.766] SERVER - UPDATE_EXT_STATE(124)
[17:10:03.766] SERVER - ICON_STATE_NOTIFY(125)
[17:10:04.567] SERVER - OBJECT_MOVE(15) × 2 ← 1.066s delay
[17:10:04.567] SERVER - OBJECT_STOP_MOVE(35)
[17:10:04.567] SERVER - HOST_STOP_SKILL(123)
[17:10:04.766] SERVER - UPDATE_EXT_STATE(124) ← 1.265s delay
[17:10:04.766] SERVER - ICON_STATE_NOTIFY(125)
```
### C# Timeline (SessionLog)
```
[16:58:15.286] CLIENT - CAST_POS_SKILL (via PROTOCOL_GAMEDATASEND)
[16:58:15.402] SERVER - CMDID 205 (Unhandled) ← 116ms delay
[16:58:15.403] SERVER - CMDID 204
[16:58:15.404] SERVER - CMDID 88
[16:58:15.406] SERVER - CMDID 198
[16:58:15.407] SERVER - CMDID 394
[16:58:15.408] SERVER - CMDID 139
[16:58:15.409] SERVER - CMDID 38
[16:58:15.410] SERVER - CMDID 124 (Unhandled)
[16:58:15.411] SERVER - CMDID 125 (Unhandled)
[16:58:15.588] SERVER - CMDID 15 × 2 ← 302ms delay
[16:58:15.591] SERVER - CMDID 35
[16:58:16.388] SERVER - CMDID 38 ← 1.102s delay
[16:58:16.389] SERVER - CMDID 124 (Unhandled)
[16:58:16.391] SERVER - CMDID 125 (Unhandled)
[16:58:16.392] SERVER - CMDID 123
```
---
## Key Findings
### ✅ What Works the Same
1. **Core skill protocols** (204, 88, 198, 394, 139) are handled identically
2. **Movement protocols** (15, 35) work the same
3. **Player info** (38) updates correctly
4. **Skill stop** (123) is handled
### ⚠️ Missing Handlers in C#
1. **SET_MOVE_STAMP (205)** - May cause movement sync issues
2. **UPDATE_EXT_STATE (124)** - Extended states (buffs/debuffs) may not update
3. **ICON_STATE_NOTIFY (125)** - UI icon states may be incorrect
### 📊 Protocol Count Comparison
| Protocol | C++ Count | C# Count | Difference |
|----------|-----------|---------|------------|
| OBJECT_MOVE (15) | 11 | 8 | C++ has 3 more |
| OBJECT_STOP_MOVE (35) | 2 | 1 | C++ has 1 more |
| SET_MOVE_STAMP (205) | 1 | 1 (unhandled) | Same count |
| OBJECT_CAST_POS_SKILL (204) | 1 | 1 | ✅ Same |
| SKILL_PERFORM (88) | 1 | 1 | ✅ Same |
| SET_COOLDOWN (198) | 1 | 1 | ✅ Same |
| COMBO_SKILL_PREPARE (394) | 1 | 1 | ✅ Same |
| ENCHANT_RESULT (139) | 1 | 1 | ✅ Same |
| SELF_INFO_00 (38) | 1 | 1 | ✅ Same |
| UPDATE_EXT_STATE (124) | 2 | 2 (unhandled) | Same count |
| ICON_STATE_NOTIFY (125) | 2 | 2 (unhandled) | Same count |
| HOST_STOP_SKILL (123) | 1 | 1 | ✅ Same |
---
## Recommendations
### High Priority
1. **Implement SET_MOVE_STAMP (205) handler** in C#
- Critical for movement synchronization
- May cause desync between client and server positions
2. **Implement UPDATE_EXT_STATE (124) handler** in C#
- Important for buff/debuff/effect state management
- Affects gameplay mechanics
3. **Implement ICON_STATE_NOTIFY (125) handler** in C#
- Affects UI correctness
- Lower priority but improves user experience
### Medium Priority
1. **Investigate OBJECT_MOVE count difference**
- C++ receives 11 OBJECT_MOVE commands
- C# receives 8 OBJECT_MOVE commands
- May indicate timing or network differences
---
## Conclusion
**Overall Status:****Most protocols match** - The core skill casting flow works correctly in both implementations.
**Issues Found:** ⚠️ **3 unhandled protocols in C#** that may cause:
- Movement synchronization problems (SET_MOVE_STAMP)
- Extended state update issues (UPDATE_EXT_STATE)
- UI icon state inconsistencies (ICON_STATE_NOTIFY)
The server sends the same protocols to both clients, but C# needs to implement handlers for commands 205, 124, and 125 to achieve full feature parity with the C++ client.