工程参考/配置文件/Public/ShopSceneLimiti.txt

来自天龙知识库
跳到导航跳到搜索


首页 · 配置文件索引 · 修改约定

ShopSceneLimiti.txt 决定某个商店编号能否在当前场景打开。脚本调用 DispatchShopItem 时传入的 sceneId 必须通过本表,否则商店不会下发。它不决定商品、价格或货币;那些在 ShopTable.txt。

位置与生效 · 文件格式 · 字段详解 · 修改实例

文件位置与生效

项目 说明
运行文件 ../Public/Config/ShopSceneLimiti.txt,相对于 Server 工作目录。文件名中的 Limiti 是原名,不要改成 Limit。
读取程序 Server 在静态商店管理器初始化时与 ShopTable 一起加载;打开商店的 Lua 入口调用 IsShopInScene
生效方法 与 ShopTable.txt 一起修改:两表行数必须相同,且同行第一列商店编号相同,否则 StaticShopManager::Init 断言。正常停服后改实际 Public 副本并重启 Server。当前检索范围未发现独立重载入口。客户端目录虽有同名文件,当前客户端源码未找到加载。
样本格式 GB18030-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。

样本 172 行、35 列,与 ShopTable 逐行对齐,第一列同为 1..207 的商店编号。第 2..33 列最多 32 个场景配置编号,第 34 列“是否允许在副本打开”目前只加载未参与授权判断,第 35 列非 0 时任意场景都可通过。

场景编号是什么

编号 含义
第 1 列 Index 商店编号,必须等于同行 ShopTable 第一列,不是行号。
第 2..33 列 SceneInfo.ini 的场景配置编号,例如 1 苏州、2 大理。不是 NPC 对象 ID、角色 GUID 或地图资源内部编号。
空位 样本用 -1 或 0 填满未用槽;IsShopInScene 按相等比较,-1/0 不会匹配正常正数场景。

授权函数先按商店编号找到行,再看第 35 列;为 0 时逐个比较 32 个场景槽。副本场景若使用不同场景编号,不会因为第 34 列而为真。

文件格式

首行是类型行:INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。

字段详解

列号从 1 开始,源码列下标从 0 开始。

字段与类型 含义与修改要点 缺项或特殊值
第 1 列
INT:Index
商店编号,加载时必须等于已经读入的同行 ShopTable 编号。查询仍按编号而不是行号。 与 ShopTable 行数或编号不一致会断言。空首列跳行会破坏对齐。
第 2 列
INT:允许摆放的场景1
第 1 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 3 列
INT:场景2
第 2 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 4 列
INT:场景3
第 3 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 5 列
INT:场景4
第 4 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 6 列
INT:场景5
第 5 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 7 列
INT:场景6
第 6 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 8 列
INT:场景7
第 7 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 9 列
INT:场景8
第 8 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 10 列
INT:场景9
第 9 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 11 列
INT:场景10
第 10 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 12 列
INT:场景11
第 11 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 13 列
INT:场景12
第 12 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 14 列
INT:场景13
第 13 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 15 列
INT:场景14
第 14 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 16 列
INT:场景15
第 15 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 17 列
INT:场景16
第 16 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 18 列
INT:场景17
第 17 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 19 列
INT:场景18
第 18 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 20 列
INT:场景19
第 19 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 21 列
INT:场景20
第 20 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 22 列
INT:场景21
第 21 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 23 列
INT:场景22
第 22 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 24 列
INT:场景23
第 23 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 25 列
INT:场景24
第 24 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 26 列
INT:场景25
第 25 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 27 列
INT:场景26
第 26 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 28 列
INT:场景27
第 27 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 29 列
INT:场景28
第 28 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 30 列
INT:场景29
第 29 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 31 列
INT:场景30
第 30 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 32 列
INT:场景31
第 31 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 33 列
INT:场景32
第 32 个授权场景配置编号。Shop 33 样本为 1、2、186、71、72,其余为 -1。只要其中一个等于当前 sceneId 即通过。 0 或 -1 不能当作“全部场景”。重复填写同一场景不会叠加权限。不要填商店编号或 NPC 号。
第 34 列
INT:是否允许在副本打开
加载到 m_bOpenInCopyScene。当前 IsShopInScene 以及已核对的四个打开商店 Lua 入口都不读取它。 样本部分行为 1。不能承诺改本列就能在副本打开或禁止商店;副本若 sceneId 不同,仍看第 2..33 列或第 35 列。
第 35 列
INT:是否所有场景都能用
非 0 时 IsShopInScene 对任意 sceneId 返回真,不再看 32 个场景槽。Shop 120 等 63 行为 1。 0 必须命中场景槽。不能用本列代替商品表,也不会跳过 NPC 存在等其他检查。

常用修改实例

示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。

让商店 33 在任意场景都能通过授权

修改前:

INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT
Index	允许摆放的场景1	场景2	场景3	场景4	场景5	场景6	场景7	场景8	场景9	场景10	场景11	场景12	场景13	场景14	场景15	场景16	场景17	场景18	场景19	场景20	场景21	场景22	场景23	场景24	场景25	场景26	场景27	场景28	场景29	场景30	场景31	场景32	是否允许在副本打开	是否所有场景都能用
33	0	1	2	186	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	71	72	0	0

修改后:

INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT	INT
Index	允许摆放的场景1	场景2	场景3	场景4	场景5	场景6	场景7	场景8	场景9	场景10	场景11	场景12	场景13	场景14	场景15	场景16	场景17	场景18	场景19	场景20	场景21	场景22	场景23	场景24	场景25	场景26	场景27	场景28	场景29	场景30	场景31	场景32	是否允许在副本打开	是否所有场景都能用
33	0	1	2	186	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	-1	71	72	0	1

定位第一列为 33 的行,确认与 ShopTable 商店 33 对齐。样本第 2..33 列含苏州 1、大理 2、186、71、72,第 34 列为 0,第 35 列为 0。只把第 35 列改为 1,保留 35 列、Tab、其余场景槽和第 34 列。片段含表头与该行,不能覆盖 172 行整表。

改后 IsShopInScene(33, 9) 由假变真,原先未列入的场景配置编号也能通过授权。原始函数隔离测试已核对。这不会改变大理石价格或商票货币,也不会让客户端自己放行;脚本仍要调用打开接口。第 34 列保持 0,因为当前授权函数并不使用它。

恢复时改回 0 并重启。不要只改客户端同名文件。

验证与排查

启动无两表 Version 断言,仍为 172 行且同行编号一致,仅商店 33 的第 35 列为 1。用原先不在列表中的场景调用 DispatchShopItem(..., 33) 应能通过授权检查;改回 0 后同一场景应失败。实际 NPC 对话、距离和背包仍需要实测。

与 ShopTable 必须对齐

Init 先读 ShopTable 再读本表。行数不同或同行商店编号不同都会断言。插入、删除或排序其中一张表时必须同步另一张,并保持第一列编号。

第 34 列为什么不能当开关

源码把该列读进结构,但授权函数只判断“全场景”标志和 32 个场景槽。已核对 DispatchShopItem、DispatchNoNpcShopItem、DispatchYuanbaoShopItem、DispatchNpcYuanbaoShopItem 都调用这个授权函数。副本能否打开应实测副本实际 sceneId,不能只改第 34 列。

客户端

当前客户端 GMDataBase 只登记 ShopTable.txt,未登记本文件。Client/Data/Config 虽有同名样本,不能当作客户端场景授权表。

关联与依据

Public/ShopTable.txt

其他配置及整理状态 · 服务端外网设置 · Lua 接口索引

  • Server/Server/GameServer/Server/Other/ShopManager.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Other/ShopManager.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Main/Server.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Packets/CGShopBuyHandler.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Packets/CGShopSellHandler.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Packets/CGShopRepairHandler.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Script/LuaFnTbl_Shop.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Script/LuaFnRegister.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Item/ItemHelper.h:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据
  • Common/GameDefine2.h:实际加载、解析、字段使用或示例关联依据
  • Common/GameStruct_Item.h:实际加载、解析、字段使用或示例关联依据
  • Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Common/TDDBC_Struct.h:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Game/DBC/GMDataBase.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Game/DataPool/GMDataPool.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Game/DataPool/GMDataPool.h:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Game/Network/PacketHandler/GCShopMerchandiseListHandler.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Render/ResourceProvider.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Render/RenderSystem.cpp:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Core/Core/FairySystem.cpp:实际加载、解析、字段使用或示例关联依据
  • resources/Client/Bin/FairyResources.cfg:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/ShopTable.txt:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/ShopSceneLimiti.txt:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/CommonItem.txt:实际加载、解析、字段使用或示例关联依据
  • resources/Client/Data/Config/ShopTable.txt:实际加载、解析、字段使用或示例关联依据
  • resources/Client/Data/Config/ShopSceneLimiti.txt:实际加载、解析、字段使用或示例关联依据
  • resources/Server/Config/SceneInfo.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Data/Script/city0_building5.lua:实际加载、解析、字段使用或示例关联依据

原始 DBC、与 ShopTable 同行对齐、场景槽比较和全场景标志在隔离夹具验证。副本 sceneId、NPC 距离和真实打开流程需要实测。