10 KiB
10 KiB
บันทึกความจำ 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 = 5retcode = 9(0 = สำเร็จ)- AS:
challenge_boss = 1 - PF:
challenge_story = 3 - MoC:
challenge_default = 11
ข้อ 2: AS Starward (cmd 8986 StartChallengeTierceCsReq, challenge 30225) เข้าไม่ได้
- สาเหตุ:
mapChallengeStageIDฝืน map id 30200..30300 ทุกตัวไปเป็น 30204 (ซึ่ง 30204 ไม่มีในtierce)decodeStartChallengeTierceReqตรวจหาเฉพาะ tag 12/14 (4.5.52) แต่ client 4.6.51 ส่งLineupTierceListใน tag 9handleStartChallengeTierceตรวจสอบcd.Tierceเฉพาะเมื่อstageIndex == 2ทำให้ stageIndex 0 หลุดไปหา 3014101 -> 3000101- Response ตอบด้วย cmd 8973 (4.5.52) แทนที่จะเป็น 8998 (4.6.51)
- การแก้ไข:
mapChallengeStageIDคืนค่า id ทันทีถ้า id มีอยู่ในcd.Challengesหรือcd.Tierce(30225 คืน 30225)decodeStartChallengeTierceReqparse ผ่านproto.Unmarshal(&goproto.StartChallengeTierceCsReq)handleStartChallengeTierceดึงข้อมูลจากcd.Tierce[baseID]ทุก stageIndex ได้ entrance3012602, group7, monster2034012, event420554- ตอบด้วย
goproto.StartChallengeTierceScRspผ่าน CmdID 8998 (และ legacy 8973)
ข้อ 3: AS Normal (cmd 1731 StartChallengeCsReq, challenge 30224) เข้าไม่ได้
- สาเหตุ:
mapChallengeStageIDฝืน map 30224 -> 30204decodeStartChallengeReqมี wire slicing bug (buf = buf[len(buf)-len(sub):]; buf = buf[len(sub):]) ทำให้ buf desync และพลาด challenge_id
- การแก้ไข:
mapChallengeStageIDเช็คcd.Challenges[30224]แล้วคืน 30224 ตรงๆdecodeStartChallengeReqใช้proto.Unmarshal(&goproto.StartChallengeCsReq)+ helperreadLenDelimAndAdvancehandleStartChallengeตอบStartChallengeScRsp(1787) ครบทั้ง 2 Node
ข้อ 4: ออกจาก Endgame แล้วตัวละครหาย
- สาเหตุ:
loadChallengeSceneไปเขียนทับplayer.Scene.EntryID = entryIDทำให้ open world กลายเป็นฉาก arena (3000501/3000101) และถูกบันทึก persistenthandleLeaveChallengeและhandleLeaveChallengeTierceส่งเฉพาะ ScRsp เก่า (1716, 8997) โดยไม่ส่งloadSceneเพื่อพาผู้เล่นกลับ open world
- การแก้ไข:
- นำบรรทัดเขียนทับ
player.Sceneออกจากhandlers_challenge_scene.go handleLeaveChallengeตอบ CmdID 1771 (LeaveChallengeScRsp, tag 10 retcode 0[0x50, 0x00]) แล้วเรียกloadScene(s, returnEntry, true, nil, nil)สั่งEnterSceneByServerScNotify(1427) ดึงตัวละครกลับฉากเดิม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) เข้าไม่ได้
- สาเหตุ:
mapChallengeStageIDmap 20284 -> 20254handleStartChallengeส่งstage_info(tag 13) เป็นก้อนว่างสำหรับโหมด PF ทำให้ client เกิดปัญหา
- การแก้ไข:
- ไม่ map 20284 เพราะมีใน
cd.Challenges[20284] stage_info(tag 13) จะแนบเฉพาะเมื่อchallengeID >= 30000 && buff != 0(AS Boss เท่านั้น) ส่วน MoC และ PF จะเป็น nil (ไม่ปล่อย tag 13)
- ไม่ map 20284 เพราะมีใน
ข้อ 7: MoC Normal (challenge 5612) ค้างหน้าโหลดเหลือ 1 ขีด
- สาเหตุ:
- ทันทีที่เข้าฉาก arena client ส่ง cmd
8115(GetSwitchHandDataCsReq) แต่เซิร์ฟเวอร์ตอบด้วย cmd8104(ซึ่งเป็น CsReq:SwitchHandStartCsReq) ทำให้ client สับสนและค้าง loading notch สุดท้าย mapChallengeStageIDมีการเพี้ยน id 5612
- ทันทีที่เข้าฉาก arena client ส่ง cmd
- การแก้ไข:
- แก้ cmd
8115ให้ตอบ CmdID 8108 (GetSwitchHandDataScRsp, body[0x18, 0x00]) mapChallengeStageIDคืน 5612 ตรงๆ จากcd.Challenges[5612](entrance 3013801)
- แก้ cmd
ข้อ 8: ค้างหน้าจอโหลด 100% (รูปรถไฟ Astral Express หมุนไม่ไปต่อ)
- สาเหตุจาก Player.log:
- DrinkMaker NRE: Client ส่ง cmd
6995(GetDrinkMakerDataCsReq) แต่dispatch.goตอบกลับด้วย6988payload เปล่า (len: 0) เพราะไม่อยู่ในdangerFamiliesส่งผลให้DrinkMakerBar._UpdateGameplayData()ใน Unity client เจอก้อน nil แล้ว crashNullReferenceException - MapNPC Astral Express NRE: บันทึก
persistentถูกตั้งไว้ที่entry_id: 100000104(Astral Express Parlor CarP10000_F10000000) ซึ่งใน client 4.6.51 นี้ ไฟล์ config ของ Chapter00 มีปัญหา (TerrainStageLodConfig ... 没找到) และMapNPC:227-400001ไม่มี ConfigEntityPath ทำให้AsyncLoad MapObjectโยนNullReferenceExceptionระหว่างขั้นตอนAdventurePhase._EnterStep2()ค้างโหลด 100% แล้วแอปเด้งปิด
- DrinkMaker NRE: Client ส่ง cmd
- การแก้ไข:
- เพิ่ม
"DrinkMaker"ลงในdangerFamiliesและเพิ่ม CmdID6995, 6988ในisDangerCmd(dispatch.go) ให้ drop เงียบๆ ป้องกัน empty ScRsp - เปลี่ยน fallback ของ
GetCurSceneInfoในhandlers_scene.goและhandleLeaveChallenge/handleLeaveChallengeTierceในhandlers_challenge_flow.goจาก100000104เป็น102020107(Belobog Administrative DistrictP10202_F10202001) ซึ่งเป็นแมพสมบูรณ์ 100% - รีเซ็ตไฟล์
persistentกลับเป็นแมพ102020107พิกัดx: -92, y: 4278, z: 68083, rot_y: 155566
- เพิ่ม
ข้อ 9: Run.bat เปิดไม่ติด (หน้าต่างกระพริบปิดทันที)
- สาเหตุ:
- ในคำสั่ง
if (...)ของไฟล์ batch มีข้อความecho ... (Option 4).ซึ่งตัวอักษร)ไปปิดบล็อกifก่อนกำหนด ทำให้เครื่องหมายจุด.กลายเป็นคำสั่งที่ผิดไวยากรณ์ DOS/Windows (. was unexpected at this time.) ส่งผลให้ cmd แครชปิดหน้าต่างทันทีตั้งแต่บรรทัดแรกๆ - การใช้ข้อความภาษาไทยในไฟล์ .bat ที่บันทึกแบบ UTF-8 ทำให้ cmd.exe ใน codepage เริ่มต้นของ Windows ตีความไบต์ผิดพลาด
- ในคำสั่ง
- การแก้ไข:
- แก้ไข
run.batและrun_go.batให้เป็น ASCII ที่สะอาด ไม่มีวงเล็บซ้อนในบล็อกif - เพิ่มตัวเลือกแบบยืดหยุ่น:
- [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] ออก
- ถ้าเปิดสำเร็จโดยไม่มี error จะนับถอยหลัง 5 วินาทีแล้วปิดหน้าต่าง Launcher ไปเองตามที่ผู้ใช้ต้องการ (และหากมี error จะ pause ค้างไว้ให้อ่าน)
- แก้ไข