表概述

gossip_menu_option 表是对话系统的核心组件。每个选项属于一个特定的菜单(MenuID),并拥有一个选项序号(OptionID)。当玩家选择某个选项时,根据 OptionType 的不同,可以触发打开商店、训练界面、出租车界面、重置天赋、打开银行、飞行点等行为。

该表还支持确认框(BoxCoded、BoxMoney、BoxText)功能,可以在执行选项前要求玩家确认或支付金币。

MenuID
int unsigned, 主键
所属对话菜单 ID
OptionID
smallint unsigned, 主键
菜单内选项序号
OptionType
tinyint unsigned
点击选项后触发的行为类型
OptionText
text
选项显示的文本内容

表结构

字段名数据类型默认值说明
MenuIDint UNSIGNED0对话菜单 ID,对应 gossip_menu.MenuID
OptionIDsmallint UNSIGNED0选项序号,同一菜单内唯一
OptionIconint UNSIGNED0选项前显示的图标类型
OptionTexttextNULL选项显示的文本内容
OptionBroadcastTextIDint0广播文本 ID,用于多语言支持
OptionTypetinyint UNSIGNED0选项类型,定义点击后的行为
OptionNpcFlagint UNSIGNED0NPC 标志位,控制选项的显示条件
ActionMenuIDint UNSIGNED0点击后跳转的目标菜单 ID
ActionPoiIDint UNSIGNED0关联的兴趣点 ID,用于地图标记
BoxCodedtinyint UNSIGNED0是否需要输入确认码(0=否, 1=是)
BoxMoneyint UNSIGNED0执行选项前需要支付的金币数量
BoxTexttextNULL确认框显示的文本内容
BoxBroadcastTextIDint0确认框的广播文本 ID
VerifiedBuildintNULL验证的客户端版本号

主键: (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

相关表格