# บันทึกความจำ 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` ใหม่และรีสตาร์ทกระบวนการ