# Ungrouped.proto — คู่มือจัดกลุ่ม message ## อ่านไฟล์นี้อย่างไร นี่คือ schema ของ Protobuf ที่ใช้กำหนดรูปแบบข้อมูลระหว่าง Client กับ Server ไม่ใช่ไฟล์ config และไม่ได้บอกวิธีทำงานของ handler เอง - `CsReq` คือคำขอจาก Client, `ScRsp` คือคำตอบจาก Server, `ScNotify` คือข้อความแจ้งจาก Server; `Rsp` คือ response เช่นกัน - เลขหลัง `=` คือ Protobuf field tag; คอมเมนต์ `offset:` เป็น metadata จาก dump ไม่ใช่ CmdID - `Ungrouped.proto` ไม่มี CmdID และไม่มีป้าย protocol revision จึงห้ามใช้ไฟล์นี้เดาเลข route/handler ## ผลเทียบกับ GaC - ไฟล์ต้นทางมี 203 top-level messages และ 5 enums - ชื่อ message 141 รายการมีอยู่แล้วใน `StarRail.proto`; เพิ่ม schema ที่ขาด 62 รายการกับ enum ที่ขาด 1 รายการไว้ใน `protocol/proto/ungrouped.proto` - เพิ่ม `KVP` (uint32 value (tag 3), uint32 key (tag 9)) ซึ่งไฟล์ต้นทางอ้างผ่าน `Common.proto` แต่ dependency นั้นไม่ได้แนบมา - schema ที่เพิ่มไม่มี CmdID comment และยังไม่ได้ผูก packet handler; การเทียบกับ source อื่นพบว่า body/field tags ใช้ตรวจโครงสร้างได้ แต่ CmdID ต่างกันได้ ตรวจ signature ของ 203 message กับ `AstralOS/crates/morax/src/StarRail.proto` ที่ checkout revision `abf2fd8fc07711432bac878d44f151f041311f24` แล้ว field types/tags ตรงกันทั้งหมด อย่างไรก็ตาม revision ของไฟล์ต้นทางที่แนบมาไม่ระบุ จึงใช้ reference นี้ยืนยันรูปร่าง schema เท่านั้น ไม่ใช้ย้าย CmdID ตัวอย่างความต่างของ CmdID: `B51RacingGetDataCsReq` ในตาราง GaC ปัจจุบันเป็น 9995 แต่ source AstralOS revision ข้างต้นระบุ 9990 จึงไม่คัดลอก ID ข้ามตาราง ## กลุ่มที่อ่านความหมายได้จากชื่อ ### B51 Racing (37 messages) ชุดข้อมูลและคำสั่งของกิจกรรมแข่งรถ: รถ/ลายรถ/คนขับ/ชิ้นส่วน/การพัฒนา/รอบแข่ง. - `B51RacingAgendaInfo` — เพิ่ม schema แล้ว - `B51RacingCarDisplay` — เพิ่ม schema แล้ว - `B51RacingCarLivery` — เพิ่ม schema แล้ว - `B51RacingCarLiveryCsReq` — เพิ่ม schema แล้ว - `B51RacingCarLiveryScRsp` — เพิ่ม schema แล้ว - `B51RacingChallengeCarData` — เพิ่ม schema แล้ว - `B51RacingChallengeData` — เพิ่ม schema แล้ว - `B51RacingChallengeEndMatchCsReq` — เพิ่ม schema แล้ว - `B51RacingChallengeEndMatchScRsp` — เพิ่ม schema แล้ว - `B51RacingChallengeStartMatchCsReq` — เพิ่ม schema แล้ว - `B51RacingChallengeStartMatchScRsp` — เพิ่ม schema แล้ว - `B51RacingChallengeUpdateCarCsReq` — เพิ่ม schema แล้ว - `B51RacingChallengeUpdateCarScRsp` — เพิ่ม schema แล้ว - `B51RacingCycleData` — เพิ่ม schema แล้ว - `B51RacingDevelopmentInfo` — เพิ่ม schema แล้ว - `B51RacingDriverUnlockScNotify` — เพิ่ม schema แล้ว - `B51RacingEndMatchCsReq` — เพิ่ม schema แล้ว - `B51RacingEndMatchScRsp` — เพิ่ม schema แล้ว - `B51RacingGetDataCsReq` — มี schema เดิมใน `StarRail.proto` - `B51RacingGetDataScRsp` — มี schema เดิมใน `StarRail.proto` - `B51RacingMatchInfo` — เพิ่ม schema แล้ว - `B51RacingMatchStats` — เพิ่ม schema แล้ว - `B51RacingMissionChangeAgendaScNotify` — เพิ่ม schema แล้ว - `B51RacingPartInfo` — เพิ่ม schema แล้ว - `B51RacingPreMatchTrackInfo` — เพิ่ม schema แล้ว - `B51RacingReplacePartScRsp` — เพิ่ม schema แล้ว - `B51RacingSelectDevelopActionCsReq` — เพิ่ม schema แล้ว - `B51RacingSelectDevelopActionScRsp` — เพิ่ม schema แล้ว - `B51RacingSelectDevelopPartCsReq` — เพิ่ม schema แล้ว - `B51RacingSelectDevelopPartScRsp` — เพิ่ม schema แล้ว - `B51RacingSetDriverCsReq` — เพิ่ม schema แล้ว - `B51RacingSetDriverScRsp` — เพิ่ม schema แล้ว - `B51RacingStartCycleCsReq` — เพิ่ม schema แล้ว - `B51RacingStartCycleScRsp` — เพิ่ม schema แล้ว - `B51RacingStartMatchCsReq` — เพิ่ม schema แล้ว - `B51RacingStartMatchScRsp` — เพิ่ม schema แล้ว - `B51RacingStatInfo` — เพิ่ม schema แล้ว ### Expedition Battle (16 messages) ข้อมูลแผนที่ เส้นทาง ทีม เริ่มต่อสู้ และสรุปผลของ Expedition Battle. - `ExpeditionBattleAvatarDamage` — เพิ่ม schema แล้ว - `ExpeditionBattleAvatarInfo` — เพิ่ม schema แล้ว - `ExpeditionBattleEndScNotify` — เพิ่ม schema แล้ว - `ExpeditionBattleFunRecord` — เพิ่ม schema แล้ว - `ExpeditionBattleLevelRecord` — เพิ่ม schema แล้ว - `ExpeditionBattleLineup` — เพิ่ม schema แล้ว - `ExpeditionBattleMapData` — เพิ่ม schema แล้ว - `ExpeditionBattleRouteRecord` — เพิ่ม schema แล้ว - `ExpeditionBattleRouteSettleInfo` — เพิ่ม schema แล้ว - `ExpeditionBattleSetLineupCsReq` — เพิ่ม schema แล้ว - `ExpeditionBattleSetLineupScRsp` — เพิ่ม schema แล้ว - `ExpeditionBattleSettleScNotify` — เพิ่ม schema แล้ว - `ExpeditionBattleStartCsReq` — เพิ่ม schema แล้ว - `ExpeditionBattleStartScRsp` — เพิ่ม schema แล้ว - `GetExpeditionBattleDataCsReq` — เพิ่ม schema แล้ว - `GetExpeditionBattleDataScRsp` — เพิ่ม schema แล้ว ### Blind Box (7 messages) อ่าน/เปิด/รีเซ็ตตำแหน่งกล่อง และการแจ้งการแลกเปลี่ยน. - `BlindBoxGetDataCsReq` — มี schema เดิมใน `StarRail.proto` - `BlindBoxGetDataScRsp` — มี schema เดิมใน `StarRail.proto` - `BlindBoxOpenBoxCsReq` — มี schema เดิมใน `StarRail.proto` - `BlindBoxOpenBoxScRsp` — มี schema เดิมใน `StarRail.proto` - `BlindBoxResetPoolPositionCsReq` — เพิ่ม schema แล้ว - `BlindBoxResetPoolPositionScRsp` — เพิ่ม schema แล้ว - `BlindBoxTradeChangeScNotify` — มี schema เดิมใน `StarRail.proto` ### Badge (2 messages) ข้อมูลและการแจ้งเปลี่ยน Badge. - `BadgeInfoScNotify` — มี schema เดิมใน `StarRail.proto` - `GetBadgeInfoScRsp` — มี schema เดิมใน `StarRail.proto` ### Social Play (15 messages) ข้อมูลห้อง เจ้าของห้อง ผู้เยี่ยมชม แชต การเคลื่อนไหว และ operation ในห้อง. - `SocialPlayGameplayOperationScNotify` — มี schema เดิมใน `StarRail.proto` - `SocialPlayGetDataCsReq` — มี schema เดิมใน `StarRail.proto` - `SocialPlayGetDataScRsp` — มี schema เดิมใน `StarRail.proto` - `SocialPlayGetOnlineRoomDataCsReq` — มี schema เดิมใน `StarRail.proto` - `SocialPlayGetOnlineRoomDataScRsp` — มี schema เดิมใน `StarRail.proto` - `SocialPlayGetOwnerRoomDataCsReq` — มี schema เดิมใน `StarRail.proto` - `SocialPlayGetOwnerRoomDataScRsp` — มี schema เดิมใน `StarRail.proto` - `SocialPlayPreCheckEnterRoomCsReq` — เพิ่ม schema แล้ว - `SocialPlayPreCheckEnterRoomScRsp` — มี schema เดิมใน `StarRail.proto` - `SocialPlayQueryRecentVisitorsCsReq` — มี schema เดิมใน `StarRail.proto` - `SocialPlayQueryRecentVisitorsScRsp` — มี schema เดิมใน `StarRail.proto` - `SocialPlayRoomPlayerMoveScNotify` — มี schema เดิมใน `StarRail.proto` - `SocialPlaySettingInfoScNotify` — มี schema เดิมใน `StarRail.proto` - `SocialPlayTalkCsReq` — มี schema เดิมใน `StarRail.proto` - `SocialPlayTalkScRsp` — มี schema เดิมใน `StarRail.proto` ### Pet Marble (6 messages) ข้อมูลเกม Pet Marble, trial และเริ่ม/ซิงก์ด่าน. - `PetMarbleGetCycleTrialPetsCsReq` — มี schema เดิมใน `StarRail.proto` - `PetMarbleGetCycleTrialPetsScRsp` — มี schema เดิมใน `StarRail.proto` - `PetMarbleGetDataCsReq` — มี schema เดิมใน `StarRail.proto` - `PetMarbleGetDataScRsp` — มี schema เดิมใน `StarRail.proto` - `PetMarbleLevelBeginScRsp` — มี schema เดิมใน `StarRail.proto` - `PetMarbleSyncDataScNotify` — มี schema เดิมใน `StarRail.proto` ### Pet Park (2 messages) คำขอปรับแต่ง Pet Park. - `PetParkDiyCsReq` — มี schema เดิมใน `StarRail.proto` - `PetParkDiyScRsp` — มี schema เดิมใน `StarRail.proto` ### Finality Battle (2 messages) คำขอเริ่มด่านต่อสู้ Finality และผลตอบกลับ. - `StartFinalityBattleLevelCsReq` — มี schema เดิมใน `StarRail.proto` - `StartFinalityBattleLevelScRsp` — มี schema เดิมใน `StarRail.proto` ### Voracity Invasion (3 messages) อ่านข้อมูลและรับ notification ของ Voracity Invasion. - `GetVoracityInvasionDataScRsp` — มี schema เดิมใน `StarRail.proto` - `VoracityInvasionChangeScNotify` — มี schema เดิมใน `StarRail.proto` - `VoracityInvasionGetDataCsReq` — เพิ่ม schema แล้ว ### Private Order (2 messages) คำขอประกาศ private order และผลตอบกลับ. - `PublishPrivateOrderCsReq` — มี schema เดิมใน `StarRail.proto` - `PublishPrivateOrderRsp` — มี schema เดิมใน `StarRail.proto` ### Enum ที่เพิ่ม - `GGLMGBPOCOP`: ค่า `GGLMGBPOCOP_BMKFIMEJPOM=0`, `GGLMGBPOCOP_MLOGJAKGHHD=1`, `GGLMGBPOCOP_ILMKHLENPNI=2`; ชื่อสมาชิกยัง obfuscated จึงยังบอกความหมายเชิงเกมไม่ได้ ## ข้อความที่ยัง obfuscated เหลือ 111 message ที่ชื่อเป็นรหัส ไม่มีชื่อ feature ที่ยืนยันได้ใน schema จึงไม่ตั้งชื่อความหมายเอง รายการด้านล่างบอกเฉพาะโครงสร้างและชนิดที่ message อื่นอ้างถึง: - `AAOAEMOHCEP` — fields: OHMBEPHEBDJ:uint32#2, progress:uint32#8; ถูกอ้างจาก: `FOEPMKFEJMK` - `ABGMGHNOONM` — fields: ไม่มี field; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `ADDMKOIFOEF` — fields: ไม่มี field; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `AFAIGBNOCJB` — fields: info:FOEPMKFEJMK#12; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `AFKFJCPELEM` — fields: NGPBPFKGNLI:uint32#4, retcode:uint32#11; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `AHBLKPAJDPI` — fields: CHILKFNAINA:uint32#13, LBMGKCMHKLN:uint32#14, HEMOHFJJMJG:uint32#15; ถูกอ้างจาก: `BlindBoxOpenBoxCsReq` - `ALAMOHABJIP` — fields: ILBFMJKABFO:uint32#4, JPPMEKJGJFD:uint32#10, LLNNOPDLLED:uint32#11, GNFDFIIKJHI:uint32#14; ถูกอ้างจาก: `HPJONNDENCB`, `PPFAMGCOOFP` - `AOBDHCFGGBH` — fields: design_level:uint32#3, DLDELBKOMDK:uint32#4, retcode:uint32#7, AFMDPIAFPNF:uint32#8, EIFICNFGGHI:uint32#9, LAOPAGMAAHD:uint32#11, OOIMHIJFHDI:uint32#12, PDNHGNDAHBA:uint32#14, FDGKBOIEHBD:uint32#15; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `BACPIBIJPPH` — fields: retcode:uint32#13; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `BDOBLDOOICE` — fields: EPENKGKBOAP:uint32#7, end_time:int64#8; ถูกอ้างจาก: `PetMarbleGetCycleTrialPetsScRsp` - `BHJEBMOOJED` — fields: KJPFENPNFBP:ItemList#12; ถูกอ้างจาก: `BlindBoxOpenBoxScRsp` - `BMJHNDBOPLC` — fields: ไม่มี field; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `BNKDEHGIJMH` — fields: LLCHGCNFOJJ:JCAHAPMBCOC#15, IKMADODLNJD:PACMGHKKGKN#2, EPLGOGFAHDM:ONJIANLPDBE#9, PPNNPIGCHOL:FJEMMEGKKHE#11; ถูกอ้างจาก: `HMLFGDFLIBP` - `BODEMOLDHAA` — fields: teleport_id:uint32#10; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `BPMFHIHNEHH` — fields: ENGHMIAMPLG:ItemList#9, retcode:uint32#12, info:FOEPMKFEJMK#13; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `CCLIGKFAHJI` — fields: ไม่มี field; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `CDLFFHOHAIH` — fields: FIEOPKNBHKJ:uint64#15; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `CEAPCHBBOFN` — fields: MBIAIMKHNDB:bool#2, uid:uint32#11; ถูกอ้างจาก: `MIECIEKKIMJ` - `CHNMJPLALEC` — fields: retcode:uint32#3, MJNENEAAOAE:uint64#5; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `CJIFMPGCOOC` — fields: AALLJKILLKM:DLDPJEILCDB#13; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `COPLCPBANMD` — fields: FODBOPBEALE:PDFEPMMIKDF#13; ถูกอ้างจาก: `PetMarbleGetDataScRsp`, `PetMarbleSyncDataScNotify` - `CPCHHBHCGOO` — fields: ไม่มี field; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `DCNIDBKPPCK` — fields: IKJOGIDIBPK:uint64#1, retcode:uint32#6, order_list:NMEGIPHFFDA#9; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `DJIHNCHDFED` — fields: retcode:uint32#5; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `DLDPJEILCDB` — fields: HJAMPKPCKEB:string#1, KMGONPNDONA:string#2, DHPIFLNBLNM:string#3, ACLHGDDNNLK:string#4, CAGPHEEGOAC:string#5, DNDHBFOKAEA:string#6, ACMLHNNMBBN:string#7, FFCDKLBFKJM:string#8, DALMLLPIFNP:string#9, EFGMHCEIJGO:string#10, PFDNBIDFDMH:string#11, BLBAIBEBIAL:string#12, KNAKEKLCFDH:string#13, GECJPIMLHIM:string#14, JHKJKKGLAHE:string#15, GOOLPABLPBF:string#1297, LOKOLODKAAM:string#1369; ถูกอ้างจาก: `CJIFMPGCOOC` - `DNHFLGJJKHN` — fields: order_list:NMEGIPHFFDA#10, IKJOGIDIBPK:uint64#11; ถูกอ้างจาก: `OIJOHMLIEII` - `DPOGMNFCMNN` — fields: order_list:NMEGIPHFFDA#5, retcode:uint32#7; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `EBGAMBKHDBO` — fields: IAJHCHOJHNN:uint32#14, type:uint32#3, NLIHHAKFEDB:bool#607, GGBGEJIIKFN:BEGIDCPIPBG.MDNMHBPMJFD#155; ถูกอ้างจาก: `GetVoracityInvasionDataScRsp` - `ELNAIJEFGMK` — fields: NMELIDCDKAK:uint32#5; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `FAKNKCAOHON` — fields: FIEOPKNBHKJ:uint64#14; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `FDCJIIKHHHB` — fields: retcode:uint32#10; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `FGLAJHMCJLL` — fields: expire_time:int64#10, EIKLMFPMJJD:uint32#12; ถูกอ้างจาก: `JEGMGPOFHGG` - `FIJJHJADLLM` — fields: retcode:uint32#5, DODHMIDBNHC:NPLMMCGAJDF#10; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `FJEMMEGKKHE` — fields: KIEBAPFGCCN:uint32#7; ถูกอ้างจาก: `BNKDEHGIJMH` - `FJKEGMEPLDI` — fields: CPPBNJLABGE:HKHKEMHCHEB#8; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `FKPKLHICPFO` — fields: LENMCGCGBOA:uint32#7, retcode:uint32#14; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `FMOEINGLFGG` — fields: FLKIEILIBJA:PGLBKDELHJK#4, OGOCOFPHIIK:FODAGGODIJM#1; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `FODAGGODIJM` — fields: FLBOPEJIGJF:uint32#5, DGONPFLCOMO:uint32#7; ถูกอ้างจาก: `FMOEINGLFGG` - `FOEPMKFEJMK` — fields: LNLDJDODOIL:uint32#5, available_count:uint32#7, CLGMOPPOGGC:uint32#8, OMNDNGDEEGL:AAOAEMOHCEP#11; ถูกอ้างจาก: `AFAIGBNOCJB`, `BPMFHIHNEHH`, `OMEAEOLPGGM` - `GNBOBLNFEHI` — fields: FIEOPKNBHKJ:uint64#9; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `HAHEOGIBNHL` — fields: MJNENEAAOAE:uint64#10, retcode:uint32#11; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `HAIFIDAHGJG` — fields: JIPPNPILKDJ:HHCNMGNAIBG#14; ถูกอ้างจาก: `SocialPlayGetDataScRsp` - `HFHGPMCHDGL` — fields: BHBJFFMACFD:uint32#1, OLGCOBHGDCD:HIMPJFMPEPA#2; ถูกอ้างจาก: `HHCNMGNAIBG` - `HHCNMGNAIBG` — fields: DANNIDIPFAL:HFHGPMCHDGL#1; ถูกอ้างจาก: `HAIFIDAHGJG`, `LLKIFBFCMLK`, `PetParkDiyScRsp`, `SocialPlayGameplayOperationScNotify` - `HHJLCGGEHPB` — fields: PLPPPCEPBDO:uint32#1, KFACPOBAAGM:int64#7, CILGIDDHODG:PlayerSimpleInfo#14; ถูกอ้างจาก: `SocialPlayQueryRecentVisitorsScRsp` - `HKHKEMHCHEB` — fields: NECCJMBJNEN:uint32#4, HECCOBFBJFI:uint32#5; ถูกอ้างจาก: `FJKEGMEPLDI` - `HLJINHODOPP` — fields: order_list:NMEGIPHFFDA#3, retcode:uint32#6; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `HMACEHDGGHB` — fields: BJPHDKEBOBK:IKAHKMNCFDN#1, HBKEPFKDAMI:uint32#2, CMHKFNFKGOI:int64#3; ถูกอ้างจาก: `SocialPlayGameplayOperationScNotify` - `HMLFGDFLIBP` — fields: DGNGMJMPFGK:BNKDEHGIJMH#8; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `HPJONNDENCB` — fields: EEFLBHGIAAN:ALAMOHABJIP#4, OFNDFACDNOC:uint32#11; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `IAKKHBENIOL` — fields: retcode:uint32#9; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `IFEEMEAJMEJ` — fields: ODNGMIJLKKA:uint32#1, ENGJIMIHCHJ:PFNJCDINMLA#2, EGECDHIHFHF:OELLEKNNEMK#3; ถูกอ้างจาก: `JBJNJPAOCDA` - `IKBDJLNEPBH` — fields: HFLOPHNBKGN:PEEEEGAPCOK#1; ถูกอ้างจาก: `SocialPlayGameplayOperationScNotify` - `ILBLJAFMBBK` — fields: FIEOPKNBHKJ:uint64#6; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `IMDEBPDKCAJ` — fields: MJNENEAAOAE:uint64#5, retcode:uint32#8; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `IOPNJIOPAFI` — fields: filter:MMBIBKFEFNG#13, ADPEKIOPFKG:GGLMGBPOCOP#15; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `JBJNJPAOCDA` — fields: uid:uint32#1, OJPDDAOJJKC:bool#2, NJDCPMENIFG:JOLAHHGIFHA#3, AIMNJIMDIKM:int64#4, AJIPBLCIONL:PlayerSimpleInfo#5, DCFKJCMODKJ:IFEEMEAJMEJ#6, LHLKJIDFLIN:CBPDACMBHGL#7; ถูกอ้างจาก: `POBLGKIGINE`, `SocialPlayGameplayOperationScNotify`, `SocialPlayGetDataScRsp` - `JCAHAPMBCOC` — fields: EJHKAHEGCDC:uint32#8; ถูกอ้างจาก: `BNKDEHGIJMH` - `JCIPKHCJLBM` — fields: retcode:uint32#11; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `JDNHIMDLIHH` — fields: ไม่มี field; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `JEGMGPOFHGG` — fields: CPMCCCODGAB:FGLAJHMCJLL#3; ถูกอ้างจาก: `BadgeInfoScNotify`, `GetBadgeInfoScRsp` - `JGAMELLGLGE` — fields: NJDCPMENIFG:JOLAHHGIFHA#7; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `JKILAALMFIB` — fields: retcode:uint32#7; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `JLMKPMCDOKC` — fields: CLGMOPPOGGC:uint32#13; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `JNDBILOGFAF` — fields: FBDIGGDLDCP:MNGADDFICJF#1, FLBOPEJIGJF:uint32#10; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `JOLAHHGIFHA` — fields: pos:Vector#1, rot:Vector#2, ICNANKMDJIC:float#3, GHMKFMBDKNE:Vector#4, GHEMGLKGKLC:float#5, FPHBEHJJBIA:uint32#6, MGIOLDGHPMA:bool#7, time_stamp:int64#8; ถูกอ้างจาก: `JBJNJPAOCDA`, `JGAMELLGLGE`, `MHNNEFBOPIE` - `JPAOIPLDKHB` — fields: BJPHDKEBOBK:IKAHKMNCFDN#1, NLJBJMDPBGN:BFAKMCIJFCB#2, DBIKJPDBMOE:int64#3, CMHKFNFKGOI:int64#4, HBKEPFKDAMI:uint32#5, GAEKEFEKCBD:uint32#6; ถูกอ้างจาก: `PBMDEBCGNMD` - `JPPCNOGIMFD` — fields: DHAKONBPFMC:uint32#7; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `KKACLNNMMAM` — fields: EIHOECKBDOH:uint32#7, BPAOGJPLENJ:uint32#14, JMAODNEONPF:bool#15; ถูกอ้างจาก: `KPBCIIFIAGI` - `KPBCIIFIAGI` — fields: CMHKFNFKGOI:int64#1, KABGCGENKLK:CGLJLBDFNBK#2, NIELDCLPOLA:JOFHMCJPBCE#4, BJPHDKEBOBK:IKAHKMNCFDN#5, NLJBJMDPBGN:BFAKMCIJFCB#6, CEMFBJPOLNP:PJFIMFJPMCN#7, NAIFOMCLGLN:ONAADAJBLEB#8, JIELLGELABA:KKACLNNMMAM#9, KBEGMPBAJIL:uint32#11; ถูกอ้างจาก: `SocialPlayGetDataScRsp` - `LLKIFBFCMLK` — fields: JIPPNPILKDJ:HHCNMGNAIBG#1; ถูกอ้างจาก: `POBLGKIGINE` - `LMOILOPJKCB` — fields: retcode:uint32#2; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `LNAAACICHPG` — fields: pet_id:uint32#1, NDMHOKEGOAP:uint32#11, ONMDDKGCEHK:uint64#13; ถูกอ้างจาก: `NMEGIPHFFDA` - `LPJFNJAJIGM` — fields: FIEOPKNBHKJ:uint64#13, ONMDDKGCEHK:uint64#15; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `MENCBJMOEML` — fields: FIEOPKNBHKJ:uint64#12; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `MFCCCIMGMFL` — fields: pool_id:uint32#1, POONFMJAFDH:uint32#3, end_time:int64#7, GOJBGCEEEHK:string#11, JPLIJJFCAOO:int64#14; ถูกอ้างจาก: `BlindBoxGetDataScRsp` - `MGFJDLIBABO` — fields: JPPKLEIPKAN:BattleEndStatus#6, PLAPNCJJAOP:NPLMMCGAJDF#11, ELHJAMKKKLH:bool#12; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `MHNNEFBOPIE` — fields: op_uid:uint32#1, JENKGODEIOM:JOLAHHGIFHA#2; ถูกอ้างจาก: `SocialPlayRoomPlayerMoveScNotify` - `MIECIEKKIMJ` — fields: retcode:uint32#2, CAFBDEDFBOL:CEAPCHBBOFN#3; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `MIKGMGBHLEN` — fields: message_text:string#1, extra_id:uint32#2; ถูกอ้างจาก: `SocialPlayGameplayOperationScNotify`, `SocialPlayTalkCsReq`, `SocialPlayTalkScRsp` - `MKGODFLGEAM` — fields: level:uint32#2, LLKGDLAFODJ:string#5, head_icon:uint32#6, AGABADPIGGK:bool#8, uid:uint32#15; ถูกอ้างจาก: `NMEGIPHFFDA` - `MLNNHJKKMNC` — fields: ไม่มี field; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `MMBIBKFEFNG` — fields: FMHBALCGMFF:bool#3, PODLFMBEKEG:uint32#9; ถูกอ้างจาก: `IOPNJIOPAFI` - `MNGADDFICJF` — fields: ENPNDBIBPLE:uint32#1, PANMEBACIBF:bool#2, rotation:uint32#3, x:uint32#8, y:uint32#11; ถูกอ้างจาก: `JNDBILOGFAF`, `NPMOBJOCIAF`, `PGLBKDELHJK` - `MNGELOJBJGC` — fields: retcode:uint32#7, FMACGJBHLPF:uint32#10, order_list:NMEGIPHFFDA#15; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `MNLLCNFNKKP` — fields: IMGDMDDKHDL:uint32#1, LALKFADHJJL:uint32#5, FMCCHBBIJKF:ODLEEMAALIP#6, GBJEALNCMJC:uint32#7, HCMKEFPFEDH:bool#8, IIIAGPNGPJM:ODLEEMAALIP#9, mode:uint32#12, OFNINJLHHDE:ODLEEMAALIP#15; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `NLBAOLFBEGB` — fields: retcode:uint32#3, LLLOIIKOCEN:PPELMHMMCHP#8; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `NMEGIPHFFDA` — fields: AMGLECMANAH:LNAAACICHPG#1, LFOIKMFLNKJ:PEHEBABHPBH#2, EFKJFADLLIA:MKGODFLGEAM#6, FIEOPKNBHKJ:uint64#7, expire_time:uint64#8, NDHBAFMMFBC:OHAPBJANBDE#10, KDBMGCMEOFL:uint64#11, DCKKGALHFNO:uint64#12, DAMCKNHKDOA:LNAAACICHPG#13, DFAACJDIFBL:MKGODFLGEAM#15; ถูกอ้างจาก: `DCNIDBKPPCK`, `DNHFLGJJKHN`, `DPOGMNFCMNN`, `HLJINHODOPP`, `MNGELOJBJGC` - `NPLMMCGAJDF` — fields: DFFPHJJIHFJ:uint32#2, LAPLGJOBGAN:uint32#4, remaining_round:uint32#12, level_id:uint32#14; ถูกอ้างจาก: `FIJJHJADLLM`, `MGFJDLIBABO` - `NPMOBJOCIAF` — fields: DGONPFLCOMO:uint32#11, FBDIGGDLDCP:MNGADDFICJF#15; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `OAOONIMHKLA` — fields: retcode:uint32#1; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `ODHFCEALPFN` — fields: IIIAGPNGPJM:ODLEEMAALIP#1, JJPLIMAENEB:uint32#3, JNBIALMKFCL:uint32#5, FMCCHBBIJKF:ODLEEMAALIP#7, OFNINJLHHDE:ODLEEMAALIP#9, LLMLOGNFFCD:bool#10, mode:uint32#13; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `ODLEEMAALIP` — fields: AOLIEDBCNBN:uint32#1, hp:sint32#4, KNDIIBJEIDG:uint32#6, NDMHOKEGOAP:uint32#7, OLANKLPCBEG:uint32#9, atk:uint32#10, AGKNBANFLIB:KVP#11, MDKFLGDEJCN:uint32#12; ถูกอ้างจาก: `MNLLCNFNKKP`, `ODHFCEALPFN` - `OELLEKNNEMK` — fields: OLGCOBHGDCD:HIMPJFMPEPA#1, CGBJOAJEMKN:uint32#2; ถูกอ้างจาก: `IFEEMEAJMEJ` - `OIJOHMLIEII` — fields: EPHIIBNCCJG:DNHFLGJJKHN#15; ถูกอ้างจาก: `BlindBoxTradeChangeScNotify` - `OKCAJHKCJDE` — fields: JDFJJOKDIKC:uint32#2, OBLOEMJOFEE:uint32#4, AFFLDMFBGEH:uint64#13; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `OMEAEOLPGGM` — fields: HNFFFDEGOEB:FOEPMKFEJMK#8, retcode:uint32#13; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `ONAADAJBLEB` — fields: DBIKJPDBMOE:int64#11, ONOHPMDGNNH:uint32#14; ถูกอ้างจาก: `KPBCIIFIAGI` - `ONJIANLPDBE` — fields: LEJEBBCKPCI:uint32#9; ถูกอ้างจาก: `BNKDEHGIJMH` - `PACMGHKKGKN` — fields: IEOAHLNBBBB:uint32#13; ถูกอ้างจาก: `BNKDEHGIJMH` - `PBMDEBCGNMD` — fields: IKJNIKIGFLF:MNCBEDBDDHL#1, PKHFMJDNKOE:JPAOIPLDKHB#2, KABGCGENKLK:CGLJLBDFNBK#4; ถูกอ้างจาก: `POBLGKIGINE` - `PDFEPMMIKDF` — fields: KOMOGINENAC:uint32#1, AIJPKJICFDJ:uint32#6, mode:uint32#8; ถูกอ้างจาก: `COPLCPBANMD` - `PEEEEGAPCOK` — fields: PLPPPCEPBDO:uint32#1, op_uid:uint32#2, OOCPKIGPEHP:uint32#3, CMIEOOODDIA:int64#4, AALDPOAKJBK:string#5; ถูกอ้างจาก: `IKBDJLNEPBH` - `PEMMJHDFOLM` — fields: ไม่มี field; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `PGLBKDELHJK` — fields: FLBOPEJIGJF:uint32#1, status:uint32#5, DGONPFLCOMO:uint32#7, FBDIGGDLDCP:MNGADDFICJF#9; ถูกอ้างจาก: `FMOEINGLFGG` - `PHIMNIFMBMI` — fields: MJNENEAAOAE:uint64#2, retcode:uint32#14; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `PMBMFHMKBNC` — fields: retcode:uint32#4; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `POBLGKIGINE` — fields: room_owner_uid:uint32#1, player_info:JBJNJPAOCDA#2, DLKOEIANIMK:uint32#3, LNMGOFCOMED:PBMDEBCGNMD#100, MAGDHGMLLKG:LLKIFBFCMLK#101; ถูกอ้างจาก: `SocialPlayGameplayOperationScNotify`, `SocialPlayGetOnlineRoomDataScRsp`, `SocialPlayGetOwnerRoomDataScRsp` - `PPELMHMMCHP` — fields: KLOJONBEJKJ:uint32#1, ONMDDKGCEHK:uint64#4; ถูกอ้างจาก: `NLBAOLFBEGB` - `PPFAMGCOOFP` — fields: GALBOLNODBB:uint32#1, LENMCGCGBOA:uint32#2, EEFLBHGIAAN:ALAMOHABJIP#3, NGPBPFKGNLI:uint32#4, IEOAHLNBBBB:uint32#5, EJHKAHEGCDC:uint32#6, LEJEBBCKPCI:uint32#8, design_level:uint32#9, OOIMHIJFHDI:uint32#10, DEJOLCEPDCF:uint32#11, retcode:uint32#12, OFNDFACDNOC:uint32#13, KIEBAPFGCCN:uint32#14, LAOPAGMAAHD:uint32#15; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ - `PPOPABLIHNI` — fields: count:uint32#10, offset:uint32#14; ถูกอ้างจาก: ไม่มีการอ้างถึงจาก message ในไฟล์นี้ ## ข้อจำกัดก่อนใช้ทำ handler - การมี Go message type ไม่ได้แปลว่ามี CmdID, request/response pairing หรือ handler แล้ว - ใช้ `protocol/proto/cmdid.go`/ตารางที่อ้าง revision ตรงกันเท่านั้น; ถ้าชื่อยัง obfuscated ให้บันทึกความไม่แน่นอนแทนการเดา - schema ที่เพิ่มครั้งนี้เป็นการเติม definitions ที่ไม่มีใน `StarRail.proto` เท่านั้น ไม่ได้ยืนยันว่า Client รุ่นใดส่ง message เหล่านี้หรือว่า feature เล่นได้ครบ