<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.waylee.net/index.php?action=history&amp;feed=atom&amp;title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83%2F%E5%9B%9E%E6%94%B6%E7%B3%BB%E7%BB%9F</id>
	<title>工程参考/回收系统 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.waylee.net/index.php?action=history&amp;feed=atom&amp;title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83%2F%E5%9B%9E%E6%94%B6%E7%B3%BB%E7%BB%9F"/>
	<link rel="alternate" type="text/html" href="https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E5%9B%9E%E6%94%B6%E7%B3%BB%E7%BB%9F&amp;action=history"/>
	<updated>2026-11-15T00:06:34Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E5%9B%9E%E6%94%B6%E7%B3%BB%E7%BB%9F&amp;diff=24598&amp;oldid=prev</id>
		<title>Waylee：​新增回收系统说明：两张配置表、报价与结算事务、每日额度、结果状态与踩坑</title>
		<link rel="alternate" type="text/html" href="https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E5%9B%9E%E6%94%B6%E7%B3%BB%E7%BB%9F&amp;diff=24598&amp;oldid=prev"/>
		<updated>2026-11-14T13:34:37Z</updated>

		<summary type="html">&lt;p&gt;新增回收系统说明：两张配置表、报价与结算事务、每日额度、结果状态与踩坑&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;lua-reference&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;lua-lead&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div role=&amp;quot;heading&amp;quot; aria-level=&amp;quot;2&amp;quot; class=&amp;quot;lua-h1&amp;quot;&amp;gt;回收系统&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;lua-sub&amp;quot;&amp;gt;2 张表 · 214 条回收价 · 13 个结果状态&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
回收系统把背包里的物品按表价换成元宝：客户端选物品 → 服务端逐格报价 → 玩家确认 → 在同一个背包事务里扣物品、加元宝、记当日额度。&lt;br /&gt;
&lt;br /&gt;
查一件物品能回收多少 → [[工程参考/配置文件/Public/ItemRecycle.txt|ItemRecycle.txt]]；改每日上限 → [[工程参考/配置文件/Public/ItemRecycleSettings.txt|ItemRecycleSettings.txt]]；判断某件物品为什么收不了 → 看下面的[[#资格判定|资格判定]]。&lt;br /&gt;
&lt;br /&gt;
== 先分清三个「回收」 ==&lt;br /&gt;
名字里都有「回收」，但货币、配置表和代码路径完全不同，先对号入座再改表。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:18%&amp;quot; | 系统&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:26%&amp;quot; | 玩家看到的效果&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:38%&amp;quot; | 数据来源&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 入口&lt;br /&gt;
|-&lt;br /&gt;
| 物品回收（本页）&lt;br /&gt;
| 背包物品按表价换成元宝&lt;br /&gt;
| ItemRecycle.txt、ItemRecycleSettings.txt&lt;br /&gt;
| 客户端回收界面&lt;br /&gt;
|-&lt;br /&gt;
| 玩家商店收购&lt;br /&gt;
| 把物品卖给店主换交子或金币&lt;br /&gt;
| RecycleItem.txt、RecycleItemClass.txt、RecycleItemType.txt&lt;br /&gt;
| 玩家商店的收购菜单&lt;br /&gt;
|-&lt;br /&gt;
| 物品箱回收次数&lt;br /&gt;
| 控制副本掉落箱允许被回收的次数&lt;br /&gt;
| 无配置表&lt;br /&gt;
| 副本脚本调 Lua 接口&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;code&amp;gt;RecycleItem.txt&amp;lt;/code&amp;gt; 那三张是商店收购白名单，和元宝回收没有任何关系；把物品加进那三张表不会让它变成可回收物品。&lt;br /&gt;
&lt;br /&gt;
== 两张表 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:26%&amp;quot; | 文件&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:26%&amp;quot; | 结构&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:36%&amp;quot; | 关键约束&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 当前样本&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ItemRecycle.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
| 2 列 INT：&amp;lt;code&amp;gt;ItemID&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;YuanBao&amp;lt;/code&amp;gt;&lt;br /&gt;
| ItemID 必须严格递增；价格 1 到 2000000000&lt;br /&gt;
| 214 条，2 到 25000 元宝&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ItemRecycleSettings.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
| 2 列 INT，恰好 1 行：&amp;lt;code&amp;gt;ID&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;DailyLimit&amp;lt;/code&amp;gt;&lt;br /&gt;
| ID 必须为 1；DailyLimit 1 到 2000000000&lt;br /&gt;
| 1 行，10000000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
字段逐条解释见两张表的单独页面。两张表都放在 &amp;lt;code&amp;gt;Public/Config/&amp;lt;/code&amp;gt; 下，客户端不加载，价格与资格全部由服务端算完随包下发。&lt;br /&gt;
&lt;br /&gt;
== 加载与生效 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:22%&amp;quot; | 环节&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:50%&amp;quot; | 实现&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:28%&amp;quot; | 结果&lt;br /&gt;
|-&lt;br /&gt;
| 打开文件&lt;br /&gt;
| &amp;lt;code&amp;gt;GameTable.cpp&amp;lt;/code&amp;gt; 里 &amp;lt;code&amp;gt;SetStrictIntegers(true)&amp;lt;/code&amp;gt; 后 &amp;lt;code&amp;gt;OpenFromTXT&amp;lt;/code&amp;gt;&lt;br /&gt;
| 非整数直接解析失败&lt;br /&gt;
|-&lt;br /&gt;
| 校验并载入&lt;br /&gt;
| &amp;lt;code&amp;gt;ItemRecycle::Config().Load(recycleItems, recycleSettings)&amp;lt;/code&amp;gt;&lt;br /&gt;
| 任一约束不满足，返回 FALSE 并清空已读价格&lt;br /&gt;
|-&lt;br /&gt;
| 失败后果&lt;br /&gt;
| &amp;lt;code&amp;gt;TableInit::Init()&amp;lt;/code&amp;gt; 返回 FALSE，调用方是 &amp;lt;code&amp;gt;Server.cpp&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;Assert(ret)&amp;lt;/code&amp;gt;&lt;br /&gt;
| 表错是起不了服，不是关掉功能&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 没有热重载入口：改完表要停服、替换实际 &amp;lt;code&amp;gt;Public/Config/&amp;lt;/code&amp;gt; 副本、重启 Server。&lt;br /&gt;
* 没有功能开关：&amp;lt;code&amp;gt;FeatureOpen.ini&amp;lt;/code&amp;gt; 里没有回收项，表加载成功系统就可用。&lt;br /&gt;
* 没有 GM 指令：&amp;lt;code&amp;gt;GMList.ini&amp;lt;/code&amp;gt; 里没有回收命令，验证只能走客户端界面。&lt;br /&gt;
&lt;br /&gt;
== 一次回收的五个动作 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:12%&amp;quot; | 动作&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:60%&amp;quot; | 服务端做什么&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:28%&amp;quot; | 可能的返回&lt;br /&gt;
|-&lt;br /&gt;
| Open&lt;br /&gt;
| 分配会话 context，把整包 240 个格子逐格描述（编号、数量、单价、不可回收原因）回给客户端&lt;br /&gt;
| Catalog、Busy、Processing&lt;br /&gt;
|-&lt;br /&gt;
| Quote&lt;br /&gt;
| 按客户端选中的格子做快照与报价，算当日已用额度&lt;br /&gt;
| Quoted、Changed、DailyExceeded、BalanceExceeded、Invalid&lt;br /&gt;
|-&lt;br /&gt;
| Commit&lt;br /&gt;
| 复核快照后原子结算&lt;br /&gt;
| Succeeded、Failed、Expired、Changed、Busy&lt;br /&gt;
|-&lt;br /&gt;
| Query&lt;br /&gt;
| 查询某个请求的最终状态，用于断线或超时后确认&lt;br /&gt;
| 原状态、Processing、OutcomeUnknown&lt;br /&gt;
|-&lt;br /&gt;
| Close&lt;br /&gt;
| 清掉 context 与报价&lt;br /&gt;
| 不返回结果&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
时序约束：&lt;br /&gt;
&lt;br /&gt;
* 两次报价间隔小于 200 毫秒会被拒（Busy），防止连点刷价。&lt;br /&gt;
* 报价有效期 30000 毫秒；超时提交返回 Expired。&lt;br /&gt;
* 提交一旦匹配上报价，&amp;#039;&amp;#039;&amp;#039;无论后续校验是否通过，这份报价都会被消费掉&amp;#039;&amp;#039;&amp;#039;；重试必须重新报价。&lt;br /&gt;
* context 绑定打开时的场景；换场景后心跳会清空 context，旧报价全部作废。&lt;br /&gt;
&lt;br /&gt;
== 资格判定 ==&lt;br /&gt;
=== 整次回收的门禁 ===&lt;br /&gt;
下列任一不满足，打开回收界面只会拿到 Busy：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:30%&amp;quot; | 条件&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:70%&amp;quot; | 说明&lt;br /&gt;
|-&lt;br /&gt;
| 角色与场景&lt;br /&gt;
| 玩家对象、Player、所在场景都存在，且处于可执行逻辑的状态&lt;br /&gt;
|-&lt;br /&gt;
| 没有进行中的回收&lt;br /&gt;
| 同一个角色同时只能有一个回收会话&lt;br /&gt;
|-&lt;br /&gt;
| 元宝入口空闲&lt;br /&gt;
| 元宝票没有待发邮件，&amp;lt;code&amp;gt;CurrencyBlocked&amp;lt;/code&amp;gt; 为假&lt;br /&gt;
|-&lt;br /&gt;
| 不在切场景&lt;br /&gt;
| &amp;lt;code&amp;gt;IsHaveChangeSceneFlag&amp;lt;/code&amp;gt; 为假&lt;br /&gt;
|-&lt;br /&gt;
| 没有待领奖&lt;br /&gt;
| &amp;lt;code&amp;gt;IsHaveAskPrizeFlag&amp;lt;/code&amp;gt; 为假&lt;br /&gt;
|-&lt;br /&gt;
| 不在摆摊&lt;br /&gt;
| &amp;lt;code&amp;gt;IsInStall&amp;lt;/code&amp;gt; 为假&lt;br /&gt;
|-&lt;br /&gt;
| 交易盒空闲&lt;br /&gt;
| &amp;lt;code&amp;gt;m_ExchangBox.m_Status&amp;lt;/code&amp;gt; 为 EXCHANGE_NONE&lt;br /&gt;
|-&lt;br /&gt;
| 没有特定锁位&lt;br /&gt;
| &amp;lt;code&amp;gt;m_BitLock.m_uLowFlags&amp;lt;/code&amp;gt; 的 0x800 位为 0&lt;br /&gt;
|-&lt;br /&gt;
| 数据库不忙&lt;br /&gt;
| 不处于 DDZ 奖励结算的忙碌状态（&amp;lt;code&amp;gt;HappyDDZRewardBusy&amp;lt;/code&amp;gt; 为假）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 逐格判定 ===&lt;br /&gt;
服务端对每个背包格按固定顺序判定，命中即停，这就是客户端提示「不可回收」的原因：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:10%&amp;quot; | 顺序&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:44%&amp;quot; | 判定&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20%&amp;quot; | 返回原因&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:26%&amp;quot; | 玩家看到的含义&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 物品类型是任务物品（&amp;lt;code&amp;gt;ICLASS_TASKITEM&amp;lt;/code&amp;gt;）&lt;br /&gt;
| Quest&lt;br /&gt;
| 任务物品永不回收&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 物品已绑定&lt;br /&gt;
| Bound&lt;br /&gt;
| 绑定物品不可回收&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 有密码锁或物品锁&lt;br /&gt;
| Locked&lt;br /&gt;
| 先解锁&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 已加锁或正在交易&lt;br /&gt;
| Occupied&lt;br /&gt;
| 物品被占用&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 表里查不到价格&lt;br /&gt;
| NotConfigured&lt;br /&gt;
| 这件物品没配回收价&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 装备强化过或镶了宝石&lt;br /&gt;
| 保护位&lt;br /&gt;
| 需要玩家勾选确认后才报价&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 以上都不命中&lt;br /&gt;
| Eligible&lt;br /&gt;
| 可以回收&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
价格查不到与价格为 0 是同一件事：服务端用 &amp;lt;code&amp;gt;Config().Price()&amp;lt;/code&amp;gt; 取价，取不到就是 0，直接判 NotConfigured。但把价格写成 0 会让整表加载失败，所以要让某件物品不可回收只能删行。&lt;br /&gt;
&lt;br /&gt;
== 价格、额度与上限 ==&lt;br /&gt;
* 单格收益 = 表价 × 该格数量。按格计算，不跨格合并，也不看物品在其它格子的堆叠。&lt;br /&gt;
* 每日额度取 &amp;lt;code&amp;gt;ItemRecycleSettings.txt&amp;lt;/code&amp;gt; 的第二列，按&amp;#039;&amp;#039;&amp;#039;角色&amp;#039;&amp;#039;&amp;#039;记在任务数据第 180、181 槽：180 存日序号，181 存当日已得元宝。&lt;br /&gt;
* 日序号 = （Unix 秒 + 8 小时）÷ 86400，即东八区自然日。跨天不写回 0，而是「180 与今天不相等时，已用额度按 0 算」。&lt;br /&gt;
* 报价与提交都校验三件事：当日额度、元宝上限 2000000000、以及两者相加不溢出。&lt;br /&gt;
* 当前样本：额度 10000000（一千万）元宝每天，表内最高单价 25000 元宝，价格分布最集中的是 490 元宝 60 条、99 元宝 27 条、149 元宝 22 条。&lt;br /&gt;
&lt;br /&gt;
额度是「每天最多换出多少元宝」，不是「每天能回收几次」。单价高的物品一两件就能打满，之后当天所有报价都会被判 DailyExceeded。&lt;br /&gt;
&lt;br /&gt;
== 结算是一致性事务 ==&lt;br /&gt;
# 报价时把每个选中格子的完整 &amp;lt;code&amp;gt;_ITEM&amp;lt;/code&amp;gt; 结构存进事务，不是只存编号和数量。&lt;br /&gt;
# 提交时重新逐格比对：GUID、物品编号、可回收原因、保护确认，以及整块 &amp;lt;code&amp;gt;_ITEM&amp;lt;/code&amp;gt; 的内存比较。任一不同判 Changed。&lt;br /&gt;
# 通过后走 &amp;lt;code&amp;gt;CommitBagPlan&amp;lt;/code&amp;gt;，扣物品、&amp;lt;code&amp;gt;SetYuanBao(..., YUANBAO_ITEM_RECYCLE, &amp;quot;物品回收&amp;quot;)&amp;lt;/code&amp;gt;、写 180 与 181 三件事在同一个事务里；任一步失败整体回滚，元宝与额度一起还原。&lt;br /&gt;
# 成功后客户端收到「回收成功，获得N元宝。」的系统提示。&lt;br /&gt;
&lt;br /&gt;
元宝流水里这笔记录的备注是「物品回收」，回滚是「物品回收回滚」，对账时按这两个备注筛。&lt;br /&gt;
&lt;br /&gt;
报价里还记了配置版本（FNV-1a，含额度）和额度值，提交时再比一次，不一致判 Expired。当前没有热重载入口，同一进程内这两项不会变；这段比较是给将来加热重载或跨进程留的保险。&lt;br /&gt;
&lt;br /&gt;
== 结果状态 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:18%&amp;quot; | 状态&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:48%&amp;quot; | 含义&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:34%&amp;quot; | 客户端处理&lt;br /&gt;
|-&lt;br /&gt;
| Catalog&lt;br /&gt;
| 打开成功，回包带整包目录&lt;br /&gt;
| 渲染列表&lt;br /&gt;
|-&lt;br /&gt;
| Quoted&lt;br /&gt;
| 报价成功，回包带本次选中的格子与总收益&lt;br /&gt;
| 展示确认框&lt;br /&gt;
|-&lt;br /&gt;
| Processing&lt;br /&gt;
| 上一次请求还在结算&lt;br /&gt;
| 等待，可继续发 Query&lt;br /&gt;
|-&lt;br /&gt;
| Succeeded&lt;br /&gt;
| 结算成功&lt;br /&gt;
| 刷新背包与元宝&lt;br /&gt;
|-&lt;br /&gt;
| Failed&lt;br /&gt;
| 背包事务提交失败，已整体回滚&lt;br /&gt;
| 提示失败，可重新报价&lt;br /&gt;
|-&lt;br /&gt;
| Changed&lt;br /&gt;
| 选中物品或角色状态与报价时不一致&lt;br /&gt;
| 重新报价&lt;br /&gt;
|-&lt;br /&gt;
| Expired&lt;br /&gt;
| 报价超过 30 秒；或提交时配置版本、额度与报价时不一致（当前没有热重载，正常流程只会因超时触发）&lt;br /&gt;
| 重新报价&lt;br /&gt;
|-&lt;br /&gt;
| Busy&lt;br /&gt;
| 门禁不满足、请求过快或正在结算&lt;br /&gt;
| 稍后重试&lt;br /&gt;
|-&lt;br /&gt;
| DailyExceeded&lt;br /&gt;
| 本次收益超过当日剩余额度&lt;br /&gt;
| 提示今日额度已满&lt;br /&gt;
|-&lt;br /&gt;
| BalanceExceeded&lt;br /&gt;
| 元宝余额加上本次收益会超过上限&lt;br /&gt;
| 提示元宝已达上限&lt;br /&gt;
|-&lt;br /&gt;
| Invalid&lt;br /&gt;
| 事务结构校验失败&lt;br /&gt;
| 重新报价&lt;br /&gt;
|-&lt;br /&gt;
| OutcomeUnknown&lt;br /&gt;
| 找不到对应的请求（重登、请求号不匹配）&lt;br /&gt;
| 重新打开界面&lt;br /&gt;
|-&lt;br /&gt;
| Unavailable&lt;br /&gt;
| 结果结构未初始化&lt;br /&gt;
| 正常流程不会收到&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 和其余系统的互斥 ==&lt;br /&gt;
回收会话进行中时，服务端会拦掉所有可能动到「已预留格子」的包：使用物品、拆分、背包换位、存仓与取仓、交易加物品、丢弃、卖给商店、摆摊上架；元宝相关包整类拦掉。被拦时提示「物品回收正在结算，相关物品暂不能操作。」&lt;br /&gt;
&lt;br /&gt;
另外，元宝票有邮件在处理时整次回收直接判 Busy，避免两个元宝入口同时改余额。&lt;br /&gt;
&lt;br /&gt;
== 常见改法 ==&lt;br /&gt;
=== 让一件物品可回收 ===&lt;br /&gt;
在 &amp;lt;code&amp;gt;ItemRecycle.txt&amp;lt;/code&amp;gt; 追加一行，物品编号必须大于当前最后一条（50613006），价格填 1 到 2000000000。停服重启后生效。&lt;br /&gt;
&lt;br /&gt;
=== 改价 ===&lt;br /&gt;
只改第二列，保持第一列顺序不动。服务端不读客户端，改完重启即可，客户端不需要更新。&lt;br /&gt;
&lt;br /&gt;
=== 改每日额度 ===&lt;br /&gt;
改 &amp;lt;code&amp;gt;ItemRecycleSettings.txt&amp;lt;/code&amp;gt; 的第二列，第一列必须保持 1，且文件只能有一行数据。&lt;br /&gt;
&lt;br /&gt;
=== 只清某个角色的额度 ===&lt;br /&gt;
把该角色任务数据第 180 槽改成 0 或昨天、181 槽改成 0。服务端读到时发现日序号不等于今天，就把已用额度按 0 算。&lt;br /&gt;
&lt;br /&gt;
=== 停用整个系统 ===&lt;br /&gt;
服务端没有开关，也没有「空表即关闭」的写法：&amp;lt;code&amp;gt;Load()&amp;lt;/code&amp;gt; 要求物品表至少一条记录，清空同样会让启动失败。要停用只能改客户端脚本，让它不再调用打开回收界面的方法。&lt;br /&gt;
&lt;br /&gt;
== 容易踩的坑 ==&lt;br /&gt;
=== 是「严格递增」，不是「唯一」 ===&lt;br /&gt;
&amp;lt;code&amp;gt;Load()&amp;lt;/code&amp;gt; 逐行比较当前 ItemID 必须大于上一行。乱序、重复、倒序都会让整表清空并导致启动失败。插入新条目只能追加到末尾，或者整段重排。&lt;br /&gt;
&lt;br /&gt;
=== 表头与类型是硬约束 ===&lt;br /&gt;
两张表都必须恰好 2 列且两列都是 INT；&amp;lt;code&amp;gt;SetStrictIntegers(true)&amp;lt;/code&amp;gt; 下任何空值、非整数都会让解析失败。不要加第三列备注，注释行也无法保留。&lt;br /&gt;
&lt;br /&gt;
=== settings 只能有一行 ===&lt;br /&gt;
&amp;lt;code&amp;gt;Load()&amp;lt;/code&amp;gt; 要求 &amp;lt;code&amp;gt;GetRecordsNum() == 1&amp;lt;/code&amp;gt;，且第一列必须是 1。多写一行、把 ID 写成 2 都会让服务端起不来。&lt;br /&gt;
&lt;br /&gt;
=== 额度按角色，不按账号 ===&lt;br /&gt;
额度存在角色的任务数据里，换角色重新计算；同账号不同角色各自有额度。清额度也要按角色清。&lt;br /&gt;
&lt;br /&gt;
=== 只认背包 ===&lt;br /&gt;
回收遍历的是 0 到 239 号背包格（数组长度 240）。装备栏、银行、临时背包里的物品不会出现在回收列表里，也不会被回收。&lt;br /&gt;
&lt;br /&gt;
=== 回收日志不是流水 ===&lt;br /&gt;
结算只写 &amp;lt;code&amp;gt;CacheLog&amp;lt;/code&amp;gt; 的调试日志，没有可重放的账本。道具找回、玩家申诉不能拿这份日志当依据，要查元宝流水里的「物品回收」备注。&lt;br /&gt;
&lt;br /&gt;
=== 材料价与单测基线绑定 ===&lt;br /&gt;
20500、20501、20502 三个家族（精铁、棉布、秘银）的 1 到 3 级，样本价是 8、40、200，与 &amp;lt;code&amp;gt;ItemRecycle::BuiltinPrice()&amp;lt;/code&amp;gt; 的基准值一致。改这几条价格，&amp;lt;code&amp;gt;Common/tests/ItemRecycle&amp;lt;/code&amp;gt; 的基线断言会失败，需要同步测试。&lt;br /&gt;
== 相关页面 ==&lt;br /&gt;
* [[工程参考/配置文件/Public/ItemRecycle.txt|ItemRecycle.txt]]：回收价目表，逐列说明与修改实例&lt;br /&gt;
* [[工程参考/配置文件/Public/ItemRecycleSettings.txt|ItemRecycleSettings.txt]]：每日额度&lt;br /&gt;
* [[工程参考/配置文件索引|配置文件索引]]：所有配置表按用途分组&lt;br /&gt;
* [[Lua接口/服务端/SetItemBoxRecycleTimes|SetItemBoxRecycleTimes]]：物品箱回收次数，和本系统无关，别混用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Waylee</name></author>
	</entry>
</feed>