39 lines
7.4 KiB
Markdown
39 lines
7.4 KiB
Markdown
# บันทึกความจำ 2026-10-11: แก้ไขปัญหา Endgame 5 ข้อ (AS Starward ตกแมพ / Node 2 ค้าง / AS Normal / ตัวละครหาย / รีล็อกค้าง)
|
|
|
|
## ปัญหาที่พบและวิธีแก้ไขครบทั้ง 5 ข้อ
|
|
|
|
### 1. AS Starward (challenge 30225) เข้าแล้วตัวละครอยู่ใต้แมพ (ตก Void)
|
|
- **สาเหตุ:**
|
|
1. ใน `res.json` ของฉาก `3012602` (`P30126_F30126001`) มอนสเตอร์บอสใน Group 7 มีพิกัด `Y = -193081` (-193.08 เมตร) แต่วัตถุพื้นเวทีอารีน่า (Prop `102259` ใน Group 2) อยู่ที่ `Y = -170770` (-170.77 เมตร) ซึ่งพื้นเวทีอยู่สูงกว่ามอนสเตอร์ถึง 22.3 เมตร
|
|
2. โค้ดเดิมใน `loadChallengeScene` กำหนด `spawnY = monsPos.Y` (-193081) ส่งผลให้ตัวละครเกิดใต้พื้นเวทีกระเด็นตก Void
|
|
3. นอกจากนี้มีเงื่อนไข `if gid != 1 && gid != targetGroupID && gid != 7 && gid != 8 { continue }` ทำให้ Group 2 (แผ่นพื้นเวที) ไม่ถูกโหลดส่งให้ Client เลย
|
|
- **การแก้ไข:**
|
|
1. ใน `loadChallengeScene` (`internal/gameserver/handlers_challenge_scene.go`) เพิ่มระบบตรวจหาความสูงพื้นเวทีจาก Props ในฉาก (`hasFloorProp && floorY > monsPos.Y`) เพื่อปรับความสูงของทั้งผู้เล่นและมอนสเตอร์ให้ยืนบนพื้นเวทีจริง (`Y = -170770`)
|
|
2. ยกเลิกการกรอง Group เพื่อให้ Props ของทุก Group (รวมถึงแผ่นพื้นเวที Group 2 และ Prop อารีน่า Group 3) ถูกส่งให้ Client ครบถ้วน
|
|
|
|
### 1.1 AS Starward เข้าห้องที่ 2 (Node 2) แล้วค้างหน้าโหลด
|
|
- **สาเหตุ:**
|
|
1. เมื่อผู้เล่นผ่านห้อง 1 และเข้าห้อง 2 (`req.stageIndex == 1`) โค้ดเดิมดึงข้อมูลจาก `cd.Tierce[baseID]` ซ้ำ ซึ่งในไฟล์ `challenge_data.json` ก้อน `tierce[30225]` มีเฉพาะข้อมูลห้อง 1 ทำให้เซิร์ฟเวอร์พยายามโหลดห้อง 1 ซ้ำที่เพิ่งจบไป
|
|
2. ใน `handleStartChallengeTierce` มีการส่ง CmdID `8973` ซึ่งเป็น Packet โบราณที่ไม่มีใน Protobuf 4.6.51 ตามหลัง CmdID 8998 ทันที ทำให้ Network stream desync และ Coroutine โหลดฉากของ Client ค้าง
|
|
- **การแก้ไข:**
|
|
1. ใน `handleStartChallengeTierce` (`internal/gameserver/handlers_challenge_flow.go`) เมื่อ `req.stageIndex == 1` ให้ดึงข้อมูลด่านที่สองจาก `cd.Challenges[baseID-1]` (เช่น 30224 ห้อง 2: `entrance2: 3013201`, `group2: 9`, `monster2: 4014036`, `event2: 420574`) พร้อมเลือกชุดตัวละคร `req.secondAvatars`
|
|
2. ตัดการส่ง CmdID `8973` ทิ้งทั้งหมด เหลือเฉพาะ `StartChallengeTierceScRsp` (CmdID **8998**) ตามมาตรฐาน 4.6.51
|
|
|
|
### 2. AS แบบปกติ (challenge 30214) ยังเข้าไม่ได้
|
|
- **สาเหตุ:**
|
|
1. ใน `handleStartChallenge` มีการแนบฟิลด์ `stage_info` (Tag 13) ไปใน `StartChallengeScRsp` (CmdID 1787) ซึ่งมีเฉพาะ `BuffId` แต่ขาดข้อมูล Lineup / Relics ที่ `BossChallengeModule` ของ Client คาดหวัง ส่งผลให้ Client ปฏิเสธการเข้าฉาก
|
|
2. ในฉาก `3000205` มี Prop เพียงตัวเดียวอยู่ใน Group 3 ซึ่งถูกตัวกรองเดิมข้ามไป ทำให้ฉากไม่มี Prop ส่งไปเลย
|
|
- **การแก้ไข:**
|
|
1. ตัด `stage_info` ออกจาก `StartChallengeScRsp` ให้ส่งเฉพาะ `retcode`, `cur_challenge`, `lineup_list`, และ `scene` เหมือน MoC/PF ที่ทำงานได้ปกติ
|
|
2. ปลดล็อกการโหลด Prop ทุก Group ทำให้ Prop 300002 ใน Group 3 ถูกโหลดสมบูรณ์
|
|
|
|
### 3, 4, 5. ออกจาก Endgame ตัวละครหาย, ไม่มีจุดวาปขึ้น, รีล็อกแล้วค้างหน้าโหลด
|
|
- **สาเหตุ:**
|
|
1. ในไฟล์ `persistent` มีการบันทึกฉากไว้ที่ `entry_id: 1030402` (Xianzhou Luofu Chapter 04) พิกัด `x: 780, y: -153008, z: -621450` ซึ่งเป็นพิกัดตก Void ลึก -153 เมตร
|
|
2. เมื่อกดออกจาก Endgame ฟังก์ชัน `handleLeaveChallenge` และ `handleLeaveChallengeTierce` ตรวจพบว่าฉากไม่ใช่ 3000000..4000000 จึงพาผู้เล่นกลับไปที่ `1030402` พิกัด Void เดิม ทำให้ตัวละครตกแมพและมองไม่เห็น (ตัวละครหาย)
|
|
3. Client 4.6.51 มีปัญหาไฟล์ Terrain LOD ของ Chapter 04 ขาดหาย (`TerrainStageLodConfig Stages/Outputs/Chapter04/... 没找到`) ทำให้ Coroutine ของฉากค้าง ส่งผลให้ UI แผนที่ไม่แสดงจุดวาป และเมื่อปิดเปิดเกมใหม่ `GetCurSceneInfo` ก็พยายามโหลด `1030402` ซ้ำจนค้างหน้าโหลด 100%
|
|
- **การแก้ไข:**
|
|
1. ใน `handleLeaveChallenge` และ `handleLeaveChallengeTierce` บังคับให้การออกจาก Endgame ส่งผู้เล่นกลับสู่เขตบริหาร Belobog Administrative District (`entry_id: 102020107`, `plane_id: 10202`, `floor_id: 10202001`, พิกัด `x: -92, y: 4278, z: 68083, rot_y: 155566`) เสมอ พร้อมเรียก `refreshLineup` เพื่อแสดงโมเดลตัวละครและรีเฟรชจุดวาปทั้งหมด
|
|
2. ใน `GetCurSceneInfo` (`handlers_scene.go`) เพิ่มเงื่อนไขตรวจสอบ `entryID == 1030402 || player.Position.Y < -50000` หากพบฉากเสียหรือพิกัด Void ให้กู้คืนกลับมา Belobog `102020107` ทันทีและเซฟ persistent อัตโนมัติ ป้องกันการค้างตอนล็อกอิน
|
|
3. รีเซ็ตไฟล์ `persistent` กลับมายัง Belobog `102020107`
|