package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // 牛奶车(gadget 版)交互的服务端那一半。 // 背景(2026-10-01 实机):用 debugPlace 探针把 T_MilkCar(pathId 331844513) / // T_Milk_Drive_mcTemp(530867541) 摆到玩家面前 6 m 后,客户端给出四个交互点: // 车侧面=调查日报 / 联系联络员 / 道具制作,车尾=回血。 // 抓包结论: // - 车尾「回血」客户端会发 AskDrinkMilk(67579042, 0x04072CA2),body 8 字节 // = gadget uniqueId(实测 0x5000000000000001,与 debugPlace 的 Seq 逐位吻合)。 // - 侧面三个里「调查日报 / 道具制作」客户端一个 RPC 都不发 ⇒ 纯客户端本地演出, // 服务端无从介入(调查日报点下去还会卡在读取演出界面,属客户端 bug,重连即可解除)。 // - 「联系联络员」走的是通用对话线 AskStartDialog(63754798),已在 // GameRouter.Dialog.cs 里回 0u,不需要在这里重复。 // 所以本文件只做一件事:接住 AskDrinkMilk 并把血回满。 // 回法沿用 GameAdminBridge.RestorePlayerHealthAsync 的既定顺序(硬规则 52): // 先属性表(SyncUnitAttrs,带 MaxHp 分母)再绝对值(SyncUnitHp);同时把 // state.PlayerHp 这本账一起改掉,否则下一次受击会从旧值结算、立刻又把人打死。 // ⛑ 回滚:把 GameRouter.cs 白名单里的 MethodId.AskDrinkMilk 那一行删掉即可 // (handler 不注册 ⇒ 回落到 typed-default 兜底,点回血只剩演出、不回血)。 // // // `IGameSceneToClient.AskDrinkMilk(ulong instanceId)` — 67579042 (0x04072CA2, dump.cs:1730509)。 // 返回 `UXRPCTask`(void)⇒ 回空 OK。请求体实测 8 字节 = 牛奶车 gadget 的 uniqueId。 // ⛑⛑ 必须先回包再推血:客户端 await 的是这个 void,先推血会让回包晚一拍。 // func GameRouter_MilkCar_AskDrinkMilk(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MilkCar_AskDrinkMilk var zero any; return zero }