目录
-
- 一、概述
- 二、数据库表结构
- 三、链接类型(type)详解
-
- [1. SPELL_LINK_CAST (type = 0)](#1. SPELL_LINK_CAST (type = 0))
- [2. SPELL_LINK_HIT (type = 1)](#2. SPELL_LINK_HIT (type = 1))
- [3. SPELL_LINK_AURA (type = 2)](#3. SPELL_LINK_AURA (type = 2))
- [4. SPELL_LINK_REMOVE (type = 3)](#4. SPELL_LINK_REMOVE (type = 3))
- 四、法实施放者和法术链接者详解
-
- [1. SPELL_LINK_CAST (type = 0)](#1. SPELL_LINK_CAST (type = 0))
- [2. SPELL_LINK_HIT (type = 1)](#2. SPELL_LINK_HIT (type = 1))
- [3. SPELL_LINK_AURA (type = 2)](#3. SPELL_LINK_AURA (type = 2))
- [4. SPELL_LINK_REMOVE (type = 3)](#4. SPELL_LINK_REMOVE (type = 3))
- 五、对比总结表
-
- [spell_trigger 正负值含义](#spell_trigger 正负值含义)
- [spell_effect 正负值含义](#spell_effect 正负值含义)
- 四种类型对比
- 六、关键注意事项
- 七、实际应用示例
-
- [示例1: 施放后追加效果](#示例1: 施放后追加效果)
- [示例2: 被击中后触发伤害](#示例2: 被击中后触发伤害)
- [示例3: 光环组合效果](#示例3: 光环组合效果)
- [示例4: 光环移除后触发](#示例4: 光环移除后触发)
- [示例5: 净化移除后惩罚](#示例5: 净化移除后惩罚)
- 八、相关代码位置
- 九、故障排查
-
- [问题1: 链接法术未触发](#问题1: 链接法术未触发)
- [问题2: spell_trigger 为负值时报错](#问题2: spell_trigger 为负值时报错)
- [问题3: 光环移除时正值 spell_effect 未触发](#问题3: 光环移除时正值 spell_effect 未触发)
- 十、最佳实践建议
一、概述
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)详解
1. SPELL_LINK_CAST (type = 0)
触发时机 : 法术施放完成后(在 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)
2. SPELL_LINK_HIT (type = 1)
触发时机: 法术击中目标后(在处理伤害/治疗后)
适用场景: 被击中后触发效果,如被火球术击中后燃烧、被暴击后减速
spell_trigger 正负值含义:
| spell_trigger | 含义 |
|---|---|
| 正值或负值 | 都表示当该法术击中目标时触发(使用绝对值) |
spell_effect 正负值含义:
| spell_effect | 含义 | 操作对象 |
|---|---|---|
| 正值 | 施放该法术 | 被击中的目标(unit)对自己施放 |
| 负值 | 移除该法术对应的光环 | 被击中的目标(unit)移除自己身上的光环 |
示例:
sql
-- 当法术 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 | 含义 | 操作对象 |
|---|---|---|
| 正值 | 移除目标身上的该法术对应的光环 | 光环的目标移除 |
| 负值 | 移除目标对该法术的免疫 | 光环的目标失去免疫 |
示例:
sql
-- 当法术 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)移除自己身上的光环 |
示例:
sql
-- 当法术 123 的光环被移除时,目标对自己施放法术 456
(123, 456, 3)
-- 当法术 123 的光环被移除时,目标移除自己身上的法术 789
(123, -789, 3)
四、法实施放者和法术链接者详解
1. SPELL_LINK_CAST (type = 0)
- 法实施放者 :
m_caster(原始法术的施放者) - 法术链接者 :
- 正值法术:
m_caster对m_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(光环的目标单位)- 正值法术:
caster给target添加链接光环 - 负值法术:
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 | 光环移除 | 光环目标 | 目标自己施放或移除光环 | 移除后触发效果 |
六、关键注意事项
- spell_trigger 的负值仅在 type=0 时有特殊含义,其他类型都只使用绝对值
- spell_effect 的负值在所有类型中表示移除/免疫(除了 SPELL_LINK_AURA 的应用时表示免疫)
- type=0 时 spell_trigger 为负值会被自动转换为 type=3,这是简写方式
- SPELL_LINK_AURA 的正负 spell_effect 在应用和移除时有不同的行为,需要特别注意
- 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 不会触发
十、最佳实践建议
- 合理选择 type: 根据触发时机选择合适的 type,不要滥用 type=0 的负值语法糖
- 添加注释 : 在
comment字段中清晰说明该链接的用途,方便后续维护 - 避免循环: 小心不要创建循环链接(A 触发 B,B 触发 A),可能导致无限循环
- 测试充分: 不同类型的链接行为差异大,建议逐个测试验证
- 查看源码: 遇到不确定的行为时,查看相关源码了解具体实现