Răsfoiți Sursa

修复作物确认产出时的灾害检测逻辑

问题:
- 这导致即使所有灾害都已清除(status='cleared'),仍被判定为有灾害
- 影响产量计算,使用错误的灾害时产量区间

修复:
- 改为检查是否有活跃灾害(status='active')
- 只有活跃灾害才影响产量计算
- 更新相关日志记录字段名为 has_active_disaster

测试:
- 作物11248有6个已清除的灾害
- 修复前:hasDisaster=true(错误)
- 修复后:hasActiveDisaster=false(正确)
dongasai 6 luni în urmă
părinte
comite
21f750ea64
1 a modificat fișierele cu 19 adăugiri și 10 ștergeri
  1. 19 10
      app/Module/Farm/Logics/CropLogic.php

+ 19 - 10
app/Module/Farm/Logics/CropLogic.php

@@ -1473,13 +1473,22 @@ class CropLogic
             // 2. 获取基础产量(使用发芽期确定的产出配置)
             $outputInfo = $this->getOutputInfoByItemId($seed->id, $crop->final_output_item_id);
 
-            // 检查是否有灾害,如果有灾害则使用灾害时的产量区间
-            $hasDisaster = !empty($crop->disasters);
+            // 检查是否有活跃灾害,只有活跃灾害才影响产量
+            $hasActiveDisaster = false;
+            if (!empty($crop->disasters)) {
+                foreach ($crop->disasters as $disaster) {
+                    if (($disaster['status'] ?? '') === 'active') {
+                        $hasActiveDisaster = true;
+                        break;
+                    }
+                }
+            }
+
             $minBaseAmount = $outputInfo['min_amount'];
             $maxBaseAmount = $outputInfo['max_amount'];
 
-            if ($hasDisaster) {
-                // 有灾害时,使用灾害时的产量区间
+            if ($hasActiveDisaster) {
+                // 有活跃灾害时,使用灾害时的产量区间
                 $disasterMinAmount = $outputInfo['disaster_min_amount'] ?? 500;
                 $disasterMaxAmount = $outputInfo['disaster_max_amount'] ?? 2000;
                 $minBaseAmount = $disasterMinAmount;
@@ -1528,8 +1537,8 @@ class CropLogic
 
             // 如果有丰收之神加持,使用最大可能产量
             if ($hasHarvestBuff) {
-                // 丰收之神加持时的最大产量也要考虑灾害影响
-                $maxPossibleAmount = $hasDisaster ?
+                // 丰收之神加持时的最大产量也要考虑活跃灾害影响
+                $maxPossibleAmount = $hasActiveDisaster ?
                     ($outputInfo['disaster_max_amount'] ?? 2000) :
                     $outputInfo['max_amount'];
 
@@ -1543,8 +1552,8 @@ class CropLogic
             $globalMaxOutput = 3000;
             $finalAmount = min($finalAmount, $globalMaxOutput);
 
-            // 如果有灾害,确保产量不超过产出配置的灾害时最高产量(双重保险)
-            if ($hasDisaster) {
+            // 如果有活跃灾害,确保产量不超过产出配置的灾害时最高产量(双重保险)
+            if ($hasActiveDisaster) {
                 $disasterMaxAmount = $outputInfo['disaster_max_amount'] ?? 2000;
                 $finalAmount = min($finalAmount, $disasterMaxAmount);
             }
@@ -1562,7 +1571,7 @@ class CropLogic
                 'final_amount' => $finalAmount,
                 'land_bonus' => $landOutputBonus,
                 'house_bonus' => $houseOutputBonus,
-                'has_disaster' => $hasDisaster,
+                'has_active_disaster' => $hasActiveDisaster,
                 'disaster_penalty' => $disasterPenalty,
                 'has_harvest_buff' => $hasHarvestBuff,
                 'disaster_max_amount' => $outputInfo['disaster_max_amount'] ?? 2000,
@@ -1576,7 +1585,7 @@ class CropLogic
                 'final_amount' => $finalAmount,
                 'land_bonus' => $landOutputBonus,
                 'house_bonus' => $houseOutputBonus,
-                'has_disaster' => $hasDisaster,
+                'has_active_disaster' => $hasActiveDisaster,
                 'disaster_penalty' => $disasterPenalty,
                 'has_harvest_buff' => $hasHarvestBuff,
                 'disaster_max_amount' => $outputInfo['disaster_max_amount'] ?? 2000,