修正[自定义AI_生物]

1、增加CustomCreatureHook-动态分配AI生物脚本;
2、去掉“移动范围”,修改为“逃跑”;
3、添加md和说明文档
This commit is contained in:
尚美 2025-08-13 23:51:06 +08:00
parent 1ad0565da2
commit 7b6e27c422
4 changed files with 1035 additions and 411 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
#pragma once
// modules\mod_GhostScripts\src\mod_Scripts\CustomScripts.h
#pragma once
enum GobActionTypes
{
gob_ACTION_TYPE_NONE,
@ -38,13 +39,13 @@ enum CreatureEventTypes
enum CreatureActionTypes
{ // actionParam1 actionParam2 actionParam3
ACTION_TYPE_NONE,
ACTION_TYPE_CAST_SPELL, //释放技能 SPELL_ID_1, SPELL_ID_2, -
ACTION_TYPE_TALK, //说话 说话内容 -
ACTION_TYPE_ACTIVE_OR_DEACTIVE_OBJECT, //激活 CreatureEntry GameObjectEntry -
ACTION_TYPE_SUMMON, //召唤生物或物体 CreatureEntry或- GameObjectEntry 持续时间 坐标ID
ACTION_TYPE_ALT_PHASE, //设定阶段 eventPhase -
ACTION_TYPE_ALT_GOB, //打开或关闭物体 GameObjectEntry或- GameObjectEntry 范围
ACTION_TYPE_MOVE_RANDOM
ACTION_TYPE_CAST_SPELL, // 释放技能 SPELL_ID_1, SPELL_ID_2, -
ACTION_TYPE_TALK, // 说话 说话内容 -
ACTION_TYPE_ACTIVE_OR_DEACTIVE_OBJECT, // 激活 CreatureEntry GameObjectEntry -
ACTION_TYPE_SUMMON, // 召唤生物或物体 CreatureEntry或- GameObjectEntry 持续时间 坐标ID
ACTION_TYPE_ALT_PHASE, // 设定阶段 eventPhase -
ACTION_TYPE_ALT_GOB, // 打开或关闭物体 GameObjectEntry或- GameObjectEntry 范围
ACTION_TYPE_FLEE // 逃跑
};
struct CreatureScriptTemplate
@ -158,6 +159,8 @@ public:
void CastRandSpell(Creature* creautre, uint32 diff);
void ReloadCreatureAI(uint32 entry); // 强制重新分配AI
private:
};

View File

@ -0,0 +1,322 @@
AzerothCore 自定义脚本模块 - mod_GhostScripts
此模块为 AzerothCore 提供了强大的自定义脚本功能,允许通过数据库配置实现复杂的游戏对象和生物行为,无需修改核心代码。
🚀 功能特性
核心功能
动态AI分配无需修改creature_template表通过数据库配置自动为生物分配AI
事件驱动:支持多种事件触发机制(进入战斗、血量变化、死亡等)
丰富的动作类型:说话、释放技能、召唤、移动、阶段切换等
阶段系统支持多阶段AI行为适合复杂的Boss战斗
重复执行:支持动作的定时重复执行,可配置随机间隔
延迟执行:支持动作的延迟触发
兼容性
✅ 使用现代的JustEngagedWith而非过时的EnterCombat
✅ 不影响现有的SmartAI和其他AI系统
易用性
📝 中文界面友好的数据库表结构
🔧 详细的字段注释和使用说明
📖 丰富的示例和最佳实践
🐛 完善的错误处理和调试日志
🏗️ 系统架构
组件概览
图表
代码
graph TD
A[数据库配置] --> B[CustomScript]
B --> C[CustomCreatureScriptAI]
C --> D[事件处理器]
C --> E[动作执行器]
F[游戏世界] --> C
C --> F
核心类说明
CustomScript主要的脚本管理类负责从数据库加载配置
CustomCreatureScriptAI自定义AI实现继承自ScriptedAI
CustomCreatureHook动态AI分配钩子在生物创建时自动分配AI
ActionTemplate动作模板结构存储具体的AI行为配置
📦 安装配置
前置要求
AzerothCore服务器最新版本
MySQL数据库
支持自定义模块的编译环境
安装步骤
复制源代码文件
bash
# 将以下文件复制到你的模块目录
src/mod_Scripts/CustomScripts.h
src/mod_Scripts/CreatureScripts.cpp
创建数据库表
sql
-- 在acore_custom数据库中执行
CREATE TABLE IF NOT EXISTS `_自定义AI_生物` (
`生物ID` int NOT NULL,
`事件类型` varchar(50) NOT NULL,
`事件阶段ID` int DEFAULT '0',
`延迟时间` int DEFAULT '0' COMMENT '秒',
`最小重复时间` int DEFAULT '0' COMMENT '秒',
`最大重复时间` int DEFAULT '0' COMMENT '秒',
`动作类型` varchar(50) NOT NULL,
`动作参数1` varchar(255) DEFAULT NULL,
`动作参数2` int DEFAULT '0',
`动作参数3` int DEFAULT '0',
`comment` varchar(255) DEFAULT NULL COMMENT '规则描述'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `_模板_随机技能组` (
`随机技能组ID` int NOT NULL,
`技能ID` int NOT NULL,
`释放下一技能最小延迟` int DEFAULT '0' COMMENT '秒',
`释放下一技能最大延迟` int DEFAULT '0' COMMENT '秒'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注册脚本(在模块加载器中添加)
cpp
AddSC_CustomCreatureScript();
编译并重启服务器
bash
# 重新编译服务器
make -j$(nproc)
# 重启服务器以加载新的AI系统
./worldserver
🗄️ 数据库表结构
主表_自定义AI_生物
字段名 类型 说明
生物ID int 生物模板ID
事件类型 varchar 触发事件(进入战斗/血量变化等)
事件阶段ID int 阶段ID0表示所有阶段
延迟时间 int 动作延迟时间(秒)
最小重复时间 int 动作最小重复时间(秒)
最大重复时间 int 动作最大重复时间(秒)
动作类型 varchar 执行动作类型
动作参数1 varchar 主要动作参数
动作参数2 int 次要动作参数
动作参数3 int 扩展动作参数
comment varchar 规则描述(可选)
辅助表_模板_随机技能组
字段名 类型 说明
随机技能组ID int 技能组标识ID
技能ID int 法术ID
释放下一技能最小延迟 int 最小延迟(秒)
释放下一技能最大延迟 int 最大延迟(秒)
🎯 事件类型详解
1. 进入战斗 (EVENT_TYPE_COMBAT)
触发时机:生物与玩家或其他单位开始战斗
对应函数JustEngagedWith()
使用场景:开场台词、初始技能释放、战斗准备
2. 杀死玩家 (EVENT_TYPE_KILL)
触发时机:生物成功击杀一个单位
对应函数KilledUnit()
使用场景:嘲讽台词、特殊奖励、连击效果
3. 怪物死亡 (EVENT_TYPE_DIED)
触发时机:生物死亡时
对应函数JustDied()
使用场景:遗言、死亡爆炸、召唤援军
4. 血量事件 (EVENT_TYPE_HP_X)
触发时机:生物血量首次降至指定百分比以下
支持阈值90%, 75%, 50%, 25%, 10%
使用场景:阶段转换、愤怒技能、求救信号
5. 重置AI (EVENT_TYPE_RESET)
触发时机AI重置时通常在脱战或重生时
对应函数Reset()
使用场景:状态清理、回到初始阶段
⚡ 动作类型详解
1. 说话 (ACTION_TYPE_TALK)
参数2值 说话方式 范围 说明
0或1 Say 附近 普通说话,附近玩家可见
2 Yell 大范围 大喊,更大范围玩家可见
3 Whisper 单体 密语,仅对当前目标可见
4 区域文本 区域 向当前区域所有玩家发送
5 区域触发 区域 区域触发消息
6 区域文本+触发 区域 同时发送文本和触发消息
7 全服屏幕 全服 向全服玩家发送屏幕消息
参数配置:
动作参数1: 要说的话内容
动作参数2: 说话方式(见上表)
动作参数3: 保留通常为0
2. 释放技能 (ACTION_TYPE_CAST_SPELL)
参数配置:
动作参数1: 主要技能IDspell表中的ID
动作参数2: 备选技能ID可选随机选择
动作参数3: 保留通常为0
特殊功能:
如果同时设置两个技能ID系统会随机选择其中一个释放
支持对当前目标或自身释放技能
3. 设定阶段 (ACTION_TYPE_ALT_PHASE)
参数配置:
动作参数1: 目标阶段ID数字字符串
动作参数2: 保留通常为0
动作参数3: 保留通常为0
使用说明:
阶段系统允许创建复杂的多阶段战斗
不同阶段可以有不同的AI行为
初始阶段为0
4. 召唤 (ACTION_TYPE_SUMMON)
参数配置:
动作参数1: 召唤对象ID正数=生物ID负数=游戏对象ID
动作参数2: 持续时间0=永久)
动作参数3: 召唤位置ID配合自定义传送点系统
5. 移动范围 (ACTION_TYPE_MOVE_RANDOM)
参数配置:
动作参数1: 移动半径(码)
动作参数2: 保留通常为0
动作参数3: 保留通常为0
6. 激活或使失活 (ACTION_TYPE_ACTIVE_OR_DEACTIVE_OBJECT)
参数配置:
动作参数1: 目标GUID或Entry正数=激活,负数=禁用)
动作参数2: 对象类型0=生物1=游戏对象)
动作参数3: 操作模式(负数=按Entry删除其他=按GUID修改状态
📚 使用示例
基础示例
简单的战斗台词
sql
INSERT INTO `_自定义AI_生物` VALUES
('野猪愤怒台词', 3100, '进入战斗', 0, 0, 0, 0, '说话', '你激怒我了!', 1, 0);
死亡时的遗言
sql
INSERT INTO `_自定义AI_生物` VALUES
('守卫临终遗言', 1234, '怪物死亡', 0, 0, 0, 0, '说话', '我...失败了...', 2, 0);
中级示例
血量触发的技能释放
sql
-- BOSS血量50%时释放愤怒技能
INSERT INTO `_自定义AI_生物` VALUES
('BOSS愤怒技能', 12345, '血量低于50%', 0, 2, 0, 0, '释放技能', '12345', 0, 0);
-- 同时说话
INSERT INTO `_自定义AI_生物` VALUES
('BOSS愤怒台词', 12345, '血量低于50%', 0, 0, 0, 0, '说话', '感受我的愤怒!', 2, 0);
定期技能释放
sql
-- 每15-20秒释放一次AOE技能
INSERT INTO `_自定义AI_生物` VALUES
('精英怪AOE', 54321, '进入战斗', 0, 5, 15, 20, '释放技能', '54321', 0, 0);
高级示例
多阶段BOSS战斗
sql
-- 第一阶段:正常战斗
INSERT INTO `_自定义AI_生物` VALUES
('BOSS第一阶段技能', 99999, '进入战斗', 1, 3, 8, 12, '释放技能', '11111', 0, 0);
-- 75%血量时进入第二阶段
INSERT INTO `_自定义AI_生物` VALUES
('BOSS阶段转换', 99999, '血量低于75%', 1, 0, 0, 0, '设定阶段', '2', 0, 0);
INSERT INTO `_自定义AI_生物` VALUES
('BOSS阶段转换台词', 99999, '血量低于75%', 1, 0, 0, 0, '说话', '第二阶段开始!', 2, 0);
-- 第二阶段:更强的技能
INSERT INTO `_自定义AI_生物` VALUES
('BOSS第二阶段技能', 99999, '进入战斗', 2, 2, 5, 8, '释放技能', '22222', 0, 0);
🧩 开发者API
核心方法
cpp
// 重新加载生物AI配置
sCustomScript->ReloadCreatureAI(entry);
// 施放特定类型的法术
sCustomScript->Cast(caster, target, SMT_DIRECT_DMG, 1000);
// 对附近玩家施法
sCustomScript->CastSpellToNearbyPlayers(caster, 12345, 0, 30.0f);
法术修改类型
cpp
enum SpellModTypes {
SMT_DIRECT_DMG, // 直接伤害
SMT_DIRECT_HEAL, // 直接治疗
SMT_MOVE_SPEED_INS, // 移动速度增加
SMT_MOVE_SPEED_DES, // 移动速度减少
SMT_DMG_PCT, // 伤害百分比
SMT_HEAL_PCT, // 治疗百分比
SMT_DMG_PCT_TAKEN, // 承受伤害百分比
SMT_HEAL_PCT_TAKEN, // 承受治疗百分比
SMT_ATTACK_SPEED, // 攻击速度
SMT_STUN, // 昏迷
SMT_STUN_BREAKABLE // 可打破的昏迷
};
⚠️ 注意事项
所有时间参数在数据库中配置为秒,在代码中会自动转换为毫秒
使用 ReloadCreatureAI 可动态重载生物AI配置
生物死亡时会自动清理所有召唤单位
为避免冲突自定义AI生物的事件ID从2开始1保留给血量检查
在开发环境中启用详细日志可查看脚本执行细节
复杂的AI逻辑应拆分为多个简单规则
使用comment字段记录规则用途便于后期维护

View File

@ -0,0 +1,198 @@
_自定义AI_生物 自定义生物AI系统 - 字段依赖关系详细文档
📋 字段层级结构概览
动作类型 (主字段)
├── 说话
│ ├── 动作参数1 = 说话内容文本
│ ├── 动作参数2 = 说话方式类型
│ └── 动作参数3 = 保留参数(通常为0)
├── 释放技能
│ ├── 动作参数1 = 主要技能ID
│ ├── 动作参数2 = 备选技能ID
│ └── 动作参数3 = 保留参数(通常为0)
├── 召唤
│ ├── 动作参数1 = 召唤对象ID
│ ├── 动作参数2 = 持续时间(秒)
│ └── 动作参数3 = 召唤位置ID
├── 设定阶段
│ ├── 动作参数1 = 目标阶段ID
│ ├── 动作参数2 = 保留参数(通常为0)
│ └── 动作参数3 = 保留参数(通常为0)
├── 移动范围
│ ├── 动作参数1 = 移动半径
│ ├── 动作参数2 = 保留参数(通常为0)
│ └── 动作参数3 = 保留参数(通常为0)
└── 激活或使失活
├── 动作参数1 = 目标GUID或Entry
├── 动作参数2 = 对象类型
└── 动作参数3 = 操作模式
🎯 动作类型详细配置规则
动作类型 = "说话"
动作参数1: 说话内容文本
- 类型: 字符串
- 示例: "你激怒我了!"
- 说明: 生物要说的具体话语内容
动作参数2: 说话方式类型
- 0 = Say (普通说话,附近玩家可见)
- 1 = Say (与0相同)
- 2 = Yell (大喊,更大范围玩家可见)
- 3 = Whisper (密语,仅对当前目标玩家可见,需要有玩家目标)
- 4 = 区域文本 (向当前区域所有玩家发送)
- 5 = 区域触发消息 (向当前区域所有玩家发送触发消息)
- 6 = 区域文本+触发消息 (同时发送区域文本和触发消息)
- 7 = 全服屏幕消息 (向全服玩家发送屏幕消息)
动作参数3: 保留参数
- 固定值: 0
- 说明: 当前版本未使用保持为0
动作类型 = "释放技能"
动作参数1: 主要技能ID
- 类型: 字符串(数字)
- 示例: "133" (火球术)
- 说明: spell表中的技能ID必填
动作参数2: 备选技能ID
- 类型: 整数
- 示例: 116 (霜箭术)
- 说明: 可选技能ID如果设置则随机选择主要或备选技能释放
- 特殊值: 0 = 不使用备选技能
动作参数3: 保留参数
- 固定值: 0
- 说明: 当前版本未使用保持为0
动作类型 = "召唤"
动作参数1: 召唤对象ID
- 类型: 字符串(数字)
- 正数 = 生物ID (creature_template.entry)
- 负数 = 游戏对象ID (gameobject_template.entry)
- 示例: "1234" (召唤生物ID 1234)
- 示例: "-180000" (召唤游戏对象ID 180000)
动作参数2: 持续时间(秒)
- 类型: 整数
- 范围: 0-999999
- 0 = 永久存在(直到被杀死或服务器重启)
- >0 = 指定秒数后自动消失
- 示例: 300 = 5分钟后消失
动作参数3: 召唤位置ID
- 类型: 整数
- 0 = 在当前生物位置召唤
- >0 = 使用自定义传送点系统的位置ID
- 说明: 配合自定义传送点系统使用
动作类型 = "设定阶段"
动作参数1: 目标阶段ID
- 类型: 字符串(数字)
- 范围: 0-999
- 示例: "2" (切换到阶段2)
- 说明: AI将切换到指定阶段影响后续事件触发
动作参数2: 保留参数
- 固定值: 0
- 说明: 当前版本未使用保持为0
动作参数3: 保留参数
- 固定值: 0
- 说明: 当前版本未使用保持为0
动作类型 = "移动范围"
动作参数1: 移动半径
- 类型: 字符串(数字)
- 单位: 码(yard)
- 范围: 1-100
- 示例: "10" (在10码范围内随机移动)
动作参数2: 保留参数
- 固定值: 0
- 说明: 当前版本未使用保持为0
动作参数3: 保留参数
- 固定值: 0
- 说明: 当前版本未使用保持为0
动作类型 = "激活或使失活"
动作参数1: 目标GUID或Entry
- 类型: 字符串(数字)
- 正数 = 激活目标对象
- 负数 = 禁用目标对象
- 示例: "12345" (激活GUID为12345的对象)
- 示例: "-12345" (禁用GUID为12345的对象)
动作参数2: 对象类型
- 0 = 生物 (Creature)
- 1 = 游戏对象 (GameObject)
动作参数3: 操作模式
- 负数 = 按Entry查找并删除对象
- 0或正数 = 按GUID查找并修改对象状态
- 示例: -1 (按Entry删除)
- 示例: 0 (按GUID修改状态)
🔄 事件类型与阶段系统关系
事件阶段ID 配置规则
事件阶段ID: 阶段限制
- 0 = 任何阶段都可触发 (推荐用于基础事件)
- 1 = 仅在阶段1触发
- 2 = 仅在阶段2触发
- 3 = 仅在阶段3触发
- ... (以此类推)
阶段系统工作原理:
- 初始阶段: 0
- 阶段切换: 通过"设定阶段"动作实现
- 阶段影响: 只有匹配当前阶段的事件才会触发
⏰ 时间控制系统详解
延迟时间 配置规则
延迟时间: 执行延迟(秒)
- 0 = 立即执行
- >0 = 延迟指定秒数后执行
- 示例: 3 = 事件触发3秒后执行动作
重复时间 配置规则
最小重复时间 & 最大重复时间: 重复执行间隔(秒)
- 两者都为0 = 不重复执行
- 最小=最大 = 固定间隔重复
- 最小<最大 = 随机间隔重复
示例配置:
- 最小=0, 最大=0: 只执行一次
- 最小=10, 最大=10: 每10秒重复一次
- 最小=5, 最大=15: 每5-15秒随机间隔重复
📝 完整配置示例
示例1: 多阶段BOSS完整配置
-- 第一阶段:基础攻击
INSERT INTO `_自定义ai_生物` VALUES
('BOSS第一阶段开场', 12345, '进入战斗', 1, 0, 0, 0, '说话', '愚蠢的冒险者!', 2, 0);
INSERT INTO `_自定义ai_生物` VALUES
('BOSS第一阶段技能', 12345, '进入战斗', 1, 3, 8, 12, '释放技能', '1001', 1002, 0);
-- 75%血量:切换到第二阶段
INSERT INTO `_自定义ai_生物` VALUES
('BOSS阶段转换', 12345, '血量低于75%', 1, 0, 0, 0, '设定阶段', '2', 0, 0);
INSERT INTO `_自定义ai_生物` VALUES
('BOSS阶段转换台词', 12345, '血量低于75%', 1, 1, 0, 0, '说话', '第二阶段开始!', 2, 0);
-- 第二阶段:召唤小怪
INSERT INTO `_自定义ai_生物` VALUES
('BOSS召唤小怪', 12345, '进入战斗', 2, 2, 0, 0, '召唤', '5678', 120, 0);
INSERT INTO `_自定义ai_生物` VALUES
('BOSS第二阶段技能', 12345, '进入战斗', 2, 2, 5, 8, '释放技能', '2001', 0, 0);