工程参考/配置文件/Public/RecycleItem.txt
RecycleItem.txt 是玩家商店的收购目录:店主从客户端菜单选择物品,服务端再按本表第四列检查是否允许新增该物品的收购订单。它不是 NPC 出售商店表,也不是把物品分解成材料的配方。添加一行只是允许申请收购,仍须通过物品类型、数量、摊位状态和资金检查。
文件位置与生效
| 项目 | 说明 |
|---|---|
| 运行文件 | ../Public/Config/RecycleItem.txt,相对于 Server 工作目录。客户端另从 General 资源组加载同名文件,不直接读取服务端目录。
|
| 读取程序 | Server 加载第四列白名单;客户端加载四列用于选择收购物品 |
| 生效方法 | 正常保存并停服,备份实际 Public 副本并修改,再重启 Server。同步客户端实际加载的 RecycleItem.txt,重启 Game.exe 并重新打开玩家商店收购物品选择窗口。当前检索范围未发现此表独立重载入口。 |
| 样本格式 | GB18030-compatible,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
样本 462 行,index 从 0 到 461,每行 4 个整数。Server 将第四列载入白名单,客户端用前面三列组织“分类 → 子类 → 物品”菜单。
三张表如何对应
| 文件 | 在此处的作用 |
|---|---|
| RecycleItemClass.txt | 第一列 ID 是大类号;例如1=铸造材料。当前客户端界面按1..分类数量请求名称,不能任意跳号。 |
| RecycleItemType.txt | 第一列index为记录号,第二列classID与第三列typeID组成子类身份。例如记录0、classID=1、typeID=1,对应矿石。 |
| RecycleItem.txt | 每行第二、三列选择上述分类组合;第四列才是 CommonItem 的物品模板号。同一模板可以在多个分类出现。 |
服务端现有分类表加载函数未在当前检索范围找到启动调用;已确认启动调用的是 InitAllowableItemTable,只读 RecycleItem 第四列。不能把 classID/typeID 当作服务端准入条件。分类页仍在整理,不依据函数名称宣称它们已启用。
文件格式
首行是类型行:INT INT INT INT;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。
字段详解
列号从 1 开始,源码列下标从 0 开始。
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
第 1 列INT:index |
从0开始连续编号,保持等于有效数据行的零基位置。客户端先保存行位置,随后又以这个数做首列键查找;两者不同可能选错物品或查不到。不是物品ID、GUID、背包位置或商店格号。 | Server仅使用DBC首列唯一索引,不验证连续性;客户端正确显示要求连续。空首列整行跳过,重复键报错。添加应追加并取下一个编号;删除中间行必须重排后续编号并同步客户端。 |
第 2 列INT:classID |
客户端大类编号,关联 RecycleItemClass 第一列。例如1是铸造材料、5是工艺材料,属于界面分类,不是 CommonItem 的class字段。 | Server白名单加载不消费本列;0、负数或未知类号不能当作停用。无对应客户端分类可能看不到,但第四列仍可能被服务端允许。 |
第 3 列INT:typeID |
与classID组成一对,关联 RecycleItemType 第二、三列。不是该表首列index;例如不同大类都可以使用typeID=1。 | Server白名单加载不消费本列。未知组合可能不能在菜单选到,但不会据此撤销白名单资格。保留已经存在的合法组合。 |
第 4 列INT:物品id(commonitem表的id) |
实际物品模板编号,Server存入UINT白名单;新增订单还要求模板有效、编号大类为材料(2)且CommonItem能查到。客户端按该编号到自己的CommonItem取名称和图标。 | 缺少行尾值、空值或非数字可为0,触发服务端断言。负数会转无符号值,不是安全禁用。不得超过1024条;重复物品号允许在不同分类出现,但同一白名单身份不叠加权限。 |
常用修改实例
示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件为 ASCII/CRLF,列名用英文便于核对分隔符。
在铸造材料的矿石目录追加白铅矿石
修改前:
INT INT INT INT index classID typeID itemID 461 2 6 20102039
修改后:
INT INT INT INT index classID typeID itemID 461 2 6 20102039 462 1 1 20103013
先核对完整表末行仍是461、2、6、20102039,且没有20103013;本批样本满足这两个条件。保留全部462行,仅在末尾追加新行462、1、1、20103013。这里展示最后一行和追加行用于定位,不要把片段覆盖整表,也不要把片段的两行英文表头插到原表末尾。若运行配置已有人追加过内容,应重新检查下一个编号和既有物品,不机械使用462。
20103013在当前CommonItem为“白铅矿石”,材料大类2、堆叠上限40;classID=1、typeID=1的“铸造材料 → 矿石”已经存在,无须改分类表。它原本未在白名单中,追加后原始加载和订单函数隔离测试确认可以通过白名单检查;客户端分类查询新增一个候选并能找到物品模板。
两端同步后,以有权限的玩家商店店主在空闲收购位尝试数量1、单价1(角色金钱最小单位),商店可用资金至少1。原始订单逻辑通过后从商店资金预留1,并记录目标模板20103013;不是立即从其他玩家背包扣走材料,也不是使用NPC回收价。正式收购的窗口刷新、交付、扣款和库存需要实测。
验证与排查
重启后检查 Load RecycleItem.txt ... OK!,确认463行、index为0..462,前三列分类引用及两端CommonItem模板存在。先打开“铸造材料 → 矿石”确认白铅矿石可选,再以数量1、单价1测试新增订单,核对商店资金和收购条目。能在客户端看到不等于Server允许,Server允许也不保证分类能显示。失败时依次检查实际路径、资源包、连续编号、材料类型、堆叠上限、空位与序列号、权限和资金;不要仅改客户端绕过限制。
新增订单仍有哪些限制
服务端检查白名单后,还核对物品编号有效且为材料、数量不超过物品堆叠上限及订单数量上限、单价范围、商店资金、目标空位与当前序列号。单价和数量来自店主操作,不来自本文件;本表没有价格或收购数量列。只添加装备或不存在的编号不能启用其收购。玩家实际出售时,还检查物品GUID、绑定与锁定、交换规则、目标模板和剩余收购数量,本表不解除这些限制。
移除目录不等于取消已有订单
当前白名单检查在店主新增订单时;已存在订单的出售处理按订单模板与物品状态检查,未重新查询本表。因此删除行并重启不能承诺取消所有已有收购。回退新示例前,应通过正常商店操作处理该物品的未完成订单,再恢复两端备份并重启;不要改数据库强制清除。已成交物品、资金和库存不会随配置恢复自动回滚。
两端同步与重复模板
客户端检查实际 Client/Bin/FairyResources.cfg 的 General 资源映射:FileSystem=*../Data/Config 对应 Client/Data/Config/RecycleItem.txt;AxpFileSystem=../Data/Config.axp 则更新包内同名成员,其他映射以实际配置为准。新增物品还须确认客户端CommonItem有同一模板。
样本20103001既在index=0的铸造矿石,也在index=217的工艺矿石出现,这是不同菜单中的同一模板,不是首列重复错误。仅删其中一行不能把20103001移出白名单。
本页不提供服务端Lua修改白名单的调用;客户端PlayerShop菜单方法属于客户端脚本,不能当作服务端Lua注册函数使用。
关联与依据
其他配置及整理状态 · 服务端外网设置 · Lua 接口索引
Server/Server/GameServer/Server/Main/GameTable.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Main/GameTable.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Packets/CGPlayerShopSaleShopOptHandler.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Other/PlayerShopBuyShopStallBox.h:实际加载、解析、字段使用或示例关联依据Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据Common/GameDefine_Item.h:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据Client/Client/Game/DataPool/GMDataPool.cpp:实际加载、解析、字段使用或示例关联依据Client/Client/Game/Interface/GMInterface_Script_PlayerShop.cpp:实际加载、解析、字段使用或示例关联依据Client/Client/Game/Script/GMScriptSystm.cpp:实际加载、解析、字段使用或示例关联依据Client/Client/Common/TDDBC_Struct.h:实际加载、解析、字段使用或示例关联依据Client/Client/Game/DBC/GMDataBase.cpp:实际加载、解析、字段使用或示例关联依据Client/Client/Render/ResourceProvider.cpp:实际加载、解析、字段使用或示例关联依据Client/Client/Render/RenderSystem.cpp:实际加载、解析、字段使用或示例关联依据Client/Client/Core/Core/FairySystem.cpp:实际加载、解析、字段使用或示例关联依据resources/Client/Bin/FairyResources.cfg:实际加载、解析、字段使用或示例关联依据resources/Client/Data/Interface/SelectRecycleItem/SelectRecycleItem.lua:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RecycleItemClass.txt:实际加载、解析、字段使用或示例关联依据resources/Public/Config/RecycleItemType.txt:实际加载、解析、字段使用或示例关联依据resources/Public/Config/CommonItem.txt:实际加载、解析、字段使用或示例关联依据resources/Client/Data/Config/RecycleItemClass.txt:实际加载、解析、字段使用或示例关联依据resources/Client/Data/Config/RecycleItemType.txt:实际加载、解析、字段使用或示例关联依据resources/Client/Data/Config/RecycleItem.txt:实际加载、解析、字段使用或示例关联依据resources/Client/Data/Config/CommonItem.txt:实际加载、解析、字段使用或示例关联依据
原始DBC、白名单加载和Contains、完整新增订单函数、客户端分类与物品选择方法在独立夹具验证。商店资金、物品模板和网络发送为测试替身;未启动游戏、数据库,未执行真实交易。分类和模板引用核对不等同于游戏实测。