4.8 KiB
4.8 KiB
บันทึกความจำ 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-RankGET, POST /api/persistent: อ่าน/เขียนไฟล์ persistentPOST /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(RVA0xceb7e65) เนื่องจาก Battle Module ภายในยังไม่ถูก initialize
- ใน
- สาเหตุที่ 3 (การตัดและบิดเบือน MonsterWaveList ใน Calyx):
- ใน
StartCocoonStageและStartQuickCocoonStageมีการบังคับตัดเวฟMonsterWaveList[:1]และเซ็ตw.WaveId = 1ให้กับทุกเวฟ ทำให้โครงสร้างเวฟของ Client เสียหาย
- ใน
- การแก้ไข:
- แก้
gateway.go: ให้watchFreesrDataเฝ้าดูเฉพาะfreesr-data.jsonเท่านั้น (ไม่ดูpersistent) เหมือนโครงสร้างต้นฉบับ - แก้
handlers_scene.go: นำplayer.SavePersistent()ออกจากSceneEntityMoveเพื่อหยุดการเขียนดิสก์และลูป Network flood โดยสิ้นเชิง - แก้
handlers_battle.go:- ใน
GetCurBattleInfoตัด fallback ปลอมออก หากไม่มี Token ในCURRENT_BATTLEให้ตอบRET_BATTLE_STAGE_NOT_MATCH(2000) ป้องกัน NRE - ใน
StartCocoonStageและStartQuickCocoonStageส่งbattleInfoที่สมบูรณ์พร้อมเวฟที่ถูกต้อง และเพิ่ม Log แสดงค่าCocoonId,Wave,WorldLevel
- ใน
- คอมไพล์
gameserver-go.exeใหม่และรีสตาร์ทกระบวนการ
- แก้