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 (效果索引)
法术效果的索引,指定脚本在哪个法术效果时触发:
- 0 - 第一个效果(EFFECT_0)
- 1 - 第二个效果(EFFECT_1)
- 2 - 第三个效果(EFFECT_2)
- 255 - 所有效果
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
注意事项
⚠️ 重要提醒
- 法术ID有效性 - 确保法术ID存在且有效
- 效果索引 - 确保effIndex对应法术的实际效果数量
- 命令兼容性 - 不是所有命令都适用于法术脚本
- 参数正确性 - 验证所有参数的有效性
- 性能影响 - 避免在高频法术上添加复杂脚本
- 脚本冲突 - 注意与C++脚本的潜在冲突
相关表格
spell_scripts表经常与以下表格配合使用: