数据库知识 Database Knowledge

以物易物的商人

游戏中很多商人出售物品的时候都不是直接用金币买的, 而是以物易物. 如果作为 GM 能够自定义各种以物易物的规则, 那么完全可以实现一套自定义的经济体系, 用特定的物品作为货币, 而购买特定的商品都需要用这个特定货币来交换. 我们下面来分析一下这种机制是如何实现的.

我们以达拉然的附魔训练师为例. 这个附魔训练师要求你用 梦境碎片 来换取高阶的附魔配方.

首先在 creature_template 表中搜索 entry = 32514 就能找到这个 NPC 的 ID. 她的 npcflag = 128, 根据 数据库文档 这个 flag 表示的是她是一个 Vendor.

然后在 npc_vendor 搜索 entry == 32514 列出这个 NPC 出售的物品清单. 这个表有一列叫做 ExtendedCost (详细文档请看 https://www.azerothcore.org/wiki/npc_vendor#extendedcost) 如果这个是 0 则表示该物品是一个普通的用金币购买的物品, 反之则是以物换物. 而这个 ExtendedCost 对应的是一个规则的 ID. 这个规则就定义了你需要什么物品, 可以是普通物品, 竞技场点数, 荣誉点数等. 我们以 item = 37339 为例, 这是一个 附魔武器 - 巨人杀手 的配方, 需要 10 个梦境碎片, 对应的 ExtendedCost = 2554.

在游戏客户端中的 .MPQ 数据包中用工具解压后能看到很多 .dbc 文件. 这些文件是游戏的数据文件, 客户端有一份, 服务端也有一份. 一些计算都发生在客户端, 不过服务端会跟客户端用 MD5 指纹进行验证, 确保这个文件没有被窜改. 而 ItemExtendedCost.dbc 文件就储存了这些信息. 你自己解压一下, 找到 ID = 2554 的一栏, 就能看到它需要 10 个 梦境碎片 (ItemId = 34052) 了.

AC 中有一个特殊的表 itemextendedcost_dbc 官方文档里没有提, 但是存在于数据库中. 目测是用来在不修改游戏 .dbc 文件的情况下定义额外的 ExtendedCost 而设计的. 2022-09-08 的时候我实验了, 自己定义了一条记录, 但是没有效果. 结论就是现在做不到用数据库的方式自定义以物换物, 用 Lua 应该是可以的

AC 还有一篇文档 https://www.azerothcore.org/wiki/how-to-import-dbc-data-in-db 介绍了如何修改 DBC 文件并将数据导入到数据库, 但我还没有尝试.