商城链路与「交易类型」配置全解(新手策划入门)
面向新策划的一站式指南:一个物品要能在哪个商城卖、扣玩家哪种货币, 全部由
ObjectBase表里的一列数字「交易类型」决定。 本文讲清这个数字怎么算、填错会出现什么现象、以及新版商城上架的完整流程。适用对象:商城/商店策划、数值策划、新手策划 关联文件:
tbl/ObjectBase.xml、Config/Mall.xml、Config/npctrade.xml
一、先搞懂:游戏里有几种货币、几种商店
玩家购买物品时,花钱的「货币种类」有 5 种,每种对应一个商店:
| 货币 | 商店 |
|---|---|
| 银子 | 普通 NPC 商店 / 随身商店 |
| 金子 | 普通 NPC 商店 / 随身商店 |
| 礼券(积分) | 积分 / 礼券商店 |
| 工资 | 工资商店 |
| 充值点 | 充值点商店 + 新版商城 |
记住一句话:银子和金子共用同一个商店(普通 NPC 商店), 能不能用金子买,取决于交易类型里有没有「金子」这一位。
二、「交易类型」是什么:一个按位打包的开关
2.1 它存在哪里
ObjectBase.xml(物品基础表)中的每个物品都有一列 交易类型,取值就是一个 0~31 的整数。
2.2 位值定义(必须背下来)
把每个货币想成一个独立的开关(位),填的数值就是所有打开开关的数值之和:
| 位(bit) | 数值 | 程序常量 | 含义 | 打开后可在哪买 |
|---|---|---|---|---|
| bit0 | 1 | eBuySilver | 银子购买 | 普通 NPC 商店(扣银子) |
| bit1 | 2 | eBuyGold | 金子购买 | 普通 NPC 商店(扣金子) |
| bit2 | 4 | eBuyTicket | 礼券购买 | 积分 / 礼券商店 |
| bit3 | 8 | eBuySalary | 工资购买 | 工资商店 |
| bit4 | 16 | eBuyChongzhi | 充值点购买 | 充值点商店 / 新版商城 |
程序 / 前端参考:枚举定义
服务端 base/Command.h(第 9296 行)中的定义:
enum enumBuyType
{
eBuySilver = 1 << 0, // = 1 银子
eBuyGold = 1 << 1, // = 2 金子
eBuyTicket = 1 << 2, // = 4 礼券/积分
eBuySalary = 1 << 3, // = 8 工资
eBuyChongzhi = 1 << 4, // = 16 充值点
};
该值在程序中的字段名:zObjectB.cointype(对应 base/zDatabase.h 的 dwField39)。
2.3 怎么算:把要开的位加起来
规则:需要哪几种货币能买,就把对应数值相加,填入交易类型。
例:想让物品「金子 + 礼券 + 工资」都能买 → 2 + 4 + 8 = 14,填 14。
程序会用「交易类型」逐位比对,某一位为 0 就表示「这一位没开,不允许买」:
交易类型 = 14
14 含 2 → 金子可买 ✅
14 含 4 → 礼券可买 ✅
14 含 8 → 工资可买 ✅
14 不含 16 → 充值点不可买 ❌
三、完整购买链路:从点击「购买」到扣钱
玩家点击购买
│
▼
服务端先查该物品的交易类型是否包含「这个商店对应的位」
│
├─ 不包含 → 直接拦截,购买失败(连扣钱流程都进不去)
│
└─ 包含 → 进入对应商店的扣费流程
├─ 普通 NPC 商店:含金子位(2) 扣金子,否则扣银子
├─ 工资商店:扣工资
├─ 积分/礼券商店:扣礼券
├─ 充值点商店:扣充值点
└─ 新版商城:扣充值点 + 额外校验(见 3.2)
3.1 各商店的检查条件与扣费对照表
| 商店 | 检查条件(交易类型需含的位) | 实际扣费 |
|---|---|---|
| 普通 NPC 商店 / 随身商店 | 含金子位(2 eBuyGold) 走金子,否则走银子 | 金子 或 银子 |
| 工资商店 | 工资位(8 eBuySalary) | 工资 |
| 积分 / 礼券商店 | 礼券位(4 eBuyTicket) | 礼券 / 积分 |
| 充值点商店 | 充值点位(16 eBuyChongzhi) | 充值点 |
| 新版商城 | 充值点位(16 eBuyChongzhi) | 充值点 |
3.2 新版商城的额外门槛
新版商城比普通商店多几层校验,必须全部满足才能买到:
- 入口门槛:交易类型必须含充值点位(16)
- 已上架:物品 ID 必须已在
Config/Mall.xml中配置 - 背包有空间
- 未超限:未超过每日限购 / 限时出售限制
- 扣费:扣的是角色充值点,不是金子/银子
第 1 条是硬门槛:交易类型不含 16 的物品,无论
Mall.xml配得多好, 都会在购买入口被拦下,商城购买流程根本不会执行。
四、现有数据体检(配置前必看)
对当前 ObjectBase.xml 全部 5163 条物品统计:
| 交易类型值 | 物品数量 | 实际含义(按当前位值解释) | 典型物品 |
|---|---|---|---|
| 0 | 445 | 无购买类型,商店不可售 | 秘籍、技能书等 |
| 1 | 2274 | 银子(1) | 棉线、铁矿、玉石等基础材料 |
| 6 | 80 | 金子(2) + 礼券(4) | 坐骑图鉴、时装魔盒 |
| 14 | 2364 | 金子(2) + 礼券(4) + 工资(8) | 丝线、棉布等加工材料,以及 50319~50343 商城礼包 |
⚠️ 当前没有任何物品包含充值点位(16), 意味着所有物品都无法用充值点购买, 新版商城目前一个东西都买不了。详见第五章。
五、⚠️ 最大的坑:位值修正过,但表数据没跟着改
5.1 历史沿革
早先的位值是定义错的:
| 币种(程序常量) | 旧数值(错误,已废弃) | 当前数值(正确) |
|---|---|---|
银子 eBuySilver | 1 | 1 |
金子 eBuyGold | 2 | 2 |
礼券 eBuyTicket | 4 | 4 |
工资 eBuySalary | 6 ❌ 与「金子 2 + 礼券 4」完全重叠 | 8 |
充值点 eBuyChongzhi | 8 | 16 |
因为「工资 = 6」和「金子+礼券 = 2+4 = 6」撞车, 导致「金子+礼券能买」的物品自动变成「工资也能买」的漏洞, 已修正为上表右侧的独立位值。
5.2 修正带来的数据语义偏移(重点)
规则改了,但表里那个数字没变,于是同一个数字的含义变了:
| 场景 | 交易类型 = 14 |
|---|---|
| 修正前(旧位值) | ✅ 工资可买;✅ 充值点可买 |
| 修正后(新位值) | ✅ 工资可买;❌ 充值点不可买 |
直接后果:
Config/Mall.xml 中上架的 25 个商城物品交易类型全都是 14,
在新版商城入口被拦截(不含 16)→ 商城购买流程永不执行 →
新版商城完全无法购买。
5.3 结论
修正程序里的位值定义,只是让程序「不容易算错」, 不会自动修正表里已有的数值。 表中的「交易类型」必须由策划同步迁移,否则旧数据语义全部偏移。
六、新版商城 Config/Mall.xml 上架明细
Mall.xml 当前配置 25 个物品(50319 ~ 50343),分 10 个专区,
交易类型全部为 14(即当前全部买不了,需要按第八章修正)。
| 区域 | 区域 ID | 物品(括号内为充值点价格) |
|---|---|---|
| 商品限购区 | 0 | 50319 战力提升礼包(4888)、50320 15星礼包(5998)、50321 轰天碎片礼包(500)、50322 VIP专属礼包(3800)、50323 护身符礼包(498) |
| 热卖商品区 | 1 | 50324 头衔令礼包(500)、50325 小人礼包(9998)、50326 国王令礼包(98) |
| 便利道具区 | 2 | 50327 怪物图鉴礼包(8888)、50328 元神礼包(2498)、50329 私人别墅礼包(9998) |
| 坐骑系列区 | 3 | 50330 万能图鉴卡礼包【大】(648)、50331 鬼谷子礼包(100) |
| 精品材料区 | 4 | 50332 龙星材料礼包【小】(20)、50333 龙星材料礼包【中】(48) |
| 其他商品区 | 5 | 50334 龙星材料礼包【大】(100)、50335 龙星升级宝石【小】(128) |
| VIP 专区 | 6 | 50336 龙星升级宝石【中】(328)、50337 龙星升级宝石【大】(648) |
| 时装专区 | 7 | 50338 龙凤石礼包【小】(128)、50339 龙凤石礼包【中】(328) |
| 武器专区 | 8 | 50340 龙凤石礼包【大】(648)、50341 图谱碎片礼包(9998) |
| 宠物专区 | 9 | 50342 马装礼包(8888)、50343 金山礼包(9998) |
要点:
- 这 25 个物品没有出现在
npctrade.xml的任何 NPC 商店里,只由新版商城出售。 Mall.xml的price列就是充值点价格,不是银子/金子价格。- 上架 = 改
Mall.xml;能否买 = 看ObjectBase的交易类型。两处都要配。
七、交易类型怎么填:速查表
7.1 只在单一商城出售
| 想在哪卖 | 交易类型填 | 计算 |
|---|---|---|
| 仅 NPC 商店(银子) | 1 | 1 |
| 仅 NPC 商店(金子) | 2 | 2 |
| 仅积分 / 礼券商店 | 4 | 4 |
| 仅工资商店 | 8 | 8 |
| 仅充值点商店 / 新版商城 | 16 | 16 |
7.2 多个商城同时出售(数值相加即可)
| 想在哪卖 | 交易类型填 | 计算 |
|---|---|---|
| 新版商城 + 工资 | 24 | 16 + 8 |
| 新版商城 + 积分 | 20 | 16 + 4 |
| 新版商城 + 工资 + 积分 | 28 | 16 + 8 + 4 |
| 新版商城 + 工资 + 积分 + 金子 | 30 | 16 + 8 + 4 + 2 |
| 工资 + 积分 + 金子(现网 14 的含义) | 14 | 8 + 4 + 2 |
| 工资 + 积分 | 12 | 8 + 4 |
| 工资 + 金子 | 10 | 8 + 2 |
| 银子 + 工资 | 9 | 1 + 8 |
7.3 ⚠️ 银子与金子的特殊关系(最容易踩)
普通 NPC 商店的处理逻辑是:
含金子位(2) → 扣金子
不含金子位(2) → 扣银子
所以:
| 需求 | 交易类型 | 结果 |
|---|---|---|
| NPC 商店用银子买 | 填 1(或 0),不要含 2 | 扣银子 |
| NPC 商店用金子买 | 必须含 2 | 扣金子 |
| NPC 银子买 + 工资商城买 | 1 + 8 = 9 | NPC 扣银子,工资商店扣工资 |
| NPC 金子买 + 工资商城买 | 2 + 8 = 10 | NPC 扣金子,工资商店扣工资 |
一个物品不可能同时「在 NPC 用银子买」和「在 NPC 用金子买」—— 只能二选一,由是否含金子位(2) 决定。
八、标准配置流程(SOP)
8.1 上架一个新版商城物品
- 定货币:确认用充值点卖 → 交易类型必须含 16
- 改
ObjectBase.xml:把该物品的「交易类型」改成目标值(仅商城卖就填16) - 配
Config/Mall.xml:- 填物品 ID
- 填
price(充值点价格) - 填区域 ID(0~9,决定陈列在哪个专区)
- 如需限购,配每日限购 / 限时字段
- 确认不冲突:若只想商城独家卖,不要把它写进
npctrade.xml - 重新打包:生成
ObjectBase.tbl2,Mall.xml随配置热更/重启生效 - 自测:进游戏用充值点购买,确认扣除充值点且能进包
8.2 上架一个 NPC 商店物品
- 定货币:银子填
1,金子填2(需要多渠道就相加) - 改
ObjectBase.xml的「交易类型」 - 在
Config/npctrade.xml中把物品挂到对应 NPC 的商店列表,并填售价 - 重新打包并自测(注意观察扣的是银子还是金子)
8.3 存量数据迁移(当前必做)
| 现状 | 问题 | 建议修正 |
|---|---|---|
Mall.xml 的 25 个物品(50319~50343),交易类型 = 14 | 不含 16,新版商城买不了 | 仅商城卖 → 改 16;还要保留金/券/工资 → 改 30 |
| 交易类型 = 6 的 80 条物品(坐骑图鉴、时装魔盒) | 旧规则下曾用于工资商店,修正后只剩「金子+礼券」,丢了工资 | 需保留工资购买 → 改 6 + 8 = 14 |
| 交易类型 = 14 的 2364 条非商城物品 | 修正后含义为「金子+礼券+工资」,不再含充值点 | 无需充值点购买的保持不变;若部分高端装备/特殊材料要进新版商城 → 再叠加 16 变成 30 |
九、常见问题排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 新版商城点购买没反应 / 购买失败 | 物品交易类型不含 16(如仍是 14),购买入口被拦截 | 交易类型改为 16 或含 16 的值 |
| 商城能看到物品,但提示不可购买 | Mall.xml 未上架 | 检查 Mall.xml 中物品 ID |
| 商城买东西扣的钱不对 | 商城固定扣充值点;若扣的是金/银子,说明该物品还挂在 NPC 商店 | 检查交易类型与商店配置 |
| 提示已达购买上限 | 触发每日限购 / 限时限制 | 检查 Mall.xml 限购配置 |
| NPC 商店买东西扣的是金子,想扣银子 | 交易类型含金子位(2) | 去掉 2,改填 1 |
| 工资商店买不了 | 交易类型不含 8 | 加 8 |
| 旧物品以前能工资买,现在不能了 | 位值修正导致语义偏移(旧 6 曾代表工资) | 按 8.3 迁移为 14 |
| 算不出该填几 | 把要开的位数值相加:银1 / 金2 / 券4 / 工资8 / 充值点16 | 对照第七章速查表 |
十、一句话总结
交易类型 = 各货币位值之和(银1、金2、券4、工资8、充值点16)。 想让物品在哪个商城能买,就把对应位打开; 新版商城额外要求「已上架
Mall.xml+ 含 16 位 + 未超限购」。 当前表里没有任何物品开了 16 位,所以新版商城必须先做数据迁移才能用。