工程参考/配置文件/Server/ItemSegAffect.txt

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


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

ItemSegAffect.txt 决定新装备在九个品质段之间怎样抽取。改动一条分布可能影响多种装备和来源;先核对 ItemSegQuality.txt 的引用,再改权重。表头虽然写“几率”,填写的是整数权重,不能直接加百分号。

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

文件位置与生效

项目 说明
运行文件 ./Config/ItemSegAffect.txt,相对于读取程序的工作目录。源码 resources/Server/Config 是样本位置,实际部署可能另有副本。
读取程序 Server 游戏进程
生效方法 正常保存并停服后修改各 Server 工作目录下的 Config 文件,重启 Server。当前检索范围未发现这两张表的单独重载入口;无需据此要求客户端同步这两份 Server 配置。若同时修改其他 Public 表或资源,其同步要求另行核对。
样本格式 GB18030-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 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 可以合法;它会实际生成物品,不能当作不产生副作用的检查函数。枚举含义按实际调用链核对,不根据函数参数名猜测。

关联与依据

Server/ItemSegQuality.txt

其他配置及整理状态 · 服务端外网设置 · 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 和创建函数中的品质选择原句经隔离测试。随机输入可控以核对边界;原始随机生成器另做范围检查。未启动游戏或创建真实库存,实际长期分布和保存效果需要实测。