法术链接(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. 查看源码: 遇到不确定的行为时,查看相关源码了解具体实现
相关推荐
一念杂记1 小时前
【免费网盘】1分钟快速搭建免费专属网盘,旧电脑&旧手机均可使用~
开源
白驹过隙^^1 小时前
windows通过docker compose部署oktopus服务
linux·windows·tcp/ip·docker·容器·开源
拆房老料1 小时前
文档预览开源选型对比:BaseMetas FileView 与 KK FileView,谁更适合你的系统?
java·开源·java-rocketmq·开源软件
Light603 小时前
开源BIM渲染新纪元:AI赋能与架构重塑,构筑数字孪生未来
开源·数字孪生·freecad·开源bim·bim渲染器·blenderbim
Kagol4 小时前
🎉历时1年,TinyEditor v4.0 正式发布!
前端·typescript·开源
说私域4 小时前
基于开源AI智能名片链动2+1模式S2B2C商城小程序的线上线下流量转化运营策略研究
人工智能·小程序·开源
星辰引路-Lefan5 小时前
[特殊字符] 开源一款基于 PaddleOCR 的纯离线 OCR 识别插件 | 支持身份证、银行卡、驾驶证识别
前端·开源·ocr
WF_YL5 小时前
豆包网页版插件v6.8开源- 自定义消息跳转 对话框宽度调整 含源代码
开源
番石榴AI6 小时前
JiaJiaOCR:面向Java ocr的开源库
java·图像处理·人工智能·计算机视觉·开源·ocr
拾荒的小海螺6 小时前
开源项目:Silky Starter 如丝般顺滑的 Spring Boot 组件生态
spring boot·后端·开源