From 4a3beb2153965cd3c85f33ca96ff405112a85b3f Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Wed, 12 Nov 2025 17:31:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=82=BC=E9=87=91=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E4=B8=AD=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5-11-12_1_show_adventure_remaining_time.md | 4 +- .tasks/2025-11-12_2_alchemy_material_check.md | 39 +++++++++++++++++++ Plugins/WPSAlchemyGame.py | 20 ++++++---- 3 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 .tasks/2025-11-12_2_alchemy_material_check.md diff --git a/.tasks/2025-11-12_1_show_adventure_remaining_time.md b/.tasks/2025-11-12_1_show_adventure_remaining_time.md index 294ff43..1a8fa27 100644 --- a/.tasks/2025-11-12_1_show_adventure_remaining_time.md +++ b/.tasks/2025-11-12_1_show_adventure_remaining_time.md @@ -31,5 +31,7 @@ WPSCombatSystem 冒险子系统 - 状态:未确认 # 最终审查 -(空) +2025-11-12_16:45:19 +- 结果:用户确认执行成功,冒险系统已支持显示剩余时间倒计时 +- 备注:等待后续进一步测试或上线流程 diff --git a/.tasks/2025-11-12_2_alchemy_material_check.md b/.tasks/2025-11-12_2_alchemy_material_check.md new file mode 100644 index 0000000..be60d44 --- /dev/null +++ b/.tasks/2025-11-12_2_alchemy_material_check.md @@ -0,0 +1,39 @@ +# 背景 +文件名:2025-11-12_2_alchemy_material_check.md +创建于:2025-11-12_17:24:24 +创建者:desktop-l305h65\admin +主分支:main +任务分支:(未创建) +Yolo模式:Off + +# 任务描述 +修复炼金系统扣除重复材料时可能只扣部分并导致异常的问题。 + +# 项目概览 +NewWPSBot 炼金系统。 + +# 分析 +当前物品炼金在 `_handle_item_alchemy` 中逐一扣减材料,每次调用 `set_item_quantity`。当配方包含重复材料且玩家库存恰好等于需求时,前几次扣减会成功,后续重复材料因数量不足触发 `quantity must be non-negative` 异常,导致炼金终止而之前已扣的材料不会回滚。 + +# 提议的解决方案 +在炼金前先统计材料清单,使用合并后的唯一材料和需求总量进行库存校验;所有材料都满足后再按聚合结果一次性扣减,避免部分扣减和异常。 + +# 当前执行步骤:"3. 详细规划" + +# 任务进度 +2025-11-12_17:28:26 +- 已修改:.tasks/2025-11-12_2_alchemy_material_check.md +- 更改:补充分析、解决方案并更新当前步骤 +- 原因:记录炼金材料扣减问题与计划 +- 阻碍因素:无 +- 状态:未确认 + +2025-11-12_17:29:25 +- 已修改:Plugins/WPSAlchemyGame.py +- 更改:聚合材料数量后统一校验并扣减库存 +- 原因:避免重复材料扣除时出现部分扣减和异常 +- 阻碍因素:无 +- 状态:未确认 + +# 最终审查 +(待补充) diff --git a/Plugins/WPSAlchemyGame.py b/Plugins/WPSAlchemyGame.py index 8d548ee..6bfdb4f 100644 --- a/Plugins/WPSAlchemyGame.py +++ b/Plugins/WPSAlchemyGame.py @@ -401,18 +401,24 @@ class WPSAlchemyGame(WPSAPI): material_ids = [item.item_id for item in resolved] backpack: WPSBackpackSystem = Architecture.Get(WPSBackpackSystem) - for item in resolved: - owned = self._get_user_quantity(user_id, item.item_id) - if owned < times: + material_usage = Counter(item.item_id for item in resolved) + name_map = {item.item_id: item.name for item in resolved} + current_quantities: Dict[str, int] = {} + for item_id, single_batch_count in material_usage.items(): + required_amount = single_batch_count * times + current = self._get_user_quantity(user_id, item_id) + current_quantities[item_id] = current + if current < required_amount: + item_name = name_map.get(item_id, item_id) return ( - f"❌ 材料 `{item.name}` 数量不足,需要 {times} 个,当前仅有 {owned} 个" + f"❌ 材料 `{item_name}` 数量不足,需要 {required_amount} 个,当前仅有 {current} 个" ) # 扣除材料 - for item in resolved: - current = self._get_user_quantity(user_id, item.item_id) + for item_id, single_batch_count in material_usage.items(): + required_amount = single_batch_count * times backpack.set_item_quantity( - user_id, item.item_id, current - times + user_id, item_id, current_quantities[item_id] - required_amount ) # 创建炼金记录