137 lines
7.0 KiB
Go
137 lines
7.0 KiB
Go
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"`
|
||
}
|
||
|