Explorar o código

feat(pet): 实现宠物自动技能逻辑

- 新增获取用户可收获土地、空闲土地和有作物土地的功能
- 新增获取用户种子物品的功能
-完善宠物自动种植和收获逻辑
- 实现自动清除灾害的功能,包括检查土地灾害和使用道具清除灾害
- 优化技能统计记录逻辑
notfff hai 7 meses
pai
achega
7475c00fed

+ 1 - 0
UCore/Db/Helper.php

@@ -32,4 +32,5 @@ class Helper
 
     }
 
+
 }

+ 3 - 0
app/Module/AppGame/Handler/Land/SowHandler.php

@@ -11,6 +11,8 @@ use App\Module\GameItems\Services\ItemService;
 use Google\Protobuf\Internal\Message;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Log;
+use UCore\Db\Helper;
+use UCore\DcatAdmin\Herlper;
 use Uraus\Kku\Common\LastData;
 use Uraus\Kku\Request\RequestLandSow;
 use Uraus\Kku\Response\ResponseLandSow;
@@ -82,6 +84,7 @@ class SowHandler extends BaseHandler
             // 提交事务
             DB::commit();
 
+
             // LastData 由中间件处理
 
             Log::info('用户种植成功', [

+ 5 - 6
app/Module/AppGame/Listeners/AppGameProtobufResponseListener.php

@@ -129,19 +129,18 @@ class AppGameProtobufResponseListener
 
         // 土地变更数据 start
         try {
-            $landChanges = LandTemp::getUserLandChanges($user_id);
-            $landStatusChanges = LandTemp::getUserLandStatusChanges($user_id);
+            $landStatusChanges = LandTemp::getUserLandChanges($user_id);
+
 
             // 合并两种土地变更数据,获取所有变更的土地ID
-            $allLandChanges = array_merge($landChanges, $landStatusChanges);
-            $changedLandIds = array_keys($allLandChanges);
+
+            $changedLandIds = array_keys($landStatusChanges);
 
             if (!empty($changedLandIds)) {
                 Log::info('处理土地变更数据', [
                     'user_id' => $user_id,
                     'changed_land_ids' => $changedLandIds,
-                    'land_changes_count' => count($landChanges),
-                    'status_changes_count' => count($landStatusChanges)
+                    'land_changes_count' => count($landStatusChanges),
                 ]);
 
                 $landLs = [];

+ 4 - 1
app/Module/Farm/Validators/RemovableStatusValidator.php

@@ -7,7 +7,7 @@ use UCore\Validator;
 
 /**
  * 可铲除状态验证器
- * 
+ *
  * 验证土地状态是否允许铲除作物
  */
 class RemovableStatusValidator extends Validator
@@ -30,6 +30,9 @@ class RemovableStatusValidator extends Validator
             return false;
         }
 
+
+        return true;
+        // 不再验证土地状态
         try {
             // 检查土地状态是否允许铲除作物
             // 只有种植中、可收获、枯萎状态才能铲除

+ 1 - 3
app/Module/Game/AdminControllers/TempDataController.php

@@ -92,14 +92,13 @@ class TempDataController extends AdminController
         // 获取所有暂存数据
         $itemChanges = $this->itemTempService->getUserItemChanges($userId);
         $landChanges = $this->landTempService->getUserLandChanges($userId);
-        $landStatusChanges = $this->landTempService->getUserLandStatusChanges($userId);
         $houseChange = $this->houseTempService->getUserHouseChange($userId);
         $petUpdates = $this->petTempService->getUserPetUpdates($userId);
         $petStatus = $this->petTempService->getUserPetStatus($userId);
         $fundChanges = $this->fundTempService->getUserFundChanges($userId);
 
         // 检查是否有任何暂存数据
-        $hasAnyData = !empty($itemChanges) || !empty($landChanges) || !empty($landStatusChanges)
+        $hasAnyData = !empty($itemChanges) || !empty($landChanges)
                     || $houseChange !== null || !empty($petUpdates) || !empty($petStatus)
                     || !empty($fundChanges);
 
@@ -109,7 +108,6 @@ class TempDataController extends AdminController
             'username' => $user->username,
             'itemChanges' => $itemChanges,
             'landChanges' => $landChanges,
-            'landStatusChanges' => $landStatusChanges,
             'houseChange' => $houseChange,
             'petUpdates' => $petUpdates,
             'petStatus' => $petStatus,

+ 5 - 8
app/Module/Game/Dtos/LandChangeTempDto.php

@@ -20,19 +20,16 @@ class LandChangeTempDto extends BaseDto
      */
     public int $landId;
 
-    /**
-     * 土地位置
-     *
-     * @var int
-     */
-    public int $position;
+
 
     /**
      * 土地类型
      *
      * @var int
      */
-    public int $landType;
+    public int $landType = 0;
+
+    public int $position = 0;
 
     /**
      * 旧土地类型(仅在类型变更时有值)
@@ -81,7 +78,7 @@ class LandChangeTempDto extends BaseDto
      *
      * @var string
      */
-    public string $changeType;
+    public string $changeType =  'type';
 
     /**
      * 更新时间戳

+ 10 - 17
app/Module/Game/Listeners/CropPlantedListener.php

@@ -29,27 +29,20 @@ class CropPlantedListener
             ]);
 
             // 创建土地状态变更事件数据
-            $landStatusData = [
-                'land_id' => $event->land->id,
-                'position' => $event->land->position,
-                'land_type' => $event->land->land_type,
-                'old_status' => \App\Module\Farm\Enums\LAND_STATUS::IDLE->value,
-                'new_status' => \App\Module\Farm\Enums\LAND_STATUS::PLANTING->value,
-                'crop_id' => $event->crop->id,
-                'updated_at' => time(),
-            ];
 
-            // 构建临时数据键,按用户ID进行存储
-            $tempKey = LandTemp::TEMP_KEY_STATUS_PREFIX . $event->userId;
+            // 创建LandStatusChangedEvent并让LandTemp处理
+            $landStatusChangedEvent = new \App\Module\Farm\Events\LandStatusChangedEvent(
+                $event->userId,
+                $event->land->id,
+                $event->land->status, // 旧状态
+                $event->land->status  // 新状态(作物状态变更不改变土地状态,但需要通知前端)
+            );
+
+            // 使用LandTemp的统一处理方法
+            LandTemp::handleLandStatusChanged($landStatusChangedEvent);
 
-            // 获取当前用户的土地状态变更临时数据
-            $userLandsStatusTemp = \UCore\Helper\Cache::get($tempKey, []);
 
-            // 将新的土地状态变更数据添加到临时数据中
-            $userLandsStatusTemp[$event->land->id] = \App\Module\Game\Dtos\LandStatusTempDto::fromArray($landStatusData);
 
-            // 将更新后的临时数据存回缓存
-            \UCore\Helper\Cache::put($tempKey, $userLandsStatusTemp, LandTemp::TEMP_TTL);
 
             Log::info('作物种植事件处理成功,土地状态变更数据已存储', [
                 'user_id' => $event->userId,

+ 21 - 25
app/Module/Game/Listeners/DisasterClearedListener.php

@@ -13,6 +13,7 @@ use Illuminate\Support\Facades\Log;
  */
 class DisasterClearedListener
 {
+
     /**
      * 处理事件
      *
@@ -23,8 +24,8 @@ class DisasterClearedListener
     {
         try {
             Log::info('Game模块接收到灾害清理事件', [
-                'user_id' => $event->userId,
-                'crop_id' => $event->crop->id,
+                'user_id'       => $event->userId,
+                'crop_id'       => $event->crop->id,
                 'disaster_type' => $event->disasterType,
                 'disaster_info' => $event->disasterInfo
             ]);
@@ -36,43 +37,38 @@ class DisasterClearedListener
                     'user_id' => $event->userId,
                     'crop_id' => $event->crop->id
                 ]);
+
                 return;
             }
 
-            // 构建土地状态变更数据
-            $landStatusData = [
-                'land_id' => $land->id,
-                'status' => $land->status,
-                'crop' => $event->crop->toArray(),
-                'updated_at' => now()->toDateTimeString()
-            ];
 
             // 构建临时数据键,按用户ID进行存储
-            $tempKey = LandTemp::TEMP_KEY_STATUS_PREFIX . $event->userId;
-
-            // 获取当前用户的土地状态变更临时数据
-            $userLandsStatusTemp = \UCore\Helper\Cache::get($tempKey, []);
+            // 创建LandStatusChangedEvent并让LandTemp处理
+            $landStatusChangedEvent = new \App\Module\Farm\Events\LandStatusChangedEvent(
+                $event->userId,
+                $land->id,
+                $land->status, // 旧状态
+                $land->status  // 新状态(作物状态变更不改变土地状态,但需要通知前端)
+            );
 
-            // 将新的土地状态变更数据添加到临时数据中
-            $userLandsStatusTemp[$land->id] = \App\Module\Game\Dtos\LandStatusTempDto::fromArray($landStatusData);
-
-            // 将更新后的临时数据存回缓存
-            \UCore\Helper\Cache::put($tempKey, $userLandsStatusTemp, LandTemp::TEMP_TTL);
+            // 使用LandTemp的统一处理方法
+            LandTemp::handleLandStatusChanged($landStatusChangedEvent);
 
             Log::info('灾害清理事件处理成功,土地状态变更数据已存储', [
-                'user_id' => $event->userId,
-                'land_id' => $land->id,
-                'crop_id' => $event->crop->id,
+                'user_id'       => $event->userId,
+                'land_id'       => $land->id,
+                'crop_id'       => $event->crop->id,
                 'disaster_type' => $event->disasterType
             ]);
         } catch (\Exception $e) {
             Log::error('处理灾害清理事件失败', [
-                'user_id' => $event->userId,
-                'crop_id' => $event->crop->id,
+                'user_id'       => $event->userId,
+                'crop_id'       => $event->crop->id,
                 'disaster_type' => $event->disasterType,
-                'error' => $e->getMessage(),
-                'trace' => $e->getTraceAsString()
+                'error'         => $e->getMessage(),
+                'trace'         => $e->getTraceAsString()
             ]);
         }
     }
+
 }

+ 12 - 85
app/Module/Game/Logics/LandTemp.php

@@ -29,17 +29,10 @@ class LandTemp
      */
     const TEMP_KEY_PREFIX = 'game:land:changes:';
 
-    /**
-     * 临时数据键前缀 - 土地变更(向后兼容)
-     * @deprecated 使用 TEMP_KEY_PREFIX 替代
-     */
-    const TEMP_KEY_CHANGED_PREFIX = 'game:land:changes:';
 
-    /**
-     * 临时数据键前缀 - 土地状态变更(向后兼容)
-     * @deprecated 使用 TEMP_KEY_PREFIX 替代
-     */
-    const TEMP_KEY_STATUS_PREFIX = 'game:land:changes:';
+
+
+
 
     /**
      * 临时数据过期时间(秒)
@@ -163,15 +156,14 @@ class LandTemp
 
 
             // 构建统一的土地变更数据
-            $landData = [
-                'land_id' => $event->landId,
-                'old_type' => null,
-                'new_type' => null,
-                'old_status' => $event->oldStatus,
-                'new_status' => $event->newStatus,
-                'change_type' => 'status',
-                'updated_at' => time(),
-            ];
+
+
+            $landData = new LandChangeTempDto();
+            $landData->landId = $event->landId;
+            $landData->oldStatus = $event->oldStatus;
+            $landData->newStatus = $event->newStatus;
+            $landData->changeType = 'status';
+            $landData->updatedAt = time();
 
             // 存储到统一的土地变更缓存
             self::storeLandChange($event->userId, $event->landId, $landData);
@@ -218,62 +210,8 @@ class LandTemp
         return $userLandChanges[$landId] ?? null;
     }
 
-    /**
-     * 获取用户的土地状态变更临时数据(向后兼容)
-     *
-     * @param int $userId 用户ID
-     * @return array 用户的土地状态变更数据
-     * @deprecated 使用 getUserLandChanges() 替代,然后过滤 changeType === 'status'
-     */
-    public static function getUserLandStatusChanges(int $userId): array
-    {
-        $allChanges = self::getUserLandChanges($userId);
-        $statusChanges = [];
-
-        foreach ($allChanges as $landId => $change) {
-            if ($change->isStatusChange()) {
-                // 为了向后兼容,转换为LandStatusTempDto格式
-                $statusChanges[$landId] = new LandStatusTempDto([
-                    'landId' => $change->landId,
-                    'position' => $change->position,
-                    'landType' => $change->landType,
-                    'oldStatus' => $change->oldStatus,
-                    'newStatus' => $change->newStatus,
-                    'cropId' => $change->cropId,
-                    'seedId' => $change->seedId,
-                    'updatedAt' => $change->updatedAt,
-                ]);
-            }
-        }
 
-        return $statusChanges;
-    }
 
-    /**
-     * 获取用户特定土地的状态变更临时数据(向后兼容)
-     *
-     * @param int $userId 用户ID
-     * @param int $landId 土地ID
-     * @return LandStatusTempDto|null 土地状态变更数据,不存在时返回null
-     * @deprecated 使用 getUserLandChange() 替代,然后检查 isStatusChange()
-     */
-    public static function getUserLandStatusChange(int $userId, int $landId): ?LandStatusTempDto
-    {
-        $change = self::getUserLandChange($userId, $landId);
-        if ($change && $change->isStatusChange()) {
-            return new LandStatusTempDto([
-                'landId' => $change->landId,
-                'position' => $change->position,
-                'landType' => $change->landType,
-                'oldStatus' => $change->oldStatus,
-                'newStatus' => $change->newStatus,
-                'cropId' => $change->cropId,
-                'seedId' => $change->seedId,
-                'updatedAt' => $change->updatedAt,
-            ]);
-        }
-        return null;
-    }
 
     /**
      * 清除用户的所有土地变更临时数据(统一接口)
@@ -287,18 +225,7 @@ class LandTemp
         Cache::put($tempKey, [], 0);
     }
 
-    /**
-     * 清除用户的土地状态变更临时数据(向后兼容)
-     *
-     * @param int $userId 用户ID
-     * @return void
-     * @deprecated 使用 clearUserLandChanges() 替代
-     */
-    public static function clearUserLandStatusChanges(int $userId): void
-    {
-        // 现在统一存储,所以清除所有数据
-        self::clearUserLandChanges($userId);
-    }
+
 
     /**
      * 清除用户的所有土地临时数据

+ 4 - 34
app/Module/Game/Services/LandTempService.php

@@ -65,30 +65,9 @@ class LandTempService
         });
     }
 
-    /**
-     * 获取用户的土地状态变更临时数据(向后兼容)
-     *
-     * @param int $userId 用户ID
-     * @return array 用户的土地状态变更数据,键为土地ID,值为LandStatusTempDto对象
-     * @deprecated 使用 getUserStatusChanges() 替代
-     */
-    public static function getUserLandStatusChanges(int $userId): array
-    {
-        return LandTemp::getUserLandStatusChanges($userId);
-    }
 
-    /**
-     * 获取用户特定土地的状态变更临时数据(向后兼容)
-     *
-     * @param int $userId 用户ID
-     * @param int $landId 土地ID
-     * @return LandStatusTempDto|null 土地状态变更数据,不存在时返回null
-     * @deprecated 使用 getUserLandChange() 替代,然后检查 isStatusChange()
-     */
-    public static function getUserLandStatusChange(int $userId, int $landId): ?LandStatusTempDto
-    {
-        return LandTemp::getUserLandStatusChange($userId, $landId);
-    }
+
+
 
     /**
      * 清除用户的所有土地变更临时数据(统一接口)
@@ -101,17 +80,8 @@ class LandTempService
         LandTemp::clearUserLandChanges($userId);
     }
 
-    /**
-     * 清除用户的土地状态变更临时数据(向后兼容)
-     *
-     * @param int $userId 用户ID
-     * @return void
-     * @deprecated 使用 clearUserLandChanges() 替代
-     */
-    public static function clearUserLandStatusChanges(int $userId): void
-    {
-        LandTemp::clearUserLandStatusChanges($userId);
-    }
+
+
 
     /**
      * 清除用户的所有土地临时数据