package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // 梅卡妮卡(Mechanika,spirit 15021017)的召唤能力 —— 机械羊。 // 2026-09-27 17:2x 定稿(用户拍板): // · 一次 E 在玩家左前 / 右前 / 背后各放一只(默认 3 只,旋钮可调)。 // · 取消 10 米判定:不再有"范围内已有羊就走念力"这条,想召就召。 // · 取消数量上限:不再有 hard cap(旋钮 mechanikaSheepMaxAlive,0 = 不限制)。 // · 羊不会移动 —— 这是客户端结构决定的,不是 bug: // 模板 40120651 的 AI 40213004 行为树是 Behavior_EmptyBehavior(字面"无战斗AI"), // 服务端推的 SyncEnemyBattleMoveTowardUnit 全被忽略(实机 150+ 条,坐标 3 分钟零变化; // 客户端 AskUnitMoveActionSimple 仍在正常上报这只羊,说明它在场只是不动)。 // 带真树(MeikaShip)的羊模板模型是透明的,客户端里也没有这棵树 ⇒ 换模板救不了。 // ⇒ 跟随/移动相关代码已整块删除,羊就是定点召唤物。 // 取证(2026-09-27 读 DRMK-PS_09_7k-v0.5 + 客户端配置表): // · SkillConfig 51937722「梅卡定制召唤羊」SkillCastTypeTag=2。 // · SkillJumpConfig 97011851:return !IsHaveEnemyByDistance(40980002, 10); → 跳到 51937722; // 另一条 97011078return true → 跳到 51934941。 // ⛑⛑ 但这两个是 tag=2,不是可释放的根技能,且没有任何 jump 指向它们、 // 也没有 FightSkillConfig 行把 15021017 写进 SpiritId ⇒ // 这版客户端里梅卡妮卡的羊没有任何原生 E 入口(捐赠端的 E 绑定是他自己加的)。 // 现做法:借 51939201(tag=6 的空壳占位技能)当 E 的壳子,服务端接住后召羊。 // 详见 GameplaySettings.MechanikaSheepActiveSkillId 与硬规则 201。 // 模板:AgentConfig 40120651「羊」GeneralModelId 86952761(有模型)、 // AI 40213004、ShowHPBar=True(血条用 UnitStateConfig.HideHp 收掉)。 // ⛔ 40980002 / 40120907「梅卡羊」模型 86952527 在这版客户端里是透明的,别再默认。 // func GameRouter_MechanikaSheep_MechanikaReady4229938(ctx context.Context, state any) bool { // Router implementation for GameRouter_MechanikaSheep_MechanikaReady4229938 return true } // // 梅卡妮卡的"羊技能族"白名单。⛑ 这四个 id 不在任何 FightSkillConfig 行里, // 所以 weapon.AllowsSkill 一定判 false —— 必须在到达那条校验之前放行, // 否则客户端发来的 51937722 / 51934941 / 51939201 会被 // [COMBAT] reject unknown-skill 吃掉。 // func GameRouter_MechanikaSheep_AllowsMechanikaSheepSkill4229938(ctx context.Context, templateId uint32, skillId uint32) bool { // Router implementation for GameRouter_MechanikaSheep_AllowsMechanikaSheepSkill4229938 return true } // // 一次按键放一批机械羊(默认 3 只:左前 45° / 右前 −45° / 背后 180°)。 // 调用方:AskUseSkill(SkillId=51937722)、51937721、51939201(当前 E 走的那个) // 与流派 ActiveSkill 兜底。 // ⛑ 2026-09-27:10 米判定与数量上限都已按用户要求删除 —— 按一次出一批,可以一直出。 // 想加安全闸就配 gameplay.mechanikaSheepMaxAlive(0 = 不限制)。 // func GameRouter_MechanikaSheep_SummonMechanikaSheep4229938(ctx context.Context, session *GameSession) any { // Router implementation for GameRouter_MechanikaSheep_SummonMechanikaSheep4229938 var zero any; return zero } // // 生成之后的"激活批次"。GameplaySettings.MechanikaSheepActivate: // "battleAiS"(默认)只切战斗树、不锁玩家;"full" 走 GM 那套(会攻击玩家);"none" 不发。 // ⛑ 1.5 s 后重发一次是照 ReEngageSpawnedEnemyAsync 的节奏 —— 第一批可能在客户端 // 还没把这个单位初始化完就被吃掉了。 // func GameRouter_MechanikaSheep_ActivateMechanikaSheepAsync(ctx context.Context, session *GameSession, id uint64) any { // Router implementation for GameRouter_MechanikaSheep_ActivateMechanikaSheepAsync var zero any; return zero } // // 收掉羊头顶的血条(SyncAddUnitState + UnitStateConfig.HideHp = 10266)。 // 与 GameRouter.HackerSummon.cs 给机械狗做的完全同一招。 // ⛑ 1.5 s 后重发一次:spawn 批是几十个包,AddUnitState 可能比单位在客户端建好更早到, // 那就白发了(ReassertHiddenHpBarAsync / ReEngageSpawnedEnemyAsync 同样延 1.5 s)。 // func GameRouter_MechanikaSheep_HideMechanikaSheepHpBarAsync(ctx context.Context, session *GameSession, id uint64) any { // Router implementation for GameRouter_MechanikaSheep_HideMechanikaSheepHpBarAsync var zero any; return zero } // // 刷一只羊(mechanikaSheepSpawnPath="handwritten" 时走这条)。 // 序列照抄 GameRouter.Civilians.cs 的 // SendLeftBehindAgentAsync(SyncRaidBattleUnitAgent 通道,实机验证过的那条)。 // ⛑ 阵营:硬规则 132 —— 友方 NPC 一律不发 SyncForceEnemyRelation、不登记进敌人账本。 // func GameRouter_MechanikaSheep_SendMechanikaSheepAgentAsync(ctx context.Context, session *GameSession, id uint64, owner uint64, position Vec3, facing float32) any { // Router implementation for GameRouter_MechanikaSheep_SendMechanikaSheepAgentAsync var zero any; return zero } // // 羊自己放的原生技能(MeikaShip 只列了传送 51984701):只登记生命周期, // 绝扣不到玩家头上,也绝不伪造伤害/命中。 // ⛑ 现用的 40120651 行为树是 Behavior_EmptyBehavior,实际上不会放技能; // 这条留着是为了万一换成带树的模板时,不把羊的技能记到玩家连招账上。 // func GameRouter_MechanikaSheep_RecordMechanikaSkill4229938(ctx context.Context, session *GameSession, request any) bool { // Router implementation for GameRouter_MechanikaSheep_RecordMechanikaSkill4229938 return true } // 技能收尾:把冷冻再延长一点点,避免刚传送走的羊被别处逻辑打断。 func GameRouter_MechanikaSheep_RecordMechanikaSkillEnd4229938(ctx context.Context, session *GameSession, report any) any { // Router implementation for GameRouter_MechanikaSheep_RecordMechanikaSkillEnd4229938 var zero any; return zero } func GameRouter_MechanikaSheep_ClearMechanikaSheepUnderGate4229938(ctx context.Context, session *GameSession, runtime any) any { // Router implementation for GameRouter_MechanikaSheep_ClearMechanikaSheepUnderGate4229938 var zero any; return zero } // 对外统一召回入口(切角色 / 切场景)。 func GameRouter_MechanikaSheep_StopMechanikaSheep4229938(ctx context.Context, session *GameSession) any { // Router implementation for GameRouter_MechanikaSheep_StopMechanikaSheep4229938 var zero any; return zero } type MechanikaRuntime4229938 struct { Gate *sync.Mutex `json:"gate"` States map[uint64]MechanikaSheepState4229938 `json:"states"` Owner uint64 `json:"owner"` Generation int32 `json:"generation"` } type MechanikaSheepState4229938 struct { ActionUntil int64 `json:"actionUntil"` SkillInstance int32 `json:"skillInstance"` }