34 lines
4.8 KiB
Markdown
34 lines
4.8 KiB
Markdown
# บันทึกความจำ 2026-10-16: แก้ไขปัญหา Calyx (ดอกไม้) เข้าต่อสู้ไม่ได้ / Network Flood Loop / REST API Gateway สำหรับ GaC-Srtool
|
|
|
|
## 1. REST API Gateway (port 21000)
|
|
- นำหน้าเว็บ HTML Dashboard ภายในออกตามความต้องการของผู้ใช้ เพื่อเตรียมรองรับ GaC-Srtool ภายนอก
|
|
- สร้าง REST API Gateway (`internal/sdkserver/api.go`) พร้อม CORS Header:
|
|
- `GET /` และ `GET /dashboard`: ดูรายการ API ทั้งหมด
|
|
- `GET, POST /api/freesr`: อ่าน/เขียน `freesr-data.json` ทั้งหมด
|
|
- `GET, POST /api/freesr/avatars`: จัดการเลเวล, ปลดดาว, รีลิกส์, Ex-Rank
|
|
- `GET, POST /api/persistent`: อ่าน/เขียนไฟล์ persistent
|
|
- `POST /api/exrank/toggle`: เปิด/ปิด Ex-Rank รายตัวหรือทุกตัว
|
|
- `POST /api/avatar/rank`: ปรับ Eidolon (0-6)
|
|
- `POST /api/avatar/max_all`: แม็กซ์ตัวละครทุกตัว
|
|
- `POST /api/teleport`: วาปตำแหน่ง/ฉาก
|
|
- `GET /api/status`: สรุปสถานะเซิร์ฟเวอร์, จำนวนตัวละคร, ทีมปัจจุบัน
|
|
|
|
## 2. แก้ปัญหา Calyx (ดอกไม้) เข้าไม่ได้ และ Network Flood Loop
|
|
- **สาเหตุที่ 1 (Network Flood Loop & Battle Reset):**
|
|
- ใน `handlers_scene.go` ที่ฟังก์ชัน `SceneEntityMove` มีการเรียก `player.SavePersistent()` ทุกเฟรมที่มีการเคลื่อนที่ของผู้เล่น
|
|
- ใน `gateway.go` ฟังก์ชัน `watchFreesrData` เฝ้าดูการเปลี่ยนแปลงของไฟล์ `persistent` ทุก 1 วินาที
|
|
- เมื่อผู้เล่นขยับ `persistent` ถูกเขียนซ้ำตลอดเวลา ทำให้ `watchFreesrData` สั่ง `session.SyncPlayer()` ทุกวินาที
|
|
- `SyncPlayer()` ยิงแพ็กเก็ต `PlayerSyncScNotify` ขนาดกว่า 60KB (ประกอบด้วย `DelRelicList`, `DelEquipmentList`, `AvatarSync`) ล้างไอเทมและรีเซ็ตตัวละครกลับมาเป็นสถานะ Overworld ขัดจังหวะการโหลดเข้าสู่การต่อสู้ Calyx
|
|
- **สาเหตุที่ 2 (NullReferenceException ใน `GetCurBattleInfo`):**
|
|
- ใน `handlers_battle.go` ฟังก์ชัน `GetCurBattleInfo` มีโค้ด fallback ปลอมที่สร้าง battleInfo ส่งกลับด้วย retcode 0 แม้ไม่ได้อยู่ในการต่อสู้
|
|
- ทำให้ Client เมื่อเรียก `GetCurBattleInfoCsReq` เกิด crash NRE ใน `AdventureModule._OnGetCurBattleInfoScRsp` (RVA `0xceb7e65`) เนื่องจาก Battle Module ภายในยังไม่ถูก initialize
|
|
- **สาเหตุที่ 3 (การตัดและบิดเบือน MonsterWaveList ใน Calyx):**
|
|
- ใน `StartCocoonStage` และ `StartQuickCocoonStage` มีการบังคับตัดเวฟ `MonsterWaveList[:1]` และเซ็ต `w.WaveId = 1` ให้กับทุกเวฟ ทำให้โครงสร้างเวฟของ Client เสียหาย
|
|
- **การแก้ไข:**
|
|
1. แก้ `gateway.go`: ให้ `watchFreesrData` เฝ้าดูเฉพาะ `freesr-data.json` เท่านั้น (ไม่ดู `persistent`) เหมือนโครงสร้างต้นฉบับ
|
|
2. แก้ `handlers_scene.go`: นำ `player.SavePersistent()` ออกจาก `SceneEntityMove` เพื่อหยุดการเขียนดิสก์และลูป Network flood โดยสิ้นเชิง
|
|
3. แก้ `handlers_battle.go`:
|
|
- ใน `GetCurBattleInfo` ตัด fallback ปลอมออก หากไม่มี Token ใน `CURRENT_BATTLE` ให้ตอบ `RET_BATTLE_STAGE_NOT_MATCH` (2000) ป้องกัน NRE
|
|
- ใน `StartCocoonStage` และ `StartQuickCocoonStage` ส่ง `battleInfo` ที่สมบูรณ์พร้อมเวฟที่ถูกต้อง และเพิ่ม Log แสดงค่า `CocoonId`, `Wave`, `WorldLevel`
|
|
4. คอมไพล์ `gameserver-go.exe` ใหม่และรีสตาร์ทกระบวนการ
|