工程参考/配置文件/Server/ItemSegAffect.txt
ItemSegAffect.txt 决定新装备在九个品质段之间怎样抽取。改动一条分布可能影响多种装备和来源;先核对 ItemSegQuality.txt 的引用,再改权重。表头虽然写“几率”,填写的是整数权重,不能直接加百分号。
文件位置与生效
| 项目 | 说明 |
|---|---|
| 运行文件 | ./Config/ItemSegAffect.txt,相对于读取程序的工作目录。源码 resources/Server/Config 是样本位置,实际部署可能另有副本。
|
| 读取程序 | Server 游戏进程 |
| 生效方法 | 正常保存并停服后修改各 Server 工作目录下的 Config 文件,重启 Server。当前检索范围未发现这两张表的单独重载入口;无需据此要求客户端同步这两份 Server 配置。若同时修改其他 Public 表或资源,其同步要求另行核对。 |
| 样本格式 | GB18030-compatible,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
固定 11 列 INT。当前样本 480 条,所有行的 total 均等于九个权重之和;分布 1..9 各自只允许一个对应品质段。第一列必须唯一,业务按文件顺序线性查找,不按行号查编号。
先分清这几个编号
| 编号 | 怎样使用 |
|---|---|
| 装备模板号 | 例如 10200001“银背砍山刀”。在 EquipBase.txt 找第一列,再看第 26 列品质随机开关和第 91 列品质分布规则;不是拿物品编号直接查本表。 |
| 品质分布规则 | EquipBase 第 91 列。本例为 10,在 ItemSegQuality.txt 第一列找规则 10。 |
| 创建原因 | 由发物品、掉落或制造的调用入口传来,用于选择规则行里的列。它不是最终品质段。 |
| 品质分布编号 | 从 ItemSegQuality 选中列得到,再查 ItemSegAffect 第一列。 |
| 最终品质段 | ItemSegAffect 的九个权重决定 1..9 中哪一段,另有段内浮动。它不等于物品编号中表示装备档次的数字,也不直接等于某项属性点数。 |
文件格式
首行是类型行:INT INT INT INT INT INT INT INT INT INT INT;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。
字段详解
列号从 1 开始,源码列下标从 0 开始。
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
第 1 列INT:品质分布编号 |
ItemSegQuality 实际选中列引用的编号;不是品质段或物品号。保留已有编号和记录顺序。 | 找不到编号时返回本文件第一条数据记录,包括引用 0、-1 或未存在编号的情况。首条样本恰好是编号 1;不要改首条来批量调整默认值。 |
第 2 列INT:total,总抽取范围 |
先生成 0..1 范围的随机数,乘 total 后用 Float2Int 四舍五入,再与累计权重比较。因此抽取整数范围包含 0 与 total。 | 填写正整数并等于九列非负权重之和,控制在有符号 32 位累加范围。加载器不自动归一化或检查合计。0/空值不会关闭生成,负数不作为合法示例。 |
第 3 列INT:段1几率 |
品质段 1 的权重。程序按段号顺序累加,在累计值非零且随机整数小于或等于累计值时命中。只选择第一处命中。 | 合法配置中 0/空值不增加本段区间,保持非负整数。所有权重均为 0 时抽取不命中,最后仍保留初始段 1,并非停止产出。权重合计低于 total 时还可能因未命中而回到段 1。 |
第 4 列INT:段2几率 |
品质段 2 的权重。程序按段号顺序累加,在累计值非零且随机整数小于或等于累计值时命中。只选择第一处命中。 | 合法配置中 0/空值不增加本段区间,保持非负整数。所有权重均为 0 时抽取不命中,最后仍保留初始段 1,并非停止产出。权重合计低于 total 时还可能因未命中而回到段 1。 |
第 5 列INT:段3几率 |
品质段 3 的权重。程序按段号顺序累加,在累计值非零且随机整数小于或等于累计值时命中。只选择第一处命中。 | 合法配置中 0/空值不增加本段区间,保持非负整数。所有权重均为 0 时抽取不命中,最后仍保留初始段 1,并非停止产出。权重合计低于 total 时还可能因未命中而回到段 1。 |
第 6 列INT:段4几率 |
品质段 4 的权重。程序按段号顺序累加,在累计值非零且随机整数小于或等于累计值时命中。只选择第一处命中。 | 合法配置中 0/空值不增加本段区间,保持非负整数。所有权重均为 0 时抽取不命中,最后仍保留初始段 1,并非停止产出。权重合计低于 total 时还可能因未命中而回到段 1。 |
第 7 列INT:段5几率 |
品质段 5 的权重。程序按段号顺序累加,在累计值非零且随机整数小于或等于累计值时命中。只选择第一处命中。 | 合法配置中 0/空值不增加本段区间,保持非负整数。所有权重均为 0 时抽取不命中,最后仍保留初始段 1,并非停止产出。权重合计低于 total 时还可能因未命中而回到段 1。 |
第 8 列INT:段6几率 |
品质段 6 的权重。程序按段号顺序累加,在累计值非零且随机整数小于或等于累计值时命中。只选择第一处命中。 | 合法配置中 0/空值不增加本段区间,保持非负整数。所有权重均为 0 时抽取不命中,最后仍保留初始段 1,并非停止产出。权重合计低于 total 时还可能因未命中而回到段 1。 |
第 9 列INT:段7几率 |
品质段 7 的权重。程序按段号顺序累加,在累计值非零且随机整数小于或等于累计值时命中。只选择第一处命中。 | 合法配置中 0/空值不增加本段区间,保持非负整数。所有权重均为 0 时抽取不命中,最后仍保留初始段 1,并非停止产出。权重合计低于 total 时还可能因未命中而回到段 1。 |
第 10 列INT:段8几率 |
品质段 8 的权重。程序按段号顺序累加,在累计值非零且随机整数小于或等于累计值时命中。只选择第一处命中。 | 合法配置中 0/空值不增加本段区间,保持非负整数。所有权重均为 0 时抽取不命中,最后仍保留初始段 1,并非停止产出。权重合计低于 total 时还可能因未命中而回到段 1。 |
第 11 列INT:段9几率 |
品质段 9 的权重。程序按段号顺序累加,在累计值非零且随机整数小于或等于累计值时命中。只选择第一处命中。 | 合法配置中 0/空值不增加本段区间,保持非负整数。所有权重均为 0 时抽取不命中,最后仍保留初始段 1,并非停止产出。权重合计低于 total 时还可能因未命中而回到段 1。 |
常用修改实例
示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。
把分布 10 的一部分段 1 权重移给段 2
修改前:
INT INT INT INT INT INT INT INT INT INT INT 品质分布编号 total 段1几率 段2几率 段3几率 段4几率 段5几率 段6几率 段7几率 段8几率 段9几率 10 100000 84703 14286 1000 10 1 0 0 0 0
修改后:
INT INT INT INT INT INT INT INT INT INT INT 品质分布编号 total 段1几率 段2几率 段3几率 段4几率 段5几率 段6几率 段7几率 段8几率 段9几率 10 100000 83703 15286 1000 10 1 0 0 0 0
在原表第一列找到 10。第 3 列段 1 从 84703 改为 83703,第 4 列段 2 从 14286 改为 15286;total 保持 100000,段 3..9 保持 1000、10、1、0、0、0、0。本次转移 1000 个权重单位,合计仍为 100000;段 1 相对减少、段 2 相对增加,其余累计边界不变。不能写成每一百件必有一件升级。
现有 10200001“银背砍山刀”启用品质随机,规则 10 在创建原因 0 时选中分布 10,可用于隔离验证。先检查实际发物品入口传的是原因 0;换成原因 1 会查分布 20,不能验证本例。其他模板和原因对分布 10 的引用同样受到影响。保留全部其他行,三行片段不能覆盖整表。
验证与排查
先查 11 列、唯一编号、正 total、九权重非负且合计一致,确认实际运行副本与引用链。原加载函数没有自己的成功日志,不编造 InitItemSegAffectTable Ok 提示;可结合 Server 初始化结果及创建日志 CreateBlueEquip::ID、Reason、Qual 核对。隔离环境以同模板、同原因统计新生成的段分布,保留足够样本及旧分布对照,检查保存后重登。少量抽取不能证明概率。恢复时停服还原原表并重启,已生成装备需按测试库存另行清理。
为什么不能直接当作精确百分比
例如 total=1000,前两段各 500:随机小数 0.5004 乘 total 后为 500.4,四舍五入为 500,仍命中段 1;到 500.5 才变为 501 并落入段 2。代码使用小于或等于,且随机数是有限精度序列,所以权重比例是配置意图,不是任意样本下的精确频率。本页只验证边界和计算路径,长期分布需要实测。
修改影响哪些物品
两表用于创建装备时选择品质段;多种模板和创建原因可能共用同一分布。先从 EquipBase 的规则号,再从 ItemSegQuality 的实际选中列反向统计引用,不能只看一个物品。品质随机开关为 0 的模板仍先取一次随机数,但保持初始品质段 1。
最终附加属性还取决于装备选中的属性、ItemSegValue 的起始段值、品质段及下一段的倍率、段内浮动和装备的浮动控制。这里只改分布不会凭空增加附加属性条数,也不改变物品模板号。已生成物品保存了品质段和浮动值,重启不会按新分布重新抽签;恢复表格也不会把已发出的装备改回去。
Lua 调用关联
TryRecieveItem 的调用顺序为 TryRecieveItem(sceneId, selfId, itemId, reason):场景 ID、当前场景玩家对象 ID、物品模板号、创建原因。源码里的旧注释把最后一项称为品质段,但当前装备创建路径将它用于选择本页规则列。成功返回背包格,格 0 可以合法;它会实际生成物品,不能当作不产生副作用的检查函数。枚举含义按实际调用链核对,不根据函数参数名猜测。
关联与依据
其他配置及整理状态 · 服务端外网设置 · Lua 接口索引
Server/Server/GameServer/Server/Item/ItemTable.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/ItemTable.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/ItemRuler.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/ItemHelper.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/ItemHelper.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/ItemManager.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/HumanItemLogic.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Ability/AbilityCompound.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Ability/AbilityAdvancedCompound.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Script/LuaFnTbl_Ability.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Script/LuaFnRegister.cpp:实际加载、解析、字段使用或示例关联依据Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据Common/Rand.h:实际加载、解析、字段使用或示例关联依据Common/GameUtil.h:实际加载、解析、字段使用或示例关联依据Common/GameStruct.cpp:实际加载、解析、字段使用或示例关联依据Common/GameStruct_Item.h:实际加载、解析、字段使用或示例关联依据resources/Public/Config/EquipBase.txt:实际加载、解析、字段使用或示例关联依据resources/Server/Config/ItemSegAffect.txt:实际加载、解析、字段使用或示例关联依据resources/Server/Config/ItemSegQuality.txt:实际加载、解析、字段使用或示例关联依据
原始 DBC、两表加载/查询、Float2Int 和创建函数中的品质选择原句经隔离测试。随机输入可控以核对边界;原始随机生成器另做范围检查。未启动游戏或创建真实库存,实际长期分布和保存效果需要实测。