Files
GaCy-GO/tools/AI TOOLBOX/memory/2026-10-16.md
T

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-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 ใหม่และรีสตาร์ทกระบวนการ