表概述

gossip_menu 表将对话菜单 ID 与文本 ID 关联起来。当玩家与 NPC 互动时,服务器通过 creature_template 中的 gossip_menu_id 查找对应的菜单,然后在本表中找到要显示的文本 ID,再从 npc_text 表中获取实际的对话文本。

该表使用复合主键 (MenuID, TextID),这意味着同一个菜单可以包含多段不同的文本。

MenuID
int unsigned, 主键
对话菜单的唯一标识符
TextID
int unsigned, 主键
指向 npc_text 表的文本 ID

表结构

字段名数据类型默认值说明
MenuIDint UNSIGNED0对话菜单的唯一 ID,在 creature_template.gossip_menu_id 中引用
TextIDint UNSIGNED0对应的文本 ID,指向 npc_text 表

主键: (MenuID, TextID) | 引擎: InnoDB | 字符集: utf8mb4

重要字段详解

MenuID (对话菜单 ID)

对话菜单的唯一标识符。在 creature_template 表中的 gossip_menu_id 字段中被引用。每个 NPC 通过设置 gossip_menu_id 来指定其对话内容。

  • 建议使用连续的 ID 便于管理
  • 为不同类型的 NPC 预留不同范围的 ID
  • 同一个 MenuID 可以关联多个 TextID,实现多段对话
TextID (文本 ID)

指向 npc_text 表中的具体文本内容。npc_text 表存储了 NPC 对话时显示的实际文本,支持多段随机文本和性别区分。

  • 欢迎语 - NPC 的基本问候文本
  • 任务对话 - 与任务相关的对话内容
  • 商店介绍 - 商人的商品介绍
  • 背景故事 - NPC 的背景信息

实战案例

案例1:为 NPC 创建基础对话菜单

为新手村 NPC 创建一个简单的欢迎对话:

-- 在 npc_text 中创建对话文本
INSERT INTO npc_text (ID, text0_0, lang0, Probability0)
VALUES (50001, '欢迎来到艾泽拉斯,冒险者!有什么我可以帮你的吗?', 0, 1.0);

-- 在 gossip_menu 中关联菜单和文本
INSERT INTO gossip_menu (MenuID, TextID)
VALUES (1000, 50001);

-- 在 creature_template 中为 NPC 设置默认对话菜单
UPDATE creature_template SET gossip_menu_id = 1000 WHERE entry = 12345;

案例2:同一菜单关联多个文本(多段对话)

让同一个菜单在不同条件下显示不同文本:

INSERT INTO gossip_menu (MenuID, TextID) VALUES
(2000, 60001),  -- 默认对话
(2000, 60002),  -- 替代对话1
(2000, 60003);  -- 替代对话2

案例3:删除对话菜单

DELETE FROM gossip_menu WHERE MenuID = 1000;

常见问题

Q: 如何查看某个菜单的所有文本?
SELECT gm.*, nt.text0_0
FROM gossip_menu gm
LEFT JOIN npc_text nt ON gm.TextID = nt.ID
WHERE gm.MenuID = 菜单ID;
Q: 修改对话菜单后需要重启服务器吗?

不需要完全重启,使用 GM 命令重载即可:

.reload gossip_menu
Q: NPC 不显示对话怎么办?
  • creature_template 表中的 gossip_menu_id 是否已设置
  • MenuID 在 gossip_menu 表中是否存在
  • TextID 对应的 npc_text 是否存在
  • NPC 的 npcflag 是否包含对话标志

相关表格