package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // 把一个已经在场的单位接进客户端原生的随从 AI。 // ⛑⛑ 2026-10-01 取证:这套协议主线服务端一行都没实现过,但客户端侧是全的 —— // 随从的跟随、协战、UI 全由客户端 C# 状态机负责,服务端只需要把两个包推下去。 // 在此之前主线只能把随从当成「不打人的敌人」生成,表现就是挂着血条、打不死、能被玩家锁定。 // 两个包(签名都取自官方 dump.cs 的 IGameSceneToClient 抽象声明,不是猜的): // SyncAgentCompanionAI(ulong pid, bool isCompanionAI) = 68277327 (dump.cs:1900945) // SyncCompanionMaster(ulong companionId, ulong masterId) = 68813982 (dump.cs:1901368) // 为什么不自己写跟随:客户端 lua 里找不到这两个方法名以外的任何实现 // (lua.zip 只有 RPCMethodIdToName 里有名字,实现在 C# 侧),自己驱动等于重新实现一遍 // 官方的行为树 —— 性价比远低于把原生开关打开。 // // // 收起随从头顶的血条:SyncAddUnitState(68026128) + HideHp。 // 与 GameRouter.EnemyHpBar.cs:55 逐字段对齐(Id / State / EffectFreezeState)。 // func GameRouter_CompanionBind_NotifyCompanionHideHpAsync(ctx context.Context, session *GameSession, uid uint64) any { // Router implementation for GameRouter_CompanionBind_NotifyCompanionHideHpAsync var zero any; return zero } // // 把 绑给当前操控的角色。 // // // 由 SpawnAgentAsync 返回的单位 uid。必须已经 spawn 完 —— 客户端消费方会用 // masterId / agentId 去 SceneDataMgr 里查单位,spawn 包没落地就查不到。 // func GameRouter_CompanionBind_BindCompanionAsync(ctx context.Context, companionUid uint64) any { // Router implementation for GameRouter_CompanionBind_BindCompanionAsync var zero any; return zero }