工程参考/配置文件/Public/RandShop
RandShop 目录是随机 NPC 商店的商品池。ShopTable 只决定哪家店随机、抽出几件、用哪种货币;具体候选物品在对应 INI。15 个样本文件共用同一套读取规则,集中在本页说明。不要按文件名猜测用途,也不要把未引用的 petskillshop.ini 当成已上架商店。
文件位置与生效
| 项目 | 说明 |
|---|---|
| 运行文件 | ../Public/Config/RandShop/ 下各 INI,路径写在 ShopTable 第 14 列,相对于 Server 工作目录。
|
| 读取程序 | Server 在 ShopTable 第 13 列非 0 时按第 14 列路径加载;NPC 场景 shop0..shop3 绑定后抽选上架 |
| 生效方法 | 与 ShopTable 一起备份。停服后修改实际 Public 副本,再重启 Server。当前检索范围未发现独立重载。客户端不读这些 INI。改权重后须重新绑定或刷新动态商店才抽新列表。 |
| 样本格式 | GB18030-compatible,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
怎样接到 ShopTable
| ShopTable 列 | 对随机店的作用 |
|---|---|
| 第 13 列非 0 | 跳过表内 50 组商品,改读第 14 列 INI。 |
| 第 14 列路径 | 例如 ../Public/Config/RandShop/60wufang.ini,大小写按实际路径。 |
| 第 12 列 Num | 抽出件数 nCountForSell,不是 INI 的 Total。 |
| 第 8 列货币 | 金币/交子仍用物品基础价;善恶值等用 INI 的 Value。 |
加载时按 [General] Total 读取 Merchandise0..Merchandise(Total-1)。随后 NPC 初始化若填写 shop0..shop3,会复制该店并按权重抽出 Num 件上架。只调用 DispatchShopItem 打开静态表、NPC 没有动态商店时,随机店货架标记全为未出售,结果是空店。
系列成员
| 文件 | 商店编号与货币 | 样本要点 |
|---|---|---|
Public/RandShop/60wufang.ini
|
商店 75,1 金币 | Total 14,抽出 5,Odds;60 级武防图样池 |
Public/RandShop/70wufang.ini
|
商店 76,1 金币 | Total 24,抽出 10,Odds;70 级武防图样池 |
Public/RandShop/80wufang.ini
|
商店 77,1 金币 | Total 38,抽出 15,Odds;80 级武防图样池 |
Public/RandShop/90wufang.ini
|
商店 78,1 金币 | Total 52,抽出 20,Odds;90 级武防图样池 |
Public/RandShop/100wufang.ini
|
商店 79,1 金币 | Total 66,抽出 25,Odds;100 级武防图样池 |
Public/RandShop/randgemshop.ini
|
商店 101,1 金币 | Total 20,抽出 5,Odds;随机宝石 |
Public/RandShop/dazaotu.ini
|
商店 103,1 金币 | Total 80,抽出 5,Odds;打造图 |
Public/RandShop/shanedian.ini
|
商店 104,2 善恶值 | Total 84,抽出 10,Odds;善恶值商品;购买用显式 Value |
Public/RandShop/xunluozawu.ini
|
商店 105,1 金币 | Total 21,抽出 5,混用;Merchandise0 为 odds,其余为 Odds |
Public/RandShop/shide.ini
|
商店 106,2 善恶值 | Total 9,抽出 5,odds;键名全小写;Total=9 但还有 Merchandise9 |
Public/RandShop/miaojiang_randgemshop.ini
|
商店 109,1 金币 | Total 6,抽出 3,Odds;苗疆宝石,Rebate=7 |
Public/RandShop/qiongzhou_randgemshop.ini
|
商店 110,1 金币 | Total 9,抽出 3,Odds;琼州宝石 |
Public/RandShop/huanglong_randgemshop.ini
|
商店 111,1 金币 | Total 5,抽出 3,Odds;黄龙宝石,Rebate=7 |
Public/RandShop/shuhe_randgemshop.ini
|
商店 186,1 金币 | Total 20,抽出 2,Odds;蜀河宝石 |
Public/RandShop/petskillshop.ini
|
商店 无,— | Total 9,抽出 —,Odds;当前 ShopTable 未引用 |
文件格式
使用 [节名] 与 Key=Value,节名和键名区分大小写,保持节标题位于行首。用单独一行分号写注释,保留原编码及 CRLF 换行;重复节或键取先匹配项,不依赖后写覆盖。缺项、空值与 0 分别按下表处理。
字段详解
模板 [n] 表示从 0 开始的序号,写入时应展开为实际数字;不是字面键名。
[General]
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
Total整数,商品池条数 |
循环 0..Total-1 读取对应 Merchandise 节。样本须从 0 连续编号。超过 1024 先截成 1024,再按 BYTE 作为列表长度,256 会变成 0。 | 缺项断言失败。shide.ini 写 Total=9 却另有 Merchandise9,第 10 条不会加载。 |
[Merchandise[n]]
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
ID整数,物品模板编号 |
n 从 0 到 Total-1。须能在对应物品表查到。不是商店编号、GUID 或背包格。 | 缺项断言。0 会在后续类型解析中视为空物品。 |
CountPerUnit整数,每单位件数 |
一次购买得到的件数。金币/交子计价再乘该件数。 | 缺项断言。小于 0 改为 1,大于 100 改为 100。 |
Count整数,库存上限 |
加载后的有限库存。0 改为 -1 表示不按有限库存。 | 缺项断言。静态下发 MaxNumber 仍为 -1,有限库存主要在动态店。 |
Odds字符串再转浮点,相对权重 |
键名必须是 Odds。抽选权重为 AppearRate×rand()。读不到则为 0。 | 大小写敏感。shide.ini 与 xunluozawu.ini 的 Merchandise0 写成 odds,当前读成 0。缺项不断言,权重为 0。 |
Value整数,显式单价 |
善恶值等非金币/交子货币使用本值。金币/交子购买忽略它,改用物品基础价。 | 缺项断言。60wufang 的 1000 不会改金币价。 |
Rebate整数,折扣分母 |
缺项或非正数按 100。BuyRate=100/Rebate,再参与售价。样本部分宝石店为 7。 | 不是百分比写法。0 或负数记日志后改回 100。 |
常用修改实例
示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。
把 60 级武防随机池第一件图样的出现权重从 1 改为 10
修改前:
[General] Total=14 [Merchandise0] ID=30300006 Count=1 CountPerUnit=1 Odds=1 Value=1000
修改后:
[General] Total=14 [Merchandise0] ID=30300006 Count=1 CountPerUnit=1 Odds=10 Value=1000
在完整 60wufang.ini 中定位 [Merchandise0],确认 ID=30300006(金顶枣阳槊图样)。只把 Odds=1 改成 Odds=10,保留 Count、CountPerUnit、Value、Total=14 以及 Merchandise1..13。键名必须是 Odds,不能写成 odds。本片段去掉了原行尾中文注释,编辑原文件时保留注释和编码。
该文件由 ShopTable 商店 75 引用,货币为金币,抽出数量 5。Odds 是相对权重,只有 NPC 绑定动态商店并执行抽选后才影响哪 5 件出现;金币购买仍用物品基础价 6000,不读 Value=1000。隔离加载确认该条 AppearRate 由 1 变为 10。实际窗口和每次刷新结果需要实测。
验证与排查
启动无 RandomShop 读取断言。商店 75 池 14 条、抽出 5,Merchandise0 的 Odds 为 10。NPC 须在场景初始化 shop0..shop3 绑定 75 后打开,确认图样仍在池中且权重变化。odds 小写不会生效。空店先查是否走了静态表而不是动态店。恢复 INI 与 ShopTable 后重启。
抽选
权重为 Odds×rand(),选出 Num 件。全为 0 时比较用严格大于,结果是池中前 Num 件。不能把单次刷新当成概率证明。
键名
节名、键名大小写必须与源码一致:General、Merchandise0、Odds、Rebate。IniFile 用 strncmp,odds 不等于 Odds。
未引用文件
petskillshop.ini 当前检索范围未发现 ShopTable 或其他启动路径引用。只有把第 14 列指过来才会加载。
打开接口仍是 DispatchShopItem,ShopId 是 ShopTable 第一列,不是 INI 文件名。
关联与依据
Public/ShopTable.txt · Public/ShopSceneLimiti.txt · Public/CommonItem.txt
其他配置及整理状态 · 服务端外网设置 · Lua 接口索引
Server/Server/GameServer/Server/Other/ShopManager.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Other/ShopManager.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Obj/Obj_Monster.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Obj/MonsterManager.cpp:实际加载、解析、字段使用或示例关联依据Common/ServerBase/Ini.cpp:实际加载、解析、字段使用或示例关联依据Common/ServerBase/Ini.h:实际加载、解析、字段使用或示例关联依据Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据Common/GameDefine2.h:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/60wufang.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/70wufang.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/80wufang.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/90wufang.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/100wufang.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/randgemshop.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/dazaotu.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/shanedian.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/xunluozawu.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/shide.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/miaojiang_randgemshop.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/qiongzhou_randgemshop.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/huanglong_randgemshop.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/shuhe_randgemshop.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RandShop/petskillshop.ini:实际加载、解析、字段使用或示例关联依据resources/Public/Config/ShopTable.txt:实际加载、解析、字段使用或示例关联依据
原始 IniFile 与 LoadRandShopFromIni 隔离测试,覆盖 Total、Odds 大小写、缺 Rebate 与显式 Rebate。抽选、NPC 绑定和购买为源码核对;未启动游戏。