package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // 里希(Garm) 之外的另一条「可控非角色原型」:科斯机甲(2026-09-26,移植捐赠端 7k-v0.5 // GameRouter.Kesi.cs)。 // 根因(客户端配置侧,已在本服 ClientData 上复核): // - FightSpiritConfig 15022030 = "特摄战原型-科斯",IsPublish=false / CanJoin=false / // Invisible=true ⇒ 它永远不在 Characters() 花名册里,roster 上点了也不会出现。 // - SceneitemConfig 80003500 = "科斯冲锋枪",WeaponBelong=15022030、 // FixedFightSkill=39010048,且没有 WheelIcon ⇒ 常规军械库过滤器会把它判掉, // 所以它连「随便塞把枪」都做不到,必须走 CombatCatalogRepository 里那份孤立装配。 // - 客户端 CheckIsKesi 拿 cardId 15022030 认机甲(捐赠端注释)。 // 供给链三条,缺一不可: // 1. SyncPlayerAddNewSpirit(64691088) 增量补 SpiritViewData —— 登录包里没有它, // 客户端 SpiritManager.Id_to_Tid 查不到 tid,后面所有和它相关的包都会被静默丢掉; // 2. CombatCatalogRepository 里那份科斯 loadout(slot0 科斯冲锋枪 80003500 + 风格 39010048); // 3. 走本服已在用的 OnSwitchSpirit 做身份移交 —— 不另发明一套切人。 // ⛑ 这是需实机验证的实验入口:捐赠端自己也标注"尚需游戏内验证"。 // 能确认的只有服务端协议侧齐了;模型加载、镜头、机甲技能面板和按键都得进游戏看。 // func GameRouter_Kesi_ControlKesi4229938(ctx context.Context, session *GameSession, enter bool) any { // Router implementation for GameRouter_Kesi_ControlKesi4229938 var zero any; return zero } type KesiControlRuntime4229938 struct { // 与普通角色切换共用一把锁:GM 切机甲和游戏内主动切人不能互相打断, // 否则两份 PlayerInfo/SpiritViewData 会交错下发,客户端 roster 直接错位。 Gate *sync.Mutex `json:"gate"` // 进入机甲前的角色 template;return 时切回它。 ReturnTemplate uint32 `json:"returnTemplate"` // 只有走过 ControlKesi 才允许 OnSwitchSpirit 接受 Kesi 作为目标。 Unlocked bool `json:"unlocked"` }