工程参考/配置文件/Server/ItemSerial.ini
ItemSerial.ini 保存非共享内存模式下新物品 GUID 的流水号起点。它是会被程序写回的状态文件,不是物品模板表,也不控制掉落、数量、属性或价格。已有角色和物品的环境,不要把它重置为 0,也不要像普通参数文件那样直接恢复旧备份。
文件位置与生效
| 项目 | 说明 |
|---|---|
| 运行文件 | ./Config/ItemSerial.ini,相对于读取程序的工作目录。源码 resources/Server/Config 是样本位置,实际部署可能另有副本。
|
| 读取程序 | Server 游戏进程的物品管理器,仅在未启用共享内存时读写 |
| 生效方法 | 在正常停服状态核对。非共享内存分支在 Server 初始化物品管理器时读取并尝试写回;运行中改文件不会改变内存中的当前计数。启用共享内存时应核对 ServerInfo.ini 的 ItemSerialKey 与 ShareMemInfo.ini 中 Type=7 的键,不修改本 INI 来重置共享计数。客户端不读取本文件。 |
| 样本格式 | ASCII,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
原始 INI 写回器会把缓冲末字节写为 NUL;这不是编辑器自动追加的可见字符。缺键时的自动补写也不能当作修复:隔离测试中仅有 [ItemConfig] 和 Other=1、并以 CRLF 结束的文件,本来要补写 1000,却写成了可读数值 100。应在停服后由人工确认完整节、键、值和行尾,再核对启动写回,不能故意删除键让程序重建。
只有 [ItemConfig] 的 ItemSerial 一个字段。先查看当前 Server 对应的 ServerInfo.ini [ServerN] EnableShareMem:关闭共享内存时使用本 INI;启用时从 ItemSerialKey 对应的共享数据读取流水号,本 INI 不参与这一分支。不要为让本文件生效而切换存储模式。
文件格式
使用 [节名] 与 Key=Value,节名和键名区分大小写,保持节标题位于行首。用单独一行分号写注释,保留原编码及 CRLF 换行;重复节或键取先匹配项,不依赖后写覆盖。缺项、空值与 0 分别按下表处理。
字段详解
模板 [n] 表示从 0 开始的序号,写入时应展开为实际数字;不是字面键名。
[ItemConfig]
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
ItemSerialINT:十进制流水号起点 |
非共享内存启动时读入为 N,文件写回 N+1000,内存仍为 N;本次运行第一次生成返回 N+1,以后逐次加 1。物品 GUID 由 World、Server 和该流水号共同组成,跟 GemInfo/CommonItem 的模板 index、角色 GUID、对象 ID 或背包格号不同。 | 读取失败将内存初值设为 0,空值或非法数字也可能经 atoi 成为 0。代码不拒绝负数,不自动检查已有物品是否占用。不得用缺项、空值、负数或超出 INT 的数作为修复;还须为启动 +1000 和持续递增保留空间,接近上限时停止生成并专门处理,不能依赖溢出回绕。 |
常用修改实例
示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。
仅在全新空测试环境演示流水号起点
修改前:
[ItemConfig] ItemSerial=0
修改后:
[ItemConfig] ItemSerial=10000
本例仅适用于尚未生成、导入或保存任何物品的全新隔离测试区,且该区原本就采用非共享内存模式,World/Server 标识不与其他数据环境混用。10000 是教学值,不是通用修复值。停服后保留其他文件和存储模式,只将起点由 0 改为 10000。按当前代码,启动写回应为 11000,本次运行首个流水号为 10001;它可能先被启动过程生成的其他物品使用,不能承诺玩家拿到的第一件恰好是此号。有既存物品的环境不适用本例。
验证与排查
在隔离测试环境记录启动前后的文件值、当前 EnableShareMem、WorldID 和 ServerID;关闭共享内存时检查启动后成功写回起点 +1000。物品的 GUID 可在已有物品日志或检查工具中核对,不用物品模板编号代替。程序没有检查 Write/Save 返回值,仅看到 Server 启动成功不能证明写回成功;确认目录可写。共享模式下本 INI 不变是符合读取分支的结果。实际物品生成及持久化恢复仍需要实测。
为什么不能照普通配置恢复旧值
非共享内存代码只在初始化时写回 N+1000,后续每次生成只增加内存计数,本文件不逐件更新。假设某次读取 N=10000,文件写成 11000,本轮生成 1001 次就已经用过 11001。下一次重启从文件 11000 开始,第一次又生成 11001。这个 +1000 的预留不能保证长期运行后不会重用流水号;把起点提高一次也没有修复该机制。
已有数据的恢复必须同时核对保存下来的物品 GUID、共享状态/数据库和同一 World、Server 范围内所有生成来源。旧 INI 备份可能低于实际已用流水号,不应直接覆盖;不能只扫描一个角色的背包就认定找到了全部物品最大号。本页不提供重置数据库或清空共享内存命令。全新测试区如果已按示例生成物品,也不能继续把旧的 0 值恢复回去当作普通回滚。
与共享内存及区服编号的关系
共享内存模式使用 ItemSerialKey 对应的数据,ShareMemory 有独立的数据库读取和保存流程;它不会自动从本 INI 迁移当前计数。两种模式之间迁移需要专门核对数据,不能只切 EnableShareMem。生成 GUID 时 World 和 Server 被转为 BYTE,超出 0 到 255 会截断,不能靠增大区服编号创造可靠的新范围;保持已核对的原标识。
当前源码明确存在上述启动写回与持续生成的区别,原生隔离测试可以复现。实际服的生成速率、其他持久化来源及恢复后的唯一性需要实测和完整数据核查。
关联与依据
Server/ServerInfo.ini · Server/WorldInfo.ini · Server/ShareMemInfo.ini
其他配置及整理状态 · 服务端外网设置 · Lua 接口索引
Common/ServerBase/Ini.cpp:实际加载、解析、字段使用或示例关联依据Common/ServerBase/Ini.h:实际加载、解析、字段使用或示例关联依据Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据Common/ServerBase/Config.cpp:实际加载、解析、字段使用或示例关联依据Common/GameStruct_Item.h:实际加载、解析、字段使用或示例关联依据Common/DB_Struct.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/ItemManager.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/ItemManager.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Main/Server.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Main/ShareMemManager.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/ShareMemory/ShareMemory/ShareData/SMULogicManager.cpp:实际加载、解析、字段使用或示例关联依据
本页以原始 INI 解析器和物品流水号初始化、递增、GUID 赋值函数作隔离验证;共享内存访问以测试桩验证分支。未启动服务或数据库,不代表已验证线上持久化恢复。