法术链接(spell_linked_spell)

目录

一、概述

spell_linked_spell 是 TrinityCore 中用于实现法术联动效果的核心系统,通过数据库表 spell_linked_spell 配置,可以实现当一个法术触发时自动施放、移除光环或添加免疫等效果。

二、数据库表结构

sql 复制代码
CREATE TABLE `spell_linked_spell` (
  `spell_trigger` mediumint(8) NOT NULL COMMENT '触发法术ID',
  `spell_effect` mediumint(8) NOT NULL COMMENT '效果法术ID',
  `type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '链接类型: 0=施放, 1=击中, 2=光环, 3=移除',
  `comment` text,
  PRIMARY KEY (`spell_trigger`,`spell_effect`,`type`)
);

字段说明

  • spell_trigger: 触发条件法术ID,正负值含义因 type 而异
  • spell_effect: 产生效果的法术ID,正值 = 施放/添加,负值 = 移除/免疫
  • type: 链接类型,决定触发时机和行为
  • comment: 备注说明

三、链接类型(type)详解

触发时机 : 法术施放完成后(在 Spell::cast() 函数的最后)

适用场景: 法术施放后追加效果、光环组合施放

spell_trigger 正负值含义:

spell_trigger 含义
正值 当该法术施放时触发
负值 当该法术对应的光环被移除时触发(语法糖,内部自动转换为 type=3)

注意 : spell_trigger 为负值仅在 type=0 时有效,其他 type 会报错。

spell_effect 正负值含义:

spell_effect 含义 操作对象
正值 施放该法术 施放者对目标/自己施放
负值 移除该法术对应的光环 施放者移除自己身上的光环

示例:

sql 复制代码
-- 当法术 123 施放时,施放者对目标施放法术 456
(123, 456, 0)

-- 当法术 123 施放时,施放者移除自己身上的法术 789 对应的光环
(123, -789, 0)

-- 当法术 123 对应的光环被移除时,施放者施放法术 456(等同于 type=3)
(-123, 456, 0)

触发时机: 法术击中目标后(在处理伤害/治疗后)

适用场景: 被击中后触发效果,如被火球术击中后燃烧、被暴击后减速

spell_trigger 正负值含义:

spell_trigger 含义
正值或负值 都表示当该法术击中目标时触发(使用绝对值)

spell_effect 正负值含义:

spell_effect 含义 操作对象
正值 施放该法术 被击中的目标(unit)对自己施放
负值 移除该法术对应的光环 被击中的目标(unit)移除自己身上的光环

示例:

sql 复制代码
-- 当法术 123 击中目标时,被击中的目标对自己施放法术 456
(123, 456, 1)

-- 当法术 123 击中目标时,被击中的目标移除自己身上的法术 789
(123, -789, 1)

触发时机: 光环应用或移除时

适用场景: 光环组合效果、光环联动、免疫效果管理

spell_trigger 正负值含义:

spell_trigger 含义
正值或负值 都表示当该法术对应的光环应用或移除时触发(使用绝对值)

spell_effect 正负值含义:

应用光环时 (apply=true)
spell_effect 含义 操作对象
正值 给目标添加该法术对应的光环 施放者给光环的目标添加
负值 使目标获得对该法术的免疫 光环的目标获得免疫
移除光环时 (apply=false)
spell_effect 含义 操作对象
正值 移除目标身上的该法术对应的光环 光环的目标移除
负值 移除目标对该法术的免疫 光环的目标失去免疫

示例:

sql 复制代码
-- 当法术 123 的光环应用时,施放者给目标添加法术 456 的光环
(123, 456, 2)

-- 当法术 123 的光环应用时,目标获得对法术 789 的免疫
(123, -789, 2)

-- 当法术 123 的光环移除时,目标移除法术 456 的光环
(123, 456, 2)

-- 当法术 123 的光环移除时,目标失去对法术 789 的免疫
(123, -789, 2)

触发时机: 光环移除时

适用场景: 净化移除后治疗、光环消失后触发伤害

spell_trigger 正负值含义:

spell_trigger 含义
正值或负值 都表示当该法术对应的光环被移除时触发(使用绝对值)

spell_effect 正负值含义:

spell_effect 含义 操作对象
正值 施放该法术 光环的目标(target)自己施放
负值 移除该法术对应的光环 光环的目标(target)移除自己身上的光环

示例:

sql 复制代码
-- 当法术 123 的光环被移除时,目标对自己施放法术 456
(123, 456, 3)

-- 当法术 123 的光环被移除时,目标移除自己身上的法术 789
(123, -789, 3)

四、法实施放者和法术链接者详解

  • 法实施放者 : m_caster(原始法术的施放者)
  • 法术链接者 :
    • 正值法术: m_casterm_targets.GetUnitTarget()(目标)或对自己施放
    • 负值法术: m_caster 移除自己身上的指定光环
  • 特点: 发生在法术施放完成时,施放者决定链接法术的目标
  • 法实施放者 : m_caster(原始法术的施放者),通过 .SetOriginalCaster(m_caster->GetGUID()) 设置
  • 法术链接者 : unit(被击中的目标单位)自己施放链接法术到自身
  • 特点: 发生在法术击中每个目标时,链接法术由被击中的目标自己施放(但施放者记录为原始施放者)
  • 法实施放者 : caster(光环的施放者)
  • 法术链接者 : target(光环的目标单位)
    • 正值法术: castertarget 添加链接光环
    • 负值法术: target 获得或移除对指定法术的免疫
  • 特点: 伴随光环的生命周期,应用时添加光环/免疫,移除时移除光环/免疫
  • 法实施放者 : target(光环的目标单位)
  • 法术链接者 :
    • 正值法术: target 自己施放链接法术(但记录原始施放者)
    • 负值法术: target 移除自己身上的指定光环
  • 特点: 仅在光环移除时触发

五、对比总结表

spell_trigger 正负值含义

type 正值 spell_trigger 负值 spell_trigger
SPELL_LINK_CAST (0) 法术施放时触发 光环被移除时触发(转换为 type=3)
SPELL_LINK_HIT (1) 法术击中时触发 法术击中时触发(使用绝对值)
SPELL_LINK_AURA (2) 光环应用/移除时触发 光环应用/移除时触发(使用绝对值)
SPELL_LINK_REMOVE (3) 光环移除时触发 光环移除时触发(使用绝对值)

spell_effect 正负值含义

type 正值 spell_effect 负值 spell_effect
SPELL_LINK_CAST (0) 施放法术 移除施放者身上的光环
SPELL_LINK_HIT (1) 目标自己施放法术 目标移除自己身上的光环
SPELL_LINK_AURA (2) 应用时 施放者给目标添加光环 目标获得法术免疫
SPELL_LINK_AURA (2) 移除时 目标移除光环 目标失去法术免疫
SPELL_LINK_REMOVE (3) 目标自己施放法术 目标移除自己身上的光环

四种类型对比

类型 触发时机 法实施放者 法术链接者 典型用途
SPELL_LINK_CAST 法术施放完成 原始施放者 施放者对目标/自己施放或移除光环 施放后追加效果
SPELL_LINK_HIT 法术击中目标 原始施放者(作为OriginalCaster) 被击中的目标自己施放 被击中后触发效果
SPELL_LINK_AURA 光环应用/移除 光环施放者 光环目标获得/移除光环/免疫 光环组合效果
SPELL_LINK_REMOVE 光环移除 光环目标 目标自己施放或移除光环 移除后触发效果

六、关键注意事项

  1. spell_trigger 的负值仅在 type=0 时有特殊含义,其他类型都只使用绝对值
  2. spell_effect 的负值在所有类型中表示移除/免疫(除了 SPELL_LINK_AURA 的应用时表示免疫)
  3. type=0 时 spell_trigger 为负值会被自动转换为 type=3,这是简写方式
  4. SPELL_LINK_AURA 的正负 spell_effect 在应用和移除时有不同的行为,需要特别注意
  5. type=3 (SPELL_LINK_REMOVE) 时,如果光环是因为死亡而移除,正值 spell_effect 不会触发 (代码中有 removeMode != AURA_REMOVE_BY_DEATH 的判断)

七、实际应用示例

示例1: 施放后追加效果

sql 复制代码
-- 当火球术(133)施放时,施放者获得火球术施法加速(10秒)
(133, 546, 0, '火球术施放后获得加速')

示例2: 被击中后触发伤害

sql 复制代码
-- 当火球术(133)击中目标时,目标身上获得燃烧效果(持续伤害)
(133, 2948, 1, '火球术击中后燃烧')

示例3: 光环组合效果

sql 复制代码
-- 当圣盾术(642)应用时,目标获得对恐惧、魅惑、变形的免疫
(642, -8122, 2, '圣盾术-恐惧免疫')
(642, -710, 2, '圣盾术-魅惑免疫')
(642, -118, 2, '圣盾术-变形免疫')

示例4: 光环移除后触发

sql 复制代码
-- 当神圣护盾(20925)的光环被移除时,施放者恢复生命值
(20925, 20267, 3, '神圣护盾移除后治疗')

示例5: 净化移除后惩罚

sql 复制代码
-- 当净化术(4987)移除某个增益光环时,施法者获得短暂的加速效果
(4987, 546, 1, '净化成功后加速')

八、相关代码位置

  • 数据库加载 : src/server/game/Spells/SpellMgr.cpp 第 2070-2130 行
  • SPELL_LINK_CAST 实现 : src/server/game/Spells/Spell.cpp 第 3952-3965 行
  • SPELL_LINK_HIT 实现 : src/server/game/Spells/Spell.cpp 第 3385-3396 行
  • SPELL_LINK_AURA 实现 : src/server/game/Spells/Auras/SpellAuras.cpp 第 1410-1445 行
  • SPELL_LINK_REMOVE 实现 : src/server/game/Spells/Auras/SpellAuras.cpp 第 1424-1435 行

九、故障排查

问题1: 链接法术未触发

  • 检查 spell_trigger 的 spellInfo 是否存在(使用 GetSpellInfo(abs(trigger))
  • 检查 type 是否正确
  • 检查 spell_effect 的 spellInfo 是否有效
  • 查看服务器日志中的错误信息

问题2: spell_trigger 为负值时报错

  • 确认 type 是否为 0(仅 type=0 支持负值 spell_trigger)
  • 其他类型应使用正值或使用 type=3

问题3: 光环移除时正值 spell_effect 未触发

  • 检查光环是否因死亡而移除(removeMode == AURA_REMOVE_BY_DEATH
  • 如果是死亡移除,正值 spell_effect 不会触发

十、最佳实践建议

  1. 合理选择 type: 根据触发时机选择合适的 type,不要滥用 type=0 的负值语法糖
  2. 添加注释 : 在 comment 字段中清晰说明该链接的用途,方便后续维护
  3. 避免循环: 小心不要创建循环链接(A 触发 B,B 触发 A),可能导致无限循环
  4. 测试充分: 不同类型的链接行为差异大,建议逐个测试验证
  5. 查看源码: 遇到不确定的行为时,查看相关源码了解具体实现
相关推荐
rustfs1 小时前
RustFS 配置 Cloudflare Tunnel 实现安全访问的详细教程!
分布式·安全·docker·rust·开源
开源能源管理系统2 小时前
MyEMS开源能源管理系统:赋能钢压延加工行业能效升级与低碳转型
开源·能源·能源管理系统
com_4sapi2 小时前
2026年多模态API接口评测:星链4SAPI领跑企业级应用,开源与合规成竞争焦点
开源
lbb 小魔仙2 小时前
【Harmonyos】开源鸿蒙跨平台训练营DAY6:为首页轮播图渲染(及常见问题与方法)
华为·开源·harmonyos
昇腾CANN2 小时前
cann-recipes-train开源仓库介绍
开源·cann
OpenCSG2 小时前
OpenCSG(开放传神)开源数据贡献解析:3大标杆数据集,筑牢中文AI基建
人工智能·开源
_xaboy2 小时前
开源Vue组件-动态表单组件设计,告别重复CRUD,JSON一键生成表单
前端·vue.js·低代码·开源·json
Sweet锦2 小时前
无需JVM!GraalVM打造Windows平台零依赖Java应用
java·windows·后端·云原生·开源
柠檬汁Dev3 小时前
预言家视角:Sealos DevBox将如何改变远程协作的游戏规则
开源
lbb 小魔仙3 小时前
【Harmonyos】开源鸿蒙跨平台训练营DAY5:Flutter电商首页+底部导航栏开发教程
flutter·开源·harmonyos