修复炼金系统中的错误
This commit is contained in:
@@ -31,5 +31,7 @@ WPSCombatSystem 冒险子系统
|
|||||||
- 状态:未确认
|
- 状态:未确认
|
||||||
|
|
||||||
# 最终审查
|
# 最终审查
|
||||||
(空)
|
2025-11-12_16:45:19
|
||||||
|
- 结果:用户确认执行成功,冒险系统已支持显示剩余时间倒计时
|
||||||
|
- 备注:等待后续进一步测试或上线流程
|
||||||
|
|
||||||
|
|||||||
39
.tasks/2025-11-12_2_alchemy_material_check.md
Normal file
39
.tasks/2025-11-12_2_alchemy_material_check.md
Normal file
@@ -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
|
||||||
|
- 更改:聚合材料数量后统一校验并扣减库存
|
||||||
|
- 原因:避免重复材料扣除时出现部分扣减和异常
|
||||||
|
- 阻碍因素:无
|
||||||
|
- 状态:未确认
|
||||||
|
|
||||||
|
# 最终审查
|
||||||
|
(待补充)
|
||||||
@@ -401,18 +401,24 @@ class WPSAlchemyGame(WPSAPI):
|
|||||||
material_ids = [item.item_id for item in resolved]
|
material_ids = [item.item_id for item in resolved]
|
||||||
|
|
||||||
backpack: WPSBackpackSystem = Architecture.Get(WPSBackpackSystem)
|
backpack: WPSBackpackSystem = Architecture.Get(WPSBackpackSystem)
|
||||||
for item in resolved:
|
material_usage = Counter(item.item_id for item in resolved)
|
||||||
owned = self._get_user_quantity(user_id, item.item_id)
|
name_map = {item.item_id: item.name for item in resolved}
|
||||||
if owned < times:
|
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 (
|
return (
|
||||||
f"❌ 材料 `{item.name}` 数量不足,需要 {times} 个,当前仅有 {owned} 个"
|
f"❌ 材料 `{item_name}` 数量不足,需要 {required_amount} 个,当前仅有 {current} 个"
|
||||||
)
|
)
|
||||||
|
|
||||||
# 扣除材料
|
# 扣除材料
|
||||||
for item in resolved:
|
for item_id, single_batch_count in material_usage.items():
|
||||||
current = self._get_user_quantity(user_id, item.item_id)
|
required_amount = single_batch_count * times
|
||||||
backpack.set_item_quantity(
|
backpack.set_item_quantity(
|
||||||
user_id, item.item_id, current - times
|
user_id, item_id, current_quantities[item_id] - required_amount
|
||||||
)
|
)
|
||||||
|
|
||||||
# 创建炼金记录
|
# 创建炼金记录
|
||||||
|
|||||||
Reference in New Issue
Block a user