news 2026/4/18 3:40:46

法术链接(spell_linked_spell)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
法术链接(spell_linked_spell)

目录

    • 一、概述
    • 二、数据库表结构
      • 字段说明
    • 三、链接类型(type)详解
      • 1. SPELL_LINK_CAST (type = 0)
      • 2. SPELL_LINK_HIT (type = 1)
      • 3. SPELL_LINK_AURA (type = 2)
        • 应用光环时 (apply=true)
        • 移除光环时 (apply=false)
      • 4. SPELL_LINK_REMOVE (type = 3)
    • 四、法实施放者和法术链接者详解
      • 1. SPELL_LINK_CAST (type = 0)
      • 2. SPELL_LINK_HIT (type = 1)
      • 3. SPELL_LINK_AURA (type = 2)
      • 4. SPELL_LINK_REMOVE (type = 3)
    • 五、对比总结表
      • spell_trigger 正负值含义
      • spell_effect 正负值含义
      • 四种类型对比
    • 六、关键注意事项
    • 七、实际应用示例
      • 示例1: 施放后追加效果
      • 示例2: 被击中后触发伤害
      • 示例3: 光环组合效果
      • 示例4: 光环移除后触发
      • 示例5: 净化移除后惩罚
    • 八、相关代码位置
    • 九、故障排查
      • 问题1: 链接法术未触发
      • 问题2: spell_trigger 为负值时报错
      • 问题3: 光环移除时正值 spell_effect 未触发
    • 十、最佳实践建议

一、概述

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

二、数据库表结构

CREATETABLE`spell_linked_spell`(`spell_trigger`mediumint(8)NOTNULLCOMMENT'触发法术ID',`spell_effect`mediumint(8)NOTNULLCOMMENT'效果法术ID',`type`tinyint(3)unsignedNOTNULLDEFAULT'0'COMMENT'链接类型: 0=施放, 1=击中, 2=光环, 3=移除',`comment`text,PRIMARYKEY(`spell_trigger`,`spell_effect`,`type`));

字段说明

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

三、链接类型(type)详解

1. SPELL_LINK_CAST (type = 0)

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

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

spell_trigger 正负值含义:

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

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

spell_effect 正负值含义:

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

示例:

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

2. SPELL_LINK_HIT (type = 1)

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

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

spell_trigger 正负值含义:

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

spell_effect 正负值含义:

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

示例:

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

3. SPELL_LINK_AURA (type = 2)

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

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

spell_trigger 正负值含义:

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

spell_effect 正负值含义:

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

示例:

-- 当法术 123 的光环应用时,施放者给目标添加法术 456 的光环(123,456,2)-- 当法术 123 的光环应用时,目标获得对法术 789 的免疫(123,-789,2)-- 当法术 123 的光环移除时,目标移除法术 456 的光环(123,456,2)-- 当法术 123 的光环移除时,目标失去对法术 789 的免疫(123,-789,2)

4. SPELL_LINK_REMOVE (type = 3)

触发时机: 光环移除时

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

spell_trigger 正负值含义:

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

spell_effect 正负值含义:

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

示例:

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

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

1. SPELL_LINK_CAST (type = 0)

  • 法实施放者:m_caster(原始法术的施放者)
  • 法术链接者:
    • 正值法术:m_casterm_targets.GetUnitTarget()(目标)或对自己施放
    • 负值法术:m_caster移除自己身上的指定光环
  • 特点: 发生在法术施放完成时,施放者决定链接法术的目标

2. SPELL_LINK_HIT (type = 1)

  • 法实施放者:m_caster(原始法术的施放者),通过.SetOriginalCaster(m_caster->GetGUID())设置
  • 法术链接者:unit(被击中的目标单位)自己施放链接法术到自身
  • 特点: 发生在法术击中每个目标时,链接法术由被击中的目标自己施放(但施放者记录为原始施放者)

3. SPELL_LINK_AURA (type = 2)

  • 法实施放者:caster(光环的施放者)
  • 法术链接者:target(光环的目标单位)
    • 正值法术:castertarget添加链接光环
    • 负值法术:target获得或移除对指定法术的免疫
  • 特点: 伴随光环的生命周期,应用时添加光环/免疫,移除时移除光环/免疫

4. SPELL_LINK_REMOVE (type = 3)

  • 法实施放者: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: 施放后追加效果

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

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

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

示例3: 光环组合效果

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

示例4: 光环移除后触发

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

示例5: 净化移除后惩罚

-- 当净化术(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. 查看源码: 遇到不确定的行为时,查看相关源码了解具体实现
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 13:10:02

语音合成支持语音风格插值?多情感混合生成实验

语音合成支持语音风格插值?多情感混合生成实验 在虚拟主播、有声书朗读和AI角色对话日益普及的今天,用户对语音合成的要求早已超越“能听清”这一基本标准。人们希望听到的声音不仅像真人,还能传递情绪——比如温柔地安慰、坚定地鼓励&#x…

作者头像 李华
网站建设 2026/4/16 12:55:52

[精品]基于微信小程序的植物园管理小程序 UniApp

文章目录项目效果图开发核心技术介绍:SpringBoot和Vue 介绍系统测试详细视频演示源码获取项目效果图 项目编号:055 开发核心技术介绍: 本系统的开发环境如下: 操作系统:微软win10以上版本 开发平台&…

作者头像 李华
网站建设 2026/4/17 14:09:49

[精品]基于微信小程序的秦兵马俑博物馆小程序 UniApp

文章目录项目效果图开发核心技术介绍:SpringBoot和Vue 介绍系统测试详细视频演示源码获取项目效果图 项目编号:056 开发核心技术介绍: 本系统的开发环境如下: 操作系统:微软win10以上版本 开发平台&#…

作者头像 李华
网站建设 2026/4/18 3:05:13

十年Java后端开发技术能力体系

十年Java后端开发技术能力体系 十年经验的Java后端开发应构建T型能力模型:深度精通Java生态核心技术,广度覆盖分布式系统、架构设计与工程实践。以下是完整的技术能力图谱:一、Java语言核心技术深度 1.1 JVM底层原理(专家级&#…

作者头像 李华
网站建设 2026/4/10 17:04:18

[精品]基于微信小程序的横塘小学学生托管管理系统UniApp

文章目录项目效果图开发核心技术介绍:SpringBoot和Vue 介绍系统测试详细视频演示源码获取项目效果图 项目编号:057 开发核心技术介绍: 本系统的开发环境如下: 操作系统:微软win10以上版本 开发平台&#xf…

作者头像 李华