package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // 音乐 / 演出线三条玩法的服务端闭环 —— 2026-10-04: // // 1. Livehouse 音游(节奏打击,引擎 MusicGameManager.lua) // 2. PartyDance 舞池(同一套音游引擎,LivehouseConfig.Use == Party 那 5 首) // 3. PartyLive 派对直播(点赞 / 礼物 / 弹幕,PartyLiveStreamPanelStore.lua) // // // ★★ 接之前这三条线全套落在空包兜底里(DefaultReturnCatalog4229938.cs): // 63885626 → [0xFF,0x01] list7-empty、63848409 → [0xFF,0x00] ReadBoolean、 // 其余 shape="void"。症状不是报错,而是静默没内容: // · 曲目列表恒空 ⇒ 面板上的等级打点永远是 0,重进清零; // · FirstPlay 恒 false ⇒ 首次引导 timeline 永远不播; // · 舞会三连里 AskStartPartyDance 的 Callback 什么都不做,客户端在等 // SyncPartyDanceStart 推送 ⇒ 不推 = 点了没反应; // · 直播间 UI 自己不发 RPC,数据全靠 SyncPartyResponse(68456156) ⇒ 从不推 = 空直播间。 // // // ⛑ 硬规则 239 —— 每个契约都对照客户端自己的反序列化器核过,不是照 dump.cs 猜: // Drmk.Proxy\proxy\lua\RPCDeserializeAuto.lua 的 Auto.Reader[571] / // [568] / [428] / [429] / [1123], // 参数形状对照 _lua_all\lua\LuaGen\AutoGen\ClientToGameDelegate.lua 的 *_Serializer。 // // ⛑ 回滚:从 GameRouter.cs 的 Enabled4229938MethodIds 里删掉对应行即可 // (handler 不注册 = 回到中性兜底),本文件留着无害。 // // --------------------------------------------------------------------------------------- // 1. Livehouse 音游 // // 客户端整条链(逐行核过,非推断): // 进 Sonic Boom(IndoorId 5) / 万能旋钮(274) 的室内扇区 → 选曲面板 // LivehouseSelectPanelStore.lua:291 OnPlayBtn // · LivehouseConfig.DialogBeforeTimelineSingle 命中 ⇒ 先播对话,DialogEnd 再进 // · 否则直接 PlayLiveHouseV2 // MusicGameManager.PlayLiveHouseV2(:324) → StartGame(:371) // → CheckShow(LIVEHOUSE_GAME_PANEL) + PlayGameMainTimeline(:564) // → 未显式跳过 intro 时先 AskQueryLiveHouseInfo():FirstPlay 为真才播 intro timeline // → LiveHouseMusicStart(musicId, inviteNpcId, difficulty) ← NOTIFY // → 打完 SetLiveHouseMusicResult(musicId, {P,G,M,S,percent}, inviteNpcId) ← INVOKE // → SetRecordMusicInfo + PlayLivehouseEndTimeline(Good / BadEnding 对话) // 开局前勾了「金手指」⇒ 先 AskLiveHouseUseItem(musicId) 再 StartGame。 // --------------------------------------------------------------------------------------- // 取登录后才能拿到的 WorldEntryState;还没建好就是 null(按新账号处理)。 func GameRouter_LiveHouse_LivehouseState(ctx context.Context, msg any) any { // Router implementation for GameRouter_LiveHouse_LivehouseState var zero any; return zero } // AskQueryLiveHouseInfo (63848409) — Invoke ; 无参 ; return: Complex{ bool FirstPlay } // // 「要不要播首次引导」的唯一判据。第一次答 true,之后恒 false,由 // LivehouseProgressStore 把这个 latch 落进 config/player-progress.json。 func GameRouter_LiveHouse_AskQueryLiveHouseInfo4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_AskQueryLiveHouseInfo4229938 var zero any; return zero } // AskLiveHouseMusicList (63885626) — Invoke ; 无参 ; return: List7Bit // // 客户端把整张表灌进 gMusicGameManager.RecordMusicInfo,之后 GetScoreLevel 才显示 // 非最低档评级。空列表客户端不报错,只是等级打点全 0 —— 别指望有日志线索。 func GameRouter_LiveHouse_AskLiveHouseMusicList4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_AskLiveHouseMusicList4229938 var zero any; return zero } // SetLiveHouseMusicResult (63723141) — Invoke ; args: u32 musicId, list7bit counts, u32 npcId // // 唯一的成绩写入路径。客户端实际给 5 项 {Perfect, Great, Miss, Special, floor(percent)} // (MusicGameManager.lua:264-270),我们只需要前 4 项。 func GameRouter_LiveHouse_SetLiveHouseMusicResult4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_SetLiveHouseMusicResult4229938 var zero any; return zero } // LiveHouseMusicStart (63293678) — Notify ; args: u32 musicId, u32 npcId, u32 difficulty // LiveHouseMusicInterrupt (63752208)— Notify ; args: u32 musicId, u32 npcId // // 两条都只是「服务端知道一下就够了」:客户端既不 await,回调里也没有业务分支。 // 只落日志(将来要做局数统计时这份日志就是现成素材,同硬规则 112 的做法)。 func GameRouter_LiveHouse_LiveHouseMusicNotify4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_LiveHouseMusicNotify4229938 var zero any; return zero } // AskLiveHouseUseItem (63665380) — Invoke ; args: u32 musicId ; return: void // // 「金手指」(强制全 Perfect)的道具消耗请求 —— LivehouseSelectPanelStore.lua:320。 // ⛑ 客户端自己的前置检查才是权威:面板在道具不足时先弹 // MessageConfig.LivehouseGoldFinger 而不会走到这里(:322)。 // ⇒ 服务端再扣一次是双重扣减;这里只放行,扣减交给客户端驱动的道具系统。 func GameRouter_LiveHouse_AskLiveHouseUseItem4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_AskLiveHouseUseItem4229938 var zero any; return zero } func GameRouter_LiveHouse_AskSelectPartyDanceSong4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_AskSelectPartyDanceSong4229938 var zero any; return zero } func GameRouter_LiveHouse_AskSelectPartyDanceMode4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_AskSelectPartyDanceMode4229938 var zero any; return zero } // AskStartPartyDance (63292540) — Invoke ; 无参 ; return: void // // ★ 唯一能让舞会真正开始的推送点。不推 = 面板开得出来、按钮点得动、什么都不会发生。 func GameRouter_LiveHouse_AskStartPartyDance4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_AskStartPartyDance4229938 var zero any; return zero } // AskLeavePartyDance (63516846) — Invoke ; 无参 ; return: void func GameRouter_LiveHouse_AskLeavePartyDance4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_AskLeavePartyDance4229938 var zero any; return zero } // 每个 session 一份直播间账本。没有 session 时返回一个丢弃用的空壳。 func GameRouter_LiveHouse_PartyLiveLedger(ctx context.Context, bag map[string]any) any { // Router implementation for GameRouter_LiveHouse_PartyLiveLedger var zero any; return zero } func GameRouter_LiveHouse_PushPartyLiveAsync(ctx context.Context, conn any, response any, why string) any { // Router implementation for GameRouter_LiveHouse_PushPartyLiveAsync var zero any; return zero } func GameRouter_LiveHouse_PartyLiveSwitch4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_PartyLiveSwitch4229938 var zero any; return zero } func GameRouter_LiveHouse_SendPartyEvent4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_SendPartyEvent4229938 var zero any; return zero } // GmPartyLiveAddEvent (65785804) — Invoke ; args: int32 eventid, string message ; return: void // // ★ GM 通道。官方留它是给自己调试用的;我们拿它做「服务端往直播间塞一条弹幕」。 // 这是三个玩法里最容易现场见效的一处(不用改 GM 面板,GATE Lua / GM delegate 直接发即可)。 func GameRouter_LiveHouse_GmPartyLiveAddEvent4229938(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_LiveHouse_GmPartyLiveAddEvent4229938 var zero any; return zero } // // 读 int32 eventid + string。string 的形状是 ReadString: // 无值写单字节 0x00,有值写 0xFF 后跟 UTF8 裸字节。 // func GameRouter_LiveHouse_ReadInt32AndString(ctx context.Context, body []byte, eventId int32, text string) any { // Router implementation for GameRouter_LiveHouse_ReadInt32AndString var zero any; return zero } // 往「累计送礼表」追加一行。每个元素是一次事件,不去重也不断言 id 范围。 func GameRouter_LiveHouse_AppendRow(ctx context.Context, list []any, id int32) any { // Router implementation for GameRouter_LiveHouse_AppendRow var zero any; return zero } func GameRouter_LiveHouse_U(ctx context.Context, list []any, index int32) uint32 { // Router implementation for GameRouter_LiveHouse_U return 0 }