修复偷菜后收获果实数不会减少的错误
This commit is contained in:
29
.tasks/2025-11-13_1_garden-steal-bug.md
Normal file
29
.tasks/2025-11-13_1_garden-steal-bug.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# 背景
|
||||||
|
文件名: 2025-11-13_1_garden-steal-bug.md
|
||||||
|
创建于: 2025-11-13_22:02:46
|
||||||
|
创建者: ASUS
|
||||||
|
主分支: main
|
||||||
|
任务分支: (未创建)
|
||||||
|
Yolo模式: Off
|
||||||
|
|
||||||
|
# 任务描述
|
||||||
|
当前菜园系统偷取后完全不会减少收获时的果实数量, 找到这个bug的解决方案
|
||||||
|
|
||||||
|
# 项目概览
|
||||||
|
WPSBot 项目的菜园系统及相关偷取逻辑。
|
||||||
|
|
||||||
|
# 分析
|
||||||
|
在 `garden_service.py` 中,`steal` 会把 `remaining_fruit` 减 1 并更新数据库。
|
||||||
|
但 `harvest` 在结算时仍直接使用 `plot["base_yield"]` 作为产量,并在结算后删除地块记录,完全忽略了被偷后更新过的 `remaining_fruit`。
|
||||||
|
因此,偷取行为不会影响最终收获数量,符合报告的问题表现。
|
||||||
|
|
||||||
|
# 提议的解决方案
|
||||||
|
- 在 `GardenService.harvest` 中使用 `remaining_fruit` 作为实际收获量,确保偷取后的剩余数量被正确结算。
|
||||||
|
- 保留 `base_yield` 仅用于偷取阈值等初始参数,避免改动其它逻辑。
|
||||||
|
|
||||||
|
# 当前执行步骤:"5. 待用户验证"
|
||||||
|
|
||||||
|
# 任务进度
|
||||||
|
- 2025-11-13_23:05:44|已修改:Plugins/WPSGardenSystem/garden_service.py|将收获逻辑切换为使用 `remaining_fruit` 作为产量,并保留初始产量信息|原因:确保偷取后剩余数在收获时生效|阻碍因素:无|状态:未确认
|
||||||
|
|
||||||
|
# 最终审查
|
||||||
@@ -55,6 +55,7 @@ class WPSGardenSteal(WPSGardenBase):
|
|||||||
super().wake_up()
|
super().wake_up()
|
||||||
self.register_plugin("steal")
|
self.register_plugin("steal")
|
||||||
self.register_plugin("偷取")
|
self.register_plugin("偷取")
|
||||||
|
self.register_plugin("偷菜")
|
||||||
|
|
||||||
async def callback(self, message: str, chat_id: int, user_id: int) -> Optional[str]:
|
async def callback(self, message: str, chat_id: int, user_id: int) -> Optional[str]:
|
||||||
payload = self.parse_message_after_at(message).strip()
|
payload = self.parse_message_after_at(message).strip()
|
||||||
|
|||||||
@@ -187,7 +187,10 @@ class GardenService:
|
|||||||
crop = GARDEN_CROPS.get(plot["seed_id"])
|
crop = GARDEN_CROPS.get(plot["seed_id"])
|
||||||
if not crop:
|
if not crop:
|
||||||
raise ValueError("未知作物")
|
raise ValueError("未知作物")
|
||||||
base_yield = int(plot["base_yield"])
|
initial_yield = int(plot["base_yield"])
|
||||||
|
remaining_fruit = int(plot["remaining_fruit"])
|
||||||
|
if remaining_fruit < 0:
|
||||||
|
remaining_fruit = 0
|
||||||
extra_reward = None
|
extra_reward = None
|
||||||
if crop.extra_reward:
|
if crop.extra_reward:
|
||||||
base_rate = crop.extra_reward.base_rate
|
base_rate = crop.extra_reward.base_rate
|
||||||
@@ -199,7 +202,7 @@ class GardenService:
|
|||||||
if crop.extra_reward.kind == "points":
|
if crop.extra_reward.kind == "points":
|
||||||
data = crop.extra_reward.payload
|
data = crop.extra_reward.payload
|
||||||
max_points = min(
|
max_points = min(
|
||||||
data.get("max", base_yield * crop.seed_price),
|
data.get("max", initial_yield * crop.seed_price),
|
||||||
crop.seed_price * self._config.sale_multiplier,
|
crop.seed_price * self._config.sale_multiplier,
|
||||||
)
|
)
|
||||||
min_points = data.get("min", 0)
|
min_points = data.get("min", 0)
|
||||||
@@ -219,9 +222,10 @@ class GardenService:
|
|||||||
}
|
}
|
||||||
result = {
|
result = {
|
||||||
"crop": crop,
|
"crop": crop,
|
||||||
"base_yield": base_yield,
|
"base_yield": remaining_fruit,
|
||||||
"extra": extra_reward,
|
"extra": extra_reward,
|
||||||
}
|
}
|
||||||
|
result["initial_yield"] = initial_yield
|
||||||
cursor = self._db.conn.cursor()
|
cursor = self._db.conn.cursor()
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"DELETE FROM garden_plots WHERE user_id = ? AND plot_index = ?",
|
"DELETE FROM garden_plots WHERE user_id = ? AND plot_index = ?",
|
||||||
|
|||||||
Reference in New Issue
Block a user