This repository has been archived on 2026-10-31. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Ananta-ps/internal/gameserver/routers/game_router_mechanika_sheep.go
T

137 lines
7.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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"`
}