gossip_menu_option 表
gossip_menu_option 表定义了 NPC 对话菜单中玩家可以选择的各个选项。它与 gossip_menu 表配合使用,构成 AzerothCore 完整的对话交互系统。玩家通过点击选项可以触发不同的行为,如打开商店、接受训练、乘坐飞行、领取任务等。
表概述
gossip_menu_option 表是对话系统的核心组件。每个选项属于一个特定的菜单(MenuID),并拥有一个选项序号(OptionID)。当玩家选择某个选项时,根据 OptionType 的不同,可以触发打开商店、训练界面、出租车界面、重置天赋、打开银行、飞行点等行为。
该表还支持确认框(BoxCoded、BoxMoney、BoxText)功能,可以在执行选项前要求玩家确认或支付金币。
MenuID
int unsigned, 主键
所属对话菜单 ID
int unsigned, 主键
所属对话菜单 ID
OptionID
smallint unsigned, 主键
菜单内选项序号
smallint unsigned, 主键
菜单内选项序号
OptionType
tinyint unsigned
点击选项后触发的行为类型
tinyint unsigned
点击选项后触发的行为类型
OptionText
text
选项显示的文本内容
text
选项显示的文本内容
表结构
| 字段名 | 数据类型 | 默认值 | 说明 |
|---|---|---|---|
| MenuID | int UNSIGNED | 0 | 对话菜单 ID,对应 gossip_menu.MenuID |
| OptionID | smallint UNSIGNED | 0 | 选项序号,同一菜单内唯一 |
| OptionIcon | int UNSIGNED | 0 | 选项前显示的图标类型 |
| OptionText | text | NULL | 选项显示的文本内容 |
| OptionBroadcastTextID | int | 0 | 广播文本 ID,用于多语言支持 |
| OptionType | tinyint UNSIGNED | 0 | 选项类型,定义点击后的行为 |
| OptionNpcFlag | int UNSIGNED | 0 | NPC 标志位,控制选项的显示条件 |
| ActionMenuID | int UNSIGNED | 0 | 点击后跳转的目标菜单 ID |
| ActionPoiID | int UNSIGNED | 0 | 关联的兴趣点 ID,用于地图标记 |
| BoxCoded | tinyint UNSIGNED | 0 | 是否需要输入确认码(0=否, 1=是) |
| BoxMoney | int UNSIGNED | 0 | 执行选项前需要支付的金币数量 |
| BoxText | text | NULL | 确认框显示的文本内容 |
| BoxBroadcastTextID | int | 0 | 确认框的广播文本 ID |
| VerifiedBuild | int | NULL | 验证的客户端版本号 |
主键: (MenuID, OptionID) | 引擎: InnoDB | 字符集: utf8mb4
重要字段详解
OptionIcon (选项图标)
定义选项前显示的图标类型:
- 0 对话气泡(默认图标)
- 1 商人/购买图标
- 2 训练师/训练图标
- 3 出租车/飞行图标
- 4 公会银行
- 5 宠物训练师
- 6 天赋重置
- 7 拍卖行
- 8 旅店
OptionType (选项类型)
定义点击选项后触发的行为:
- 0 无特殊行为(跳转到 ActionMenuID 指定的菜单)
- 1 打开商人界面(需要 NPC 有商人标志)
- 2 打开训练师界面(需要 NPC 有训练师标志)
- 3 打开出租车/飞行界面
- 4 打开公会银行
- 5 打开宠物训练界面
- 6 重置天赋
- 7 打开拍卖行
- 8 设置旅店绑定点
- 9 打开战场界面
- 10 打开银行
ActionMenuID (跳转菜单)
当 OptionType 为 0 时,点击选项后会跳转到另一个对话菜单(对应的 gossip_menu.MenuID)。这允许创建多层次的对话树结构。
BoxCoded / BoxMoney / BoxText (确认框)
当 BoxCoded 设置为 1 时,玩家需要输入确认码才能执行选项。BoxMoney 指定需要支付的金币(单位:铜币),BoxText 是确认框中显示的文本。
实战案例
案例1:添加商人选项
为 NPC 添加"我想购买物品"选项:
INSERT INTO gossip_menu_option (MenuID, OptionID, OptionIcon, OptionText, OptionType, OptionNpcFlag)
VALUES (1000, 0, 1, '我想购买物品', 1, 128);
案例2:添加训练师选项
INSERT INTO gossip_menu_option (MenuID, OptionID, OptionIcon, OptionText, OptionType, OptionNpcFlag)
VALUES (1001, 0, 2, '我想接受训练', 2, 16);
案例3:添加需要付费确认的选项
重置天赋需要 10000 铜币(1 金币),玩家需要确认:
INSERT INTO gossip_menu_option (MenuID, OptionID, OptionIcon, OptionText, OptionType, BoxMoney, BoxText)
VALUES (1002, 0, 6, '我想重置天赋', 6, 10000, '重置天赋需要花费 10000 铜币,确定要继续吗?');
案例4:创建多级对话菜单
-- 主菜单选项,跳转到子菜单
INSERT INTO gossip_menu_option (MenuID, OptionID, OptionIcon, OptionText, OptionType, ActionMenuID)
VALUES (2000, 0, 0, '了解暴风城的历史', 0, 2001);
-- 子菜单中定义具体的对话选项
INSERT INTO gossip_menu_option (MenuID, OptionID, OptionIcon, OptionText, OptionType, ActionMenuID)
VALUES (2001, 0, 0, '暴风城的建立', 0, 0),
(2001, 1, 0, '第一次大战', 0, 0),
(2001, 2, 0, '返回主菜单', 0, 2000);
常见问题
Q: 如何查看某个菜单的所有选项?
SELECT * FROM gossip_menu_option WHERE MenuID = 菜单ID ORDER BY OptionID;
Q: 选项不显示的原因?
- OptionNpcFlag 设置不正确(需要与 NPC 的 npcflag 匹配)
- conditions 表中的条件不满足
- OptionText 为空
- MenuID 在 gossip_menu 表中不存在
Q: 修改后如何重新加载?
.reload gossip_menu_option
相关表格
- gossip_menu - 对话菜单定义
- npc_text - 对话文本内容
- creature_template - NPC 模板定义
- conditions - 条件控制系统
- points_of_interest - 兴趣点定义