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

来自天龙知识库
雪舞留言 | 贡献2026年9月10日 (四) 09:51的版本 (维护配置文件知识库:完整字段、读取范围、手工修改实例与核对状态)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航跳到搜索


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

RepairRate.txt 决定按耐久损耗计算修理费时使用的系数,不是修理成功率,也不决定能修哪种装备。以需求等级 10~19 的武器为例,它使用第 2 行第 3 列;防具和部分饰品使用第 4 列。普通修理、高级修理报价和客户端显示存在差异,修改后应同时核对报价与实际扣费。

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

文件位置与生效

项目 说明
运行文件 ../Public/Config/RepairRate.txt,相对于 Server 工作目录。客户端另有 General 资源组里的 RepairRate.txt;二者是不同副本。
读取程序 Server 计算实际修理费与高级报价;客户端另读同名资源用于显示
生效方法 正常保存并停服,备份并修改实际 Public 副本,随后重启使用该目录的 Server。当前检索范围未发现单独重载入口。若修改费用系数,同步更新客户端实际加载的同名表并重启 Game.exe,再对照报价与扣费。
样本格式 GB18030-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。

样本有 15 条数据行,每行 4 列。服务端允许 1..20 行,但两列编号必须按有效数据行从 1 连续递增,不能排序、跳号或只保留中间一行。

装备等级怎样对应行

装备需求等级 L 使用哪行
0..9 第 1 行,ID=1;客户端本报价函数只接受需求等级大于 0。
10..19 第 2 行,ID=2。
20..29 第 3 行,ID=3。
40..49 第 5 行,ID=5;注意 40 级附加费的入口差异。
一般规则 行号 r = 整数除法(L / 10) + 1;第 15 行对应 140..149,但客户端此报价函数只接受不超过 120 级。

这里的 L 是装备使用需求等级,不是人物等级。服务端对暗器还可能取暗器等级与模板需求等级中的较大值;暗器也有特殊耐久和费用分支,不能直接套用普通武器示例。ID=2 不是物品编号、装备点、对象 ID 或 GUID。

文件格式

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

字段详解

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

字段与类型 含义与修改要点 缺项或特殊值
第 1 列
INT:ID
从 1 开始连续编号,必须等于当前有效数据行号。业务实际按 r-1 的数组位置取行,不能靠改 ID 改变等级段。 空首列跳过整行,后面编号可能失配;重复键报错。0、负数、跳号和交换顺序不合法。
第 2 列
INT:装备级别
等级段编号,必须与第 1 列及有效行号相同。2 表示 10..19 段,不表示只有需求等级 2。 空值或非数字变为 0,不能通过连续编号检查。不要填 10、20、30 来表示十级一段。
第 3 列
FLOAT:武器修理率
武器装备点 0 使用的费用系数。服务端表分支将缺失耐久点数乘 ConfigInfo 的 EquipmentDamagePoint 再乘本值,取整数;不是百分比成功率,不填写百分号。 缺少尾值、空值或非数字可变为 0。负值不能通过服务端检查。使用有限非负小数,拒绝 NaN/Infinity,避免超出费用整数范围;没有通用最大值钳制。0 不保证免费。
第 4 列
FLOAT:防具修理率
服务端表分支用于装备点 1..7:帽子、盔甲、旧护腕位、鞋、腰带、第一戒指、项链。客户端则将非武器都选此列,其他装备位可能与实际扣费走不同公式。 空值等可变为 0,负值不合法。不要把所有非武器都当成服务端必用本列;第二戒指、护符等装备位走服务端退回公式。

常用修改实例

示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件为 ASCII/CRLF,列名用英文便于核对分隔符。

调整需求等级 10~19 武器的修理系数

修改前:

INT	INT	FLOAT	FLOAT
ID	EquipLevel	WeaponRepair	DefenceRepair
1	1	0.00184	0.005
2	2	0.007801095	0.005710784

修改后:

INT	INT	FLOAT	FLOAT
ID	EquipLevel	WeaponRepair	DefenceRepair
1	1	0.00184	0.005
2	2	0.01	0.005710784

定位完整原表中 ID=2 的行,只把第 3 列样本值 0.007801095 改为教学值 0.01。保留第 4 列 0.005710784、两列编号、前一行以及其余 13 行。本片段包含第 1、2 行以说明连续编号,不能覆盖完整 15 行表;英文表头仅便于核对,原文件中文表头可以保留。

已有模板 10100001“泼风刀”需求等级 10、装备点 0、模板最大耐久 125。选择当前最大耐久确为 125、当前耐久为 115 的测试物品,使用可修该武器的普通 NPC 商店,保持 EquipmentDamagePoint=500、商店修理倍率为 1。缺失 10 点耐久,服务端费用由整数部分(10×500×0.007801095)=39,变为整数部分(10×500×0.01)=50,单位为角色金钱最小单位。这不是重新生成装备的操作,也不是只影响泼风刀:同等级段武器共享系数。

同步客户端同名表后,此普通武器在上述条件下显示值也由 39 变为 50。需在修理前记录耐久、报价和余额,修理后比较余额差;不能用修满后的同一状态再次比较。原始代码隔离测试已核对上述结果,实际界面、NPC限制和网络流程需要实测。回退时两端恢复原值 0.007801095 并重启;恢复配置不会退还已经花费的钱。

验证与排查

先检查 4 列、原 15 行及两列编号均为 1..15,浮点列非负且有限。Load RepairRate.txt ... OK! 只说明服务端加载成功。两端原始样本已有部分小数末位不同,不能以同名文件推定内容一致;本例第2行两端原值相同。确认修改的是实际 Public 副本,客户端读取资源已更新,目标装备属于本表费用分支;检查 NPC 修理类型、最高修理等级和角色金钱。不要只看客户端提示就判断收费正确。出现不一致时按下表核对入口,恢复备份后重新登录并用同一耐久条件复查。

普通修理的费用

设 d=最大耐久减当前耐久、D=ConfigInfo.ini 的 EquipmentDamagePoint、k=本表系数。服务端表分支先取 整数部分(d × D × k),正数截去小数部分,不是四舍五入。普通装备需求等级 L≥40 时再加 225 × r + 900,最终计算值小于等于 0 时收取至少 1。已满耐久或最大耐久不大于 0 时,费用辅助函数直接返回 0。D 的样本值为 500,不能把它当成这张表内的默认值。

找不到等级段,或装备点不在 0..7 时,普通修理改用 int((1 - 当前耐久/最大耐久) × 物品基础价格 × 商店修理倍率 + 舍入补量),再处理附加费和最低费用。背包单件入口补量 0.99,身上单件及全部修理入口补量 0.5。不要删行来调整收费,那可能让装备转入另一公式。普通修理还要通过商店允许类型、等级、距离和资金等检查。

三种入口不要混为一谈

入口 与本表相关的差异
服务端普通 NPC 修理 表分支用 D(样本500),只对装备点0..7使用本表;该分支不乘商店倍率。L≥40加固定费,非满耐久最终至少1。普通入口从角色金钱扣款。
GetHighRepairPrice 高级报价 服务端表分支也用 D;附加费条件是 L>40,因此恰好40级与普通修理不同。没有最终至少1的钳制。退回公式用物品基础价和0.99补量,不乘普通商店倍率。
客户端 GetRepairPrice 显示 使用固定500,所有非武器取防具列;L≥40加费后,再乘商店倍率并取整。等级≤0、>120、满耐久或查不到行返回-1。没有至少1的钳制。

因此本表填 0 不能作为统一“免费修理”开关;改商店倍率或 EquipmentDamagePoint 也可能导致显示与扣款不一致。这些是已核对的源码差异,不通过修改本表去掩盖。

客户端副本在哪里

客户端以 General 资源组加载 RepairRate.txt。查看实际 Client/Bin/FairyResources.cfg:[General] 中 FileSystem=*../Data/Config 对应 Client/Data/Config/RepairRate.txt,AxpFileSystem=../Data/Config.axp 对应包内同名成员;其他映射以实际配置为准。不要只改源码样本。表分支的最终扣款由服务端决定,改客户端不能单独降低费用。

服务端 Lua 报价关联

在已有事件提供有效参数时,报价调用为:

local price = GetHighRepairPrice(sceneId, selfId, bagPos)

参数依次为场景 ID、玩家场景对象 ID、背包位置;bagPos 不是物品模板编号或 GUID。该调用只报价:物品指针为空或满耐久时可返回0,人物上下文失败可返回-5,异常路径可能无返回值;非装备或缺模板不是本页推荐调用对象。0不是保证可以成功免费修理,正值也不是修理成功标志。

实际高级修理 DoHighRepair(sceneId, selfId, bagPos, price) 使用脚本传入的第4项扣费,不在内部重新查本表。现有 event/xunhuan/equiprepair.lua 的普通装备分支先取报价再调用;神器分支另有材料与价格处理,不能套用本页示例。高级修理的扣款、失败次数和成功判定另见 GetHighRepairPriceDoHighRepair。本表不改变这些成功判定。

关联与依据

Server/ConfigInfo.ini

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

  • Server/Server/GameServer/Server/Main/GameTable.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Main/GameTable.h:实际加载、解析、字段使用或示例关联依据
  • 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/Item.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Item/ItemTable.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/GameDefine_Item.h:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/Config.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据
  • Client/Client/Game/Object/Item/Obj_Item_Equip.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/Config/RepairRate.txt:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/EquipBase.txt:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Data/Script/event/xunhuan/equiprepair.lua:实际加载、解析、字段使用或示例关联依据

隔离运行原始DBC、表加载、普通修理费用函数、完整高级报价函数和客户端报价函数;人物/物品上下文及客户端数据库用测试替身提供已知状态。未执行扣款、修理动作、游戏界面或数据库,实际业务流程需要实测。