主题
响应配置与目标排查
完整契约见响应系统。项目 Skill 镜像的相对链接不可用时,读取项目根下 docs/sdk/systems/ResponseSystem.md。
配置前先确定三组对象
- 原事件:
ResponseContext.Attacker/Defender。它们描述引发响应的主动方与被动方,不等于附加效果自身的Caster/Target。 - 挂载:
Response.Host是单位,Owner是提供响应的单位、技能或 Buff。成本由Host支付。 - 附加效果:
Caster来自Owner的执行上下文。单位/技能响应通常是宿主;Buff 响应可能是 Buff 施加者。先确认对象身份,再决定是否使用TargetLocation.Caster。
默认目标是事件另一方
Location | 附加效果根节点默认目标 |
|---|---|
Attacker | ResponseContext.Defender |
Defender(默认) | ResponseContext.Attacker |
Defender 不等于“给自己执行”。受击反伤可以保留默认目标;单位直接挂载的受击自疗、死亡自我复活应显式选择 Caster,需要单位时同时设置 TargetType.Unit。Buff 自疗则先核对宿主与施加者。不要为了修正自疗目标,把正常的被动方响应改到主动方侧。
响应附加效果由 Owner 创建,携带 effect.Shared.ResponseContext。原伤害等来源在 IncomingContext,不要假定附加效果继承原树的 Caster、主目标或祖先节点。数值公式读取原事件不会自动改变当前效果目标。
死亡响应的特殊点
Location = Defender响应Host自身死亡;Location = Attacker响应Host作为Killer击杀单位。两侧含义与其他响应一致,不得静默改成另一侧;不支持的配置应明确报错。Defender为死亡单位;Attacker为Killer ?? Unit。IncomingContext是死亡单位,不是致死伤害效果。- 无击杀者时不触发主动方响应;
Attacker的回退只用于目标解析。明确由单位击杀自己时,该宿主分别满足两侧条件。 - 无击杀者的
Kill()会回退自己,所以它不能单独验证有击杀者的死亡复活链。两个路径都测,并确认实际复活目标。 - 延迟与复活节点都可显式选择
Caster;单位必须保留到延迟结束。Revive恢复存活状态,不自动补生命值。
诊断顺序
- 查源 JSON、有效继承值和生成代码。枚举用
"Caster"、"Unit"、"Defender"等名称字符串,不用底层数字。// Value = 1、// TargetType = 1表示生成时省略赋值,不能算配置成功;修源数据再生成。 - 核对实际挂载的 Host/Owner、Location、激活状态、Validators、Chance 与 Cost。
- 分别记录响应上下文双方与效果的 Caster、DefaultTarget、Target;用对象身份确认,不只比较位置或显示名。
- 检查附加效果是否执行及目标是谁。
LogExecutionFailure=true无输出不证明没执行,对活单位执行复活可以成功且无变化。 - 运行期才出现的问题按behavior-troubleshoot收集事件、调用栈及当前局证据。把已确认事实与临时绕法分开,避免把“没看到预期结果”写成框架不派发响应。