40 lines
2.0 KiB
Go
40 lines
2.0 KiB
Go
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
|
||
}
|
||
|