fix(scene): unlock all teleports across maps, merge resource configs, fix scenary not load error, and add quick farm battle handlers
This commit is contained in:
1 parent
9aab62414f
commit
163d4433e6
47 files changed
+2025067
-6082
No files matched your search
@@ -0,0 +1,88 @@
|
||||
# บันทึกความจำ 2026-10-10: แก้ไข Endgame Modes ทั้ง 7 ข้อ (4.6.51)
|
||||
|
||||
## ปัญหาที่พบและวิธีแก้ไขครบทั้ง 7 ข้อ
|
||||
|
||||
### ข้อ 1: กด Apocalyptic Shadow ในแท็บ Latest Update แล้วขึ้น Error(100)
|
||||
- **สาเหตุ:** Client ส่ง cmd `1775` (`GetChallengeGroupStatisticsCsReq`) ซึ่งโค้ดเดิมใช้ byte slicing แบบ 4.5.52 เก่าที่มี tag ผิดเพี้ยน (`group_id=9`, `retcode=15`, `challenge_boss=11`) ทำให้ client 4.6.51 parse ไม่ได้แล้วโยน Error(100)
|
||||
- **การแก้ไข:** ใน `internal/gameserver/handlers_raw.go` เขียน `challengeGroupStatsReply` ใหม่โดยใช้ `goproto.GetChallengeGroupStatisticsScRsp` ตาม proto 4.6.51 โดยตรง:
|
||||
- `group_id = 5`
|
||||
- `retcode = 9` (0 = สำเร็จ)
|
||||
- AS: `challenge_boss = 1`
|
||||
- PF: `challenge_story = 3`
|
||||
- MoC: `challenge_default = 11`
|
||||
|
||||
### ข้อ 2: AS Starward (cmd 8986 `StartChallengeTierceCsReq`, challenge 30225) เข้าไม่ได้
|
||||
- **สาเหตุ:**
|
||||
1. `mapChallengeStageID` ฝืน map id 30200..30300 ทุกตัวไปเป็น 30204 (ซึ่ง 30204 ไม่มีใน `tierce`)
|
||||
2. `decodeStartChallengeTierceReq` ตรวจหาเฉพาะ tag 12/14 (4.5.52) แต่ client 4.6.51 ส่ง `LineupTierceList` ใน tag 9
|
||||
3. `handleStartChallengeTierce` ตรวจสอบ `cd.Tierce` เฉพาะเมื่อ `stageIndex == 2` ทำให้ stageIndex 0 หลุดไปหา 3014101 -> 3000101
|
||||
4. Response ตอบด้วย cmd 8973 (4.5.52) แทนที่จะเป็น 8998 (4.6.51)
|
||||
- **การแก้ไข:**
|
||||
1. `mapChallengeStageID` คืนค่า id ทันทีถ้า id มีอยู่ใน `cd.Challenges` หรือ `cd.Tierce` (30225 คืน 30225)
|
||||
2. `decodeStartChallengeTierceReq` parse ผ่าน `proto.Unmarshal(&goproto.StartChallengeTierceCsReq)`
|
||||
3. `handleStartChallengeTierce` ดึงข้อมูลจาก `cd.Tierce[baseID]` ทุก stageIndex ได้ entrance `3012602`, group `7`, monster `2034012`, event `420554`
|
||||
4. ตอบด้วย `goproto.StartChallengeTierceScRsp` ผ่าน CmdID **8998** (และ legacy 8973)
|
||||
|
||||
### ข้อ 3: AS Normal (cmd 1731 `StartChallengeCsReq`, challenge 30224) เข้าไม่ได้
|
||||
- **สาเหตุ:**
|
||||
1. `mapChallengeStageID` ฝืน map 30224 -> 30204
|
||||
2. `decodeStartChallengeReq` มี wire slicing bug (`buf = buf[len(buf)-len(sub):]; buf = buf[len(sub):]`) ทำให้ buf desync และพลาด challenge_id
|
||||
- **การแก้ไข:**
|
||||
1. `mapChallengeStageID` เช็ค `cd.Challenges[30224]` แล้วคืน 30224 ตรงๆ
|
||||
2. `decodeStartChallengeReq` ใช้ `proto.Unmarshal(&goproto.StartChallengeCsReq)` + helper `readLenDelimAndAdvance`
|
||||
3. `handleStartChallenge` ตอบ `StartChallengeScRsp` (1787) ครบทั้ง 2 Node
|
||||
|
||||
### ข้อ 4: ออกจาก Endgame แล้วตัวละครหาย
|
||||
- **สาเหตุ:**
|
||||
1. `loadChallengeScene` ไปเขียนทับ `player.Scene.EntryID = entryID` ทำให้ open world กลายเป็นฉาก arena (3000501/3000101) และถูกบันทึก persistent
|
||||
2. `handleLeaveChallenge` และ `handleLeaveChallengeTierce` ส่งเฉพาะ ScRsp เก่า (1716, 8997) โดยไม่ส่ง `loadScene` เพื่อพาผู้เล่นกลับ open world
|
||||
- **การแก้ไข:**
|
||||
1. นำบรรทัดเขียนทับ `player.Scene` ออกจาก `handlers_challenge_scene.go`
|
||||
2. `handleLeaveChallenge` ตอบ CmdID **1771** (`LeaveChallengeScRsp`, tag 10 retcode 0 `[0x50, 0x00]`) แล้วเรียก `loadScene(s, returnEntry, true, nil, nil)` สั่ง `EnterSceneByServerScNotify` (1427) ดึงตัวละครกลับฉากเดิม
|
||||
3. `handleLeaveChallengeTierce` ตอบ CmdID **8983** (`LeaveChallengeTierceScRsp`, tag 13 retcode 0 `[0x68, 0x00]`) แล้วเรียก `loadScene` เช่นกัน
|
||||
|
||||
### ข้อ 5: PF Starward หมุนค้างตอนจัดทีมตัวละคร
|
||||
- **สาเหตุ:** Client ส่ง cmd `8978` / `9000` (`SetChallengeTierceLineupCsReq`) ซึ่ง callback ใน GameAssembly.dll (`OMOEFAHFJFL::EMMGHDLIPOH`) รอ CmdID **8985** (`SetChallengeTierceLineupScRsp` / `CmdChallengeTierceType_PMMCIBMKOLD`) แต่เซิร์ฟเวอร์ส่ง 8999 ทำให้ client ไม่เคยได้รับ callback และหมุนค้าง
|
||||
- **การแก้ไข:** ใน `handleSetChallengeTierceLineup` ส่ง CmdID **8985** ด้วยบอดี้ `[0x08, 0x00]` (tag 1 retcode 0) และแมพทั้ง 8978 และ 9000 ใน `rawHandlers`
|
||||
|
||||
### ข้อ 6: PF Normal (challenge 20284) เข้าไม่ได้
|
||||
- **สาเหตุ:**
|
||||
1. `mapChallengeStageID` map 20284 -> 20254
|
||||
2. `handleStartChallenge` ส่ง `stage_info` (tag 13) เป็นก้อนว่างสำหรับโหมด PF ทำให้ client เกิดปัญหา
|
||||
- **การแก้ไข:**
|
||||
1. ไม่ map 20284 เพราะมีใน `cd.Challenges[20284]`
|
||||
2. `stage_info` (tag 13) จะแนบเฉพาะเมื่อ `challengeID >= 30000 && buff != 0` (AS Boss เท่านั้น) ส่วน MoC และ PF จะเป็น nil (ไม่ปล่อย tag 13)
|
||||
|
||||
### ข้อ 7: MoC Normal (challenge 5612) ค้างหน้าโหลดเหลือ 1 ขีด
|
||||
- **สาเหตุ:**
|
||||
1. ทันทีที่เข้าฉาก arena client ส่ง cmd `8115` (`GetSwitchHandDataCsReq`) แต่เซิร์ฟเวอร์ตอบด้วย cmd `8104` (ซึ่งเป็น CsReq: `SwitchHandStartCsReq`) ทำให้ client สับสนและค้าง loading notch สุดท้าย
|
||||
2. `mapChallengeStageID` มีการเพี้ยน id 5612
|
||||
- **การแก้ไข:**
|
||||
1. แก้ cmd `8115` ให้ตอบ CmdID **8108** (`GetSwitchHandDataScRsp`, body `[0x18, 0x00]`)
|
||||
2. `mapChallengeStageID` คืน 5612 ตรงๆ จาก `cd.Challenges[5612]` (entrance 3013801)
|
||||
|
||||
### ข้อ 8: ค้างหน้าจอโหลด 100% (รูปรถไฟ Astral Express หมุนไม่ไปต่อ)
|
||||
- **สาเหตุจาก Player.log:**
|
||||
1. **DrinkMaker NRE:** Client ส่ง cmd `6995` (`GetDrinkMakerDataCsReq`) แต่ `dispatch.go` ตอบกลับด้วย `6988` payload เปล่า (`len: 0`) เพราะไม่อยู่ใน `dangerFamilies` ส่งผลให้ `DrinkMakerBar._UpdateGameplayData()` ใน Unity client เจอก้อน nil แล้ว crash `NullReferenceException`
|
||||
2. **MapNPC Astral Express NRE:** บันทึก `persistent` ถูกตั้งไว้ที่ `entry_id: 100000104` (Astral Express Parlor Car `P10000_F10000000`) ซึ่งใน client 4.6.51 นี้ ไฟล์ config ของ Chapter00 มีปัญหา (`TerrainStageLodConfig ... 没找到`) และ `MapNPC:227-400001` ไม่มี ConfigEntityPath ทำให้ `AsyncLoad MapObject` โยน `NullReferenceException` ระหว่างขั้นตอน `AdventurePhase._EnterStep2()` ค้างโหลด 100% แล้วแอปเด้งปิด
|
||||
- **การแก้ไข:**
|
||||
1. เพิ่ม `"DrinkMaker"` ลงใน `dangerFamilies` และเพิ่ม CmdID `6995, 6988` ใน `isDangerCmd` (`dispatch.go`) ให้ drop เงียบๆ ป้องกัน empty ScRsp
|
||||
2. เปลี่ยน fallback ของ `GetCurSceneInfo` ใน `handlers_scene.go` และ `handleLeaveChallenge` / `handleLeaveChallengeTierce` ใน `handlers_challenge_flow.go` จาก `100000104` เป็น `102020107` (Belobog Administrative District `P10202_F10202001`) ซึ่งเป็นแมพสมบูรณ์ 100%
|
||||
3. รีเซ็ตไฟล์ `persistent` กลับเป็นแมพ `102020107` พิกัด `x: -92, y: 4278, z: 68083, rot_y: 155566`
|
||||
### ข้อ 9: Run.bat เปิดไม่ติด (หน้าต่างกระพริบปิดทันที)
|
||||
- **สาเหตุ:**
|
||||
1. ในคำสั่ง `if (...)` ของไฟล์ batch มีข้อความ `echo ... (Option 4).` ซึ่งตัวอักษร `)` ไปปิดบล็อก `if` ก่อนกำหนด ทำให้เครื่องหมายจุด `.` กลายเป็นคำสั่งที่ผิดไวยากรณ์ DOS/Windows (`. was unexpected at this time.`) ส่งผลให้ cmd แครชปิดหน้าต่างทันทีตั้งแต่บรรทัดแรกๆ
|
||||
2. การใช้ข้อความภาษาไทยในไฟล์ .bat ที่บันทึกแบบ UTF-8 ทำให้ cmd.exe ใน codepage เริ่มต้นของ Windows ตีความไบต์ผิดพลาด
|
||||
- **การแก้ไข:**
|
||||
1. แก้ไข `run.bat` และ `run_go.bat` ให้เป็น ASCII ที่สะอาด ไม่มีวงเล็บซ้อนในบล็อก `if`
|
||||
2. เพิ่มตัวเลือกแบบยืดหยุ่น:
|
||||
- [1] เปิด Server + ตัวเกม / Proxy (Default)
|
||||
- [2] เปิด Server ทั้งสองตัว (SDK + Game Server)
|
||||
- [3] เปิดเฉพาะ **SDK Server ONLY** (HTTP 21000)
|
||||
- [4] เปิดเฉพาะ **Game Server ONLY** (UDP 23301)
|
||||
- [5] เปิด Server + Gay Proxy
|
||||
- [6] Build / Rebuild binaries (Go)
|
||||
- [7] ออก
|
||||
3. ถ้าเปิดสำเร็จโดยไม่มี error จะนับถอยหลัง 5 วินาทีแล้วปิดหน้าต่าง Launcher ไปเองตามที่ผู้ใช้ต้องการ (และหากมี error จะ pause ค้างไว้ให้อ่าน)
|
||||
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
# บันทึกความจำ 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`
|
||||
@@ -0,0 +1,33 @@
|
||||
# บันทึกความจำ 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` ใหม่และรีสตาร์ทกระบวนการ
|
||||
@@ -64,7 +64,7 @@ description: คู่มือ Honkai Star Rail Private Server (GaC-hkrpg-go
|
||||
- **GetNpcTakenReward (2174)**: client ถามก่อนคุย NPC — ไม่ตอบ = dialogue ไม่มีตัวเลือกและค้าง
|
||||
- **Tutorial**: mark ทุก id ว่าดูแล้ว (`GetTutorial`/`GetTutorialGuide` status enum `Oekdmamgidc`=2) ไม่งั้น popup เด้งวนและ**บล็อก input**; `FinishTutorial/UnlockTutorial*` ต้องตอบพร้อม Tutorial/TutorialGuide message
|
||||
- **GetMissionStatusScRsp ต้องส่ง `finished_main_mission_id_list` + `curversion_finished_main_mission_id_list` (tag 13)** — ตอบเปล่า = client Lua NRE → บล็อก input + client ส่ง cmd 1204 ซ้ำรัวๆ
|
||||
- **GetSwitchHandData**: 4.6.51 CsReq 8115 → ตอบ ScRsp **8104** (tag 3 retcode 0)
|
||||
- **GetSwitchHandData**: 4.6.51 CsReq 8115 → ตอบ ScRsp **8108** (tag 3 retcode 0; 8104 คือ SwitchHandStartCsReq ห้ามตอบ)
|
||||
- **arena ใหม่ไม่มีใน client เก่า**: challenge phase ใหม่ (เช่น 5312) ใช้ arena 3014101 ซึ่ง client build เก่าไม่มี MapEntrance → Lua `GotoMapParam: attempt to index nil with 'ID'` — fallback ไป arena มาตรฐาน 3000101
|
||||
- **Scene ไม่มี teleport**: ฉาก arena ไม่มี teleport ใน res — fallback จาก `teleports.json` หรือ spawn ใกล้ prop แรกหันหน้าเข้าหา
|
||||
- **full coverage ตอบ ScRsp ว่างทุก cmd = อันตราย!** — client modules (`GridFight`, `ChessRogue`, `EvolveBuild`, `ChimeraDuel`, `Jukebox`) รับว่างแล้ว `Sync(nil)` → NRE วน → **จอดำ** — cmd ไม่รู้จักต้อง **drop เงียบๆ** ตอบว่างได้เฉพาะ dummy list ที่ทดสอบแล้ว
|
||||
@@ -149,3 +149,22 @@ commit สุดท้ายของ Rust (`ebc27a1`) อ้างชื่อ
|
||||
Endgame entry รอ response นี้ก่อนเปิด UI (บันทึก Rust บอก 4130 ผิด)
|
||||
- **Activity schedule จริง**: `tools/march7_dump/Config/Custom/ActivityConfig.json`
|
||||
(147 activities จาก client 4.6.51) — อย่าส่ง synthetic id เพราะ Travel Log จะว่าง
|
||||
|
||||
## 14. บทเรียนระบบ Endgame ใน 4.6.51 (Apocalyptic Shadow, Pure Fiction, MoC)
|
||||
|
||||
1. **GetChallengeGroupStatistics (1775/1711 → 1708)**:
|
||||
- Client ส่ง `GetChallengeGroupStatisticsCsReq`
|
||||
- ScRsp 1708 ต้องใช้ proto 4.6.51 (`group_id=5`, `retcode=9`, `challenge_boss=1`, `challenge_story=3`, `challenge_default=11`) ห้ามใช้ layout 4.5.52
|
||||
2. **StartChallengeTierce (Starward/PF/AS) = CmdID 8998 (4.6.51)**:
|
||||
- Client ส่ง `StartChallengeTierceCsReq` (8986): `challenge_id` (tag 3), `stageIndex` (tag 5), `lineup_tierce_list` (tag 9)
|
||||
- Response ใน 4.6.51 คือ **8998** (`StartChallengeTierceScRsp`) ประกอบด้วย `retcode` (tag 3), `scene` (tag 9), `cur_tierce_challenge` (tag 15)
|
||||
- ข้อมูลแมพดึงจาก `cd.Tierce[baseID]` สำหรับทุก stageIndex
|
||||
3. **SetChallengeTierceLineup (8978/9000 → 8985)**:
|
||||
- Callback `OMOEFAHFJFL::EMMGHDLIPOH` ใน client รอ CmdID **8985** (`SetChallengeTierceLineupScRsp`) บอดี้ `[0x08, 0x00]`
|
||||
- เซิร์ฟเวอร์เดิมส่ง 8999 ทำให้ client หมุนค้างตลอดเวลาเลือกตัวละคร
|
||||
4. **Leave Challenge (1705 → 1771, 8989 → 8983) และการรักษาสภาพตัวละคร**:
|
||||
- `loadChallengeScene` **ห้ามเขียนทับ** `player.Scene.EntryID/FloorID/PlaneID` — มิฉะนั้น persistent save จะพังเป็นฉาก arena
|
||||
- เมื่อผู้เล่นกดยกเลิก/ออกจาก Endgame ต้องตอบ ScRsp (1771 หรือ 8983) พร้อมเรียก `loadScene(s, returnEntry, true, nil, nil)` สั่ง `EnterSceneByServerScNotify` (1427) ดึงตัวละครกลับ open world ทันที ตัวละครจะไม่หาย
|
||||
5. **StartChallenge Lineup List & Stage Info (1787)**:
|
||||
- ต้องแนบทั้ง Node 1 (index 0) และ Node 2 (index 1) ใน `LineupList`
|
||||
- `StageInfo` (tag 13) แนบเฉพาะเมื่อ `challengeID >= 30000 && buff != 0` (AS Boss) ห้ามแนบว่างใน MoC และ PF
|
||||
Reference in new issue
Block a user