spell_scripts表

概述

spell_scripts表是AzerothCore中法术脚本系统的核心表格,用于定义法术施放时执行的特殊脚本动作。与spell_script_names表不同,这个表格使用数据库脚本而非C++代码,提供了更灵活的法术效果定制方式。

表格作用

表格结构

字段名 数据类型 默认值 说明
id INT UNSIGNED 0 法术ID
effIndex TINYINT UNSIGNED 0 效果索引
delay INT UNSIGNED 0 延迟时间(秒)
command INT UNSIGNED 0 脚本命令
datalong INT UNSIGNED 0 数据参数1
datalong2 INT UNSIGNED 0 数据参数2
dataint INT 0 整数参数
x FLOAT 0 X坐标
y FLOAT 0 Y坐标
z FLOAT 0 Z坐标
o FLOAT 0 朝向角度

字段详细说明

id (法术ID)

要绑定脚本的法术ID,对应Spell.dbc或spell_template表中的法术ID。当此法术被施放时,会执行对应的脚本。

effIndex (效果索引)

法术效果的索引,指定脚本在哪个法术效果时触发:

delay (延迟时间)

脚本执行前的延迟时间,以秒为单位。0表示立即执行。

command (脚本命令)

要执行的脚本命令,与event_scripts表使用相同的命令系统。

使用示例

示例1:法术施放时播放特效

场景:火球术施放时播放额外的声音和视觉效果

INSERT INTO spell_scripts (id, effIndex, delay, command, datalong) VALUES
(133, 0, 0, 16, 8192), -- 火球术效果0时播放声音
(133, 0, 1, 1, 15, 0); -- 1秒后播放表情动作

说明:火球术(ID:133)在第一个效果时播放声音,1秒后做表情

示例2:治疗法术的额外效果

场景:治疗法术施放时召唤治疗光环

INSERT INTO spell_scripts (id, effIndex, delay, command, datalong, datalong2, x, y, z) VALUES
(2061, 0, 0, 10, 15352, 10000, 0, 0, 0); -- 召唤治疗光环生物,持续10秒

说明:治疗法术(ID:2061)施放时在施法者位置召唤治疗光环

示例3:传送法术的环境效果

场景:传送法术施放时在目标位置创建传送门

INSERT INTO spell_scripts (id, effIndex, delay, command, datalong, x, y, z, o) VALUES
(3561, 0, 2, 9, 180001, -8913.23, 554.633, 93.0517, 0); -- 2秒后重生传送门

说明:传送法术(ID:3561)施放2秒后在指定位置重生传送门对象

法术脚本与C++脚本的区别

数据库脚本 (spell_scripts)

特点 优势 劣势
无需编译 修改后立即生效 功能相对有限
简单配置 易于理解和维护 无法实现复杂逻辑
预定义命令 稳定性好 扩展性有限
数据库存储 便于备份和迁移 性能略低

C++脚本 (spell_script_names)

特点 优势 劣势
需要编译 功能强大 修改需要重启服务器
复杂逻辑 可实现任意复杂效果 需要编程知识
自定义函数 高度可扩展 可能引入bug
源代码 性能最优 维护成本高

常用法术脚本模式

视觉特效增强

-- 为法术添加额外的视觉和音效
INSERT INTO spell_scripts VALUES
(12345, 0, 0, 16, 8192, 0, 0, 0, 0, 0, 0), -- 播放施法音效
(12345, 0, 1, 15, 26740, 1, 0, 0, 0, 0, 0), -- 施放视觉效果法术
(12345, 0, 2, 1, 15, 0, 0, 0, 0, 0, 0); -- 做表情动作

环境交互脚本

-- 法术与环境对象的交互
INSERT INTO spell_scripts VALUES
(23456, 0, 0, 11, 180001, 0, 0, 0, 0, 0, 0), -- 打开门
(23456, 0, 5, 12, 180001, 0, 0, 0, 0, 0, 0), -- 5秒后关闭门
(23456, 0, 1, 16, 9278, 0, 0, 0, 0, 0, 0); -- 播放门开启音效

召唤和创建脚本

-- 法术召唤生物或创建物品
INSERT INTO spell_scripts VALUES
(34567, 0, 0, 10, 15352, 30000, 0, 0, 2, 0), -- 召唤守护者,持续30秒,距离2码
(34567, 0, 1, 17, 12345, 1, 0, 0, 0, 0, 0), -- 创建物品给施法者
(34567, 0, 0, 0, 0, 0, 50001, 0, 0, 0, 0); -- 说话:"召唤完成!"

效果索引的使用

单效果法术

对于只有一个效果的法术,通常使用effIndex=0:

INSERT INTO spell_scripts (id, effIndex, delay, command, datalong) VALUES
(12345, 0, 0, 16, 8192); -- 在第一个效果时播放声音

多效果法术

对于有多个效果的法术,可以为不同效果设置不同脚本:

INSERT INTO spell_scripts VALUES
(23456, 0, 0, 16, 8192, 0, 0, 0, 0, 0, 0), -- 效果0:播放音效
(23456, 1, 0, 15, 26740, 1, 0, 0, 0, 0, 0), -- 效果1:施放法术
(23456, 2, 0, 1, 15, 0, 0, 0, 0, 0, 0); -- 效果2:做表情

全效果脚本

使用effIndex=255可以在所有效果时都执行脚本:

INSERT INTO spell_scripts (id, effIndex, delay, command, datalong) VALUES
(34567, 255, 0, 16, 8192); -- 在所有效果时都播放声音

管理和维护

查询现有脚本

-- 查看所有法术脚本
SELECT * FROM spell_scripts;

-- 查看特定法术的脚本
SELECT * FROM spell_scripts WHERE id = 133;

-- 查看使用特定命令的脚本
SELECT * FROM spell_scripts WHERE command = 16; -- 播放声音命令

修改脚本

-- 修改延迟时间
UPDATE spell_scripts SET delay = 2 WHERE id = 133 AND effIndex = 0;

-- 修改命令参数
UPDATE spell_scripts SET datalong = 9999 WHERE id = 133;

-- 删除脚本
DELETE FROM spell_scripts WHERE id = 133;

重载脚本

修改脚本后需要重载数据:

.reload spell_scripts

注意事项

⚠️ 重要提醒

相关表格

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