spell_script_names表

概述

spell_script_names表是AzerothCore中法术脚本系统的核心表格,用于将法术ID与C++脚本类名进行绑定。通过这个表格,可以为特定的法术指定自定义的脚本处理逻辑,实现复杂的法术效果和机制。

表格作用

表格结构

字段名 数据类型 默认值 说明
spell_id INT 0 法术ID
ScriptName VARCHAR(64) '' 脚本类名

字段详细说明

spell_id (法术ID)

要绑定脚本的法术ID,对应Spell.dbc或spell_template表中的法术ID。一个法术ID可以绑定多个不同的脚本类。

ScriptName (脚本类名)

C++脚本类的名称,必须与源代码中定义的类名完全一致。脚本类通常继承自以下基类之一:

脚本类型说明

SpellScript (法术脚本)

用于处理法术施放过程中的各种事件:

事件钩子 触发时机 用途
OnCheckCast 检查是否可以施放 自定义施法条件检查
OnPrepare 法术准备阶段 初始化法术数据
OnCast 法术施放时 执行法术主要逻辑
OnHit 法术命中目标时 处理命中效果
OnAfterCast 法术施放完成后 清理和后续处理
OnEffectHit 特定效果命中时 处理单个效果
OnObjectAreaTargetSelect 选择区域目标时 自定义目标选择
OnObjectTargetSelect 选择单体目标时 自定义目标选择

AuraScript (光环脚本)

用于处理持续性效果(光环)的各种事件:

事件钩子 触发时机 用途
OnApply 光环应用时 初始化光环效果
OnRemove 光环移除时 清理光环效果
OnPeriodic 周期性触发时 处理周期性效果
OnAbsorb 吸收伤害时 处理伤害吸收
OnProc 触发效果时 处理触发机制
OnEffectApply 特定效果应用时 处理单个效果应用
OnEffectRemove 特定效果移除时 处理单个效果移除
OnStackChange 层数变化时 处理层数变化

使用示例

示例1:绑定法术脚本

场景:为火球术(法术ID 133)绑定自定义脚本

INSERT INTO spell_script_names (spell_id, ScriptName) VALUES
(133, 'spell_mage_fireball');

说明:将火球术与spell_mage_fireball脚本类绑定

示例2:绑定光环脚本

场景:为法师护甲(法术ID 168)绑定光环脚本

INSERT INTO spell_script_names (spell_id, ScriptName) VALUES
(168, 'spell_mage_armor_aura');

说明:为法师护甲绑定处理光环效果的脚本

示例3:多脚本绑定

场景:为同一个法术绑定多个脚本

INSERT INTO spell_script_names (spell_id, ScriptName) VALUES
(12345, 'spell_custom_effect'),
(12345, 'spell_custom_aura');

说明:同一个法术可以同时绑定法术脚本和光环脚本

常用脚本命名规范

命名约定

AzerothCore中的脚本命名通常遵循以下规范:

常见脚本示例

脚本名称 法术类型 说明
spell_mage_fireball 法师火球术 处理火球术的特殊效果
spell_paladin_blessing_of_might 圣骑士力量祝福 处理祝福效果
spell_item_healing_potion 治疗药水 处理药水使用效果
spell_boss_ragnaros_hand_of_ragnaros 拉格纳罗斯技能 处理BOSS特殊技能
spell_generic_damage_shield 通用伤害护盾 处理反伤效果

脚本开发流程

1. 创建脚本类

在AzerothCore源代码中创建新的脚本类:

class spell_custom_fireball : public SpellScript
{
    PrepareSpellScript(spell_custom_fireball);

    void HandleOnHit(SpellEffIndex /*effIndex*/)
    {
        // 自定义逻辑
    }

    void Register() override
    {
        OnEffectHitTarget += SpellEffectFn(spell_custom_fireball::HandleOnHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
    }
};

2. 注册脚本

在脚本加载器中注册新脚本:

void AddSC_custom_spells()
{
    RegisterSpellScript(spell_custom_fireball);
}

3. 数据库绑定

在spell_script_names表中添加绑定记录:

INSERT INTO spell_script_names (spell_id, ScriptName) VALUES
(100001, 'spell_custom_fireball');

4. 编译和测试

重新编译服务器并在游戏中测试脚本效果。

脚本调试技巧

日志输出

在脚本中使用日志输出进行调试:

TC_LOG_DEBUG("spells", "Custom fireball script executed for spell %u", GetSpellInfo()->Id);

条件检查

添加必要的条件检查确保脚本稳定性:

Unit* target = GetHitUnit();
if (!target)
    return;

if (target->GetTypeId() != TYPEID_PLAYER)
    return;

常见问题解决

脚本不生效

可能原因和解决方案:

脚本冲突

处理脚本冲突:

高级应用

动态脚本绑定

可以通过GM命令动态添加或移除脚本绑定:

-- 添加脚本绑定
INSERT INTO spell_script_names (spell_id, ScriptName) VALUES (12345, 'new_script');
.reload spell_scripts

-- 移除脚本绑定
DELETE FROM spell_script_names WHERE spell_id = 12345 AND ScriptName = 'old_script';
.reload spell_scripts

条件脚本

结合conditions表实现条件性脚本执行:

-- 只在特定条件下执行脚本
INSERT INTO conditions (SourceTypeOrReferenceId, SourceGroup, SourceEntry, ConditionTypeOrReference, ConditionValue1) VALUES
(17, 0, 12345, 15, 8); -- 只对法师生效

性能优化建议

💡 优化技巧

注意事项

⚠️ 重要提醒

相关表格

spell_script_names表经常与以下表格配合使用:

学习资源

推荐的学习资源: