Bläddra i källkod

feat(pet): 实现宠物模块事件系统和登录成功事件处理- 新增宠物模块事件系统文档,说明事件类型和监听机制- 添加宠物技能使用、升级、洗髓、战斗和状态变更等事件类
- 实现物品变更和登录成功事件的监听器- 优化登录处理流程,增加事件触发和状态更新
-扩展宠物状态枚举,增加喂养、训练等状态

Your Name 8 månader sedan
förälder
incheckning
a0f32d8210

+ 8 - 6
app/Module/AppGame/Handler/Public/LoginHandler.php

@@ -33,21 +33,23 @@ class LoginHandler extends BaseHandler
      */
     public function handle(Message $data): Message
     {
+        // 验证
         $validation = LoginValidation::makeByProrobuf($data);
         $validation->validated();
         $user = $validation->user;
+        // 验证 通过
 
-        // 创建响应对象
-        $response = new ResponsePublicLogin();
-        $sessionId = SessionApp::getSessionId();
-        $response->setToken($sessionId);
-
+        // 调用逻辑
         // 设置用户登录状态
         SessionApp::setLogin($user);
-
+        $sessionId = SessionApp::getSessionId();
         // 触发登录成功事件
         Event::dispatch(new LoginSuccessEvent($user, $sessionId));
+        // 调用逻辑 完成
 
+        // 创建响应对象
+        $response = new ResponsePublicLogin();
+        $response->setToken($sessionId);
         return $response;
     }
 

+ 158 - 0
app/Module/Pet/Docs/事件系统.md

@@ -0,0 +1,158 @@
+# 宠物模块事件系统
+
+## 1. 概述
+
+宠物模块使用事件系统实现模块间的松耦合通信,通过发布和订阅事件,实现不同模块之间的交互。本文档说明了宠物模块中定义的事件类型和监听的事件。
+
+## 2. 事件类型
+
+### 2.1 发出的事件
+
+宠物模块会在特定操作完成后发出以下事件:
+
+#### 2.1.1 宠物技能使用事件 (PetSkillUsedEvent)
+
+当用户使用宠物技能时触发此事件。
+
+**属性**:
+- `userId`: 用户ID
+- `petId`: 宠物ID
+- `skillId`: 技能ID
+- `params`: 技能参数
+
+#### 2.1.2 宠物升级事件 (PetLevelUpEvent)
+
+当宠物升级时触发此事件。
+
+**属性**:
+- `userId`: 用户ID
+- `petId`: 宠物ID
+- `oldLevel`: 旧等级
+- `newLevel`: 新等级
+- `unlockedSkills`: 新解锁的技能列表
+
+#### 2.1.3 宠物洗髓事件 (PetRemouldEvent)
+
+当宠物进行洗髓操作时触发此事件。
+
+**属性**:
+- `userId`: 用户ID
+- `petId`: 宠物ID
+- `oldGrade`: 旧品阶
+- `newGrade`: 新品阶
+
+#### 2.1.4 宠物战斗事件 (PetBattleEvent)
+
+当宠物参与战斗时触发此事件。
+
+**属性**:
+- `userId`: 用户ID
+- `petId`: 宠物ID
+- `battleType`: 战斗类型
+- `opponentId`: 对手ID
+- `result`: 战斗结果
+
+#### 2.1.5 宠物状态变更事件 (PetStatusChangedEvent)
+
+当宠物状态发生变化时触发此事件,如从正常状态变为喂养中、战斗中等。
+
+**属性**:
+- `userId`: 用户ID
+- `petId`: 宠物ID
+- `oldStatus`: 旧状态
+- `newStatus`: 新状态
+- `reason`: 变更原因
+- `data`: 附加数据
+
+### 2.2 监听的事件
+
+宠物模块会监听以下来自其他模块的事件:
+
+#### 2.2.1 物品变更事件 (ItemChangedEvent)
+
+当用户物品发生变化时,物品模块会触发此事件,宠物模块监听此事件以执行相应操作。
+
+**来源**:`App\Module\GameItems\Events\ItemChangedEvent`
+
+**属性**:
+- `userId`: 用户ID
+- `itemId`: 物品ID
+- `changeType`: 变更类型 (add/remove)
+- `amount`: 变更数量
+- `reason`: 变更原因
+
+#### 2.2.2 登录成功事件 (LoginSuccessEvent)
+
+当用户成功登录时,AppGame模块会触发此事件,宠物模块监听此事件以执行相应操作。
+
+**来源**:`App\Module\AppGame\Events\LoginSuccessEvent`
+
+**属性**:
+- `user`: 用户对象
+- `loginTime`: 登录时间
+- `sessionId`: 会话ID
+
+**处理逻辑**:
+- 更新宠物体力值(根据离线时间计算恢复量)
+- 检查宠物状态
+- 处理宠物技能冷却时间
+- 更新宠物每日任务状态
+
+## 3. 事件列表
+
+以下是宠物模块中所有事件的完整列表,包括发出的事件和监听的事件。
+
+### 3.1 发出的事件列表
+
+| 事件名称 | 事件类 | 触发条件 | 包含数据 | 用途 |
+|---------|-------|---------|---------|------|
+| 宠物技能使用事件 | PetSkillUsedEvent | 用户使用宠物技能 | userId, petId, skillId, params | 通知其他模块宠物技能被使用 |
+| 宠物升级事件 | PetLevelUpEvent | 宠物升级 | userId, petId, oldLevel, newLevel, unlockedSkills | 通知其他模块宠物升级,可能解锁新技能 |
+| 宠物洗髓事件 | PetRemouldEvent | 宠物洗髓 | userId, petId, oldGrade, newGrade | 通知其他模块宠物品阶变更 |
+| 宠物战斗事件 | PetBattleEvent | 宠物参与战斗 | userId, petId, battleType, opponentId, result | 通知其他模块宠物战斗结果 |
+| 宠物状态变更事件 | PetStatusChangedEvent | 宠物状态变化 | userId, petId, oldStatus, newStatus, reason, data | 通知其他模块宠物状态变更 |
+
+### 3.2 监听的事件列表
+
+| 事件名称 | 事件类 | 来源模块 | 监听目的 | 处理逻辑 |
+|---------|-------|---------|---------|---------|
+| 物品变更事件 | ItemChangedEvent | GameItems | 处理与宠物相关的物品变更 | 处理狗粮、洗髓道具等物品的变更 |
+| 登录成功事件 | LoginSuccessEvent | AppGame | 处理用户登录后的宠物相关操作 | 更新宠物体力值、检查宠物状态、处理技能冷却时间 |
+
+### 3.3 事件与监听器对应关系
+
+| 事件类 | 监听器类 | 处理方法 |
+|-------|---------|---------|
+| ItemChangedEvent | ItemChangedListener | handle() |
+| LoginSuccessEvent | LoginSuccessListener | handle() |
+| PetStatusChangedEvent | PetStatusChangedListener | handle() |
+| PetLevelUpEvent | PetLevelUpListener | handle() |
+| PetRemouldEvent | PetRemouldListener | handle() |
+| PetSkillUsedEvent | PetSkillUsedListener | handle() |
+| PetBattleEvent | PetBattleListener | handle() |
+
+## 4. 模块间服务调用
+
+除了事件系统外,模块间还通过直接的服务调用进行交互,特别是对于核心业务流程。
+
+### 4.1 被其他模块调用的服务
+
+宠物模块提供以下服务接口供其他模块调用:
+
+| 服务方法 | 调用模块 | 用途 | 参数 | 返回值 |
+|---------|---------|------|------|-------|
+| getPetSkills | Farm | 获取宠物可用技能 | userId, petId | array |
+| useSkill | Farm | 使用宠物技能 | userId, petId, skillId, params | bool |
+| checkPetCondition | Quest | 检查宠物条件 | userId, petId, conditionType | bool |
+
+## 5. 总结
+
+宠物模块通过两种方式与其他模块交互:事件系统和服务调用。
+
+**事件系统**用于处理非核心业务流程,如通知、日志、统计等。模块发出的事件包括宠物技能使用事件、宠物升级事件、宠物洗髓事件和宠物战斗事件;模块监听的事件包括物品变更事件和登录成功事件。
+
+**服务调用**用于处理核心业务流程,如农场模块调用宠物模块的服务来使用宠物技能。这种方式保持了代码流程的清晰和可控,同时减少了模块间的耦合。
+
+在开发过程中,应该根据具体需求选择合适的交互方式:
+- 对于核心业务流程,优先使用服务调用
+- 对于非核心业务流程,优先使用事件系统

+ 9 - 0
app/Module/Pet/Enums/PetStatus.php

@@ -2,10 +2,19 @@
 
 namespace App\Module\Pet\Enums;
 
+/**
+ * 宠物状态枚举
+ *
+ * 定义宠物可能的状态值,用于跟踪宠物当前的活动状态
+ */
 enum PetStatus: int
 {
     case NONE = 0;      // 未知
     case NORMAL = 1;    // 正常
     case FIGHTING = 2;  // 战斗中
     case DEAD = 3;      // 死亡
+    case FEEDING = 4;   // 喂养中
+    case TRAINING = 5;  // 训练中
+    case RESTING = 6;   // 休息中
+    case TRAVELING = 7; // 外出中
 }

+ 86 - 0
app/Module/Pet/Events/PetBattleEvent.php

@@ -0,0 +1,86 @@
+<?php
+
+namespace App\Module\Pet\Events;
+
+use Illuminate\Broadcasting\InteractsWithSockets;
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Queue\SerializesModels;
+
+/**
+ * 宠物战斗事件
+ * 
+ * 当宠物参与战斗时触发此事件,允许其他系统响应宠物战斗的结果。
+ * 此事件可用于记录战斗日志、更新宠物状态、处理战斗奖励等。
+ */
+class PetBattleEvent
+{
+    use Dispatchable, InteractsWithSockets, SerializesModels;
+
+    /**
+     * 用户ID
+     *
+     * @var int
+     */
+    public int $userId;
+
+    /**
+     * 宠物ID
+     *
+     * @var int
+     */
+    public int $petId;
+
+    /**
+     * 战斗类型
+     * 1: 偷菜战斗
+     * 2: 守护战斗
+     * 3: 争霸赛战斗
+     *
+     * @var int
+     */
+    public int $battleType;
+
+    /**
+     * 对手ID(可为空)
+     *
+     * @var int|null
+     */
+    public ?int $opponentId;
+
+    /**
+     * 战斗结果
+     * 0: 失败
+     * 1: 胜利
+     *
+     * @var int
+     */
+    public int $result;
+
+    /**
+     * 战斗奖励
+     *
+     * @var array|null
+     */
+    public ?array $reward;
+
+    /**
+     * 创建一个新的事件实例
+     *
+     * @param int $userId 用户ID
+     * @param int $petId 宠物ID
+     * @param int $battleType 战斗类型
+     * @param int|null $opponentId 对手ID
+     * @param int $result 战斗结果
+     * @param array|null $reward 战斗奖励
+     * @return void
+     */
+    public function __construct(int $userId, int $petId, int $battleType, ?int $opponentId, int $result, ?array $reward = null)
+    {
+        $this->userId = $userId;
+        $this->petId = $petId;
+        $this->battleType = $battleType;
+        $this->opponentId = $opponentId;
+        $this->result = $result;
+        $this->reward = $reward;
+    }
+}

+ 72 - 0
app/Module/Pet/Events/PetLevelUpEvent.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Module\Pet\Events;
+
+use Illuminate\Broadcasting\InteractsWithSockets;
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Queue\SerializesModels;
+
+/**
+ * 宠物升级事件
+ * 
+ * 当宠物升级时触发此事件,允许其他系统响应宠物等级的变化。
+ * 此事件可用于更新宠物属性、解锁新技能、记录升级日志等。
+ */
+class PetLevelUpEvent
+{
+    use Dispatchable, InteractsWithSockets, SerializesModels;
+
+    /**
+     * 用户ID
+     *
+     * @var int
+     */
+    public int $userId;
+
+    /**
+     * 宠物ID
+     *
+     * @var int
+     */
+    public int $petId;
+
+    /**
+     * 旧等级
+     *
+     * @var int
+     */
+    public int $oldLevel;
+
+    /**
+     * 新等级
+     *
+     * @var int
+     */
+    public int $newLevel;
+
+    /**
+     * 新解锁的技能列表
+     *
+     * @var array
+     */
+    public array $unlockedSkills;
+
+    /**
+     * 创建一个新的事件实例
+     *
+     * @param int $userId 用户ID
+     * @param int $petId 宠物ID
+     * @param int $oldLevel 旧等级
+     * @param int $newLevel 新等级
+     * @param array $unlockedSkills 新解锁的技能列表
+     * @return void
+     */
+    public function __construct(int $userId, int $petId, int $oldLevel, int $newLevel, array $unlockedSkills = [])
+    {
+        $this->userId = $userId;
+        $this->petId = $petId;
+        $this->oldLevel = $oldLevel;
+        $this->newLevel = $newLevel;
+        $this->unlockedSkills = $unlockedSkills;
+    }
+}

+ 64 - 0
app/Module/Pet/Events/PetRemouldEvent.php

@@ -0,0 +1,64 @@
+<?php
+
+namespace App\Module\Pet\Events;
+
+use App\Module\Pet\Enums\PetGrade;
+use Illuminate\Broadcasting\InteractsWithSockets;
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Queue\SerializesModels;
+
+/**
+ * 宠物洗髓事件
+ * 
+ * 当宠物进行洗髓操作时触发此事件,允许其他系统响应宠物品阶的变化。
+ * 此事件可用于更新宠物属性、记录洗髓日志、处理品阶变化效果等。
+ */
+class PetRemouldEvent
+{
+    use Dispatchable, InteractsWithSockets, SerializesModels;
+
+    /**
+     * 用户ID
+     *
+     * @var int
+     */
+    public int $userId;
+
+    /**
+     * 宠物ID
+     *
+     * @var int
+     */
+    public int $petId;
+
+    /**
+     * 旧品阶
+     *
+     * @var PetGrade
+     */
+    public PetGrade $oldGrade;
+
+    /**
+     * 新品阶
+     *
+     * @var PetGrade
+     */
+    public PetGrade $newGrade;
+
+    /**
+     * 创建一个新的事件实例
+     *
+     * @param int $userId 用户ID
+     * @param int $petId 宠物ID
+     * @param PetGrade $oldGrade 旧品阶
+     * @param PetGrade $newGrade 新品阶
+     * @return void
+     */
+    public function __construct(int $userId, int $petId, PetGrade $oldGrade, PetGrade $newGrade)
+    {
+        $this->userId = $userId;
+        $this->petId = $petId;
+        $this->oldGrade = $oldGrade;
+        $this->newGrade = $newGrade;
+    }
+}

+ 63 - 0
app/Module/Pet/Events/PetSkillUsedEvent.php

@@ -0,0 +1,63 @@
+<?php
+
+namespace App\Module\Pet\Events;
+
+use Illuminate\Broadcasting\InteractsWithSockets;
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Queue\SerializesModels;
+
+/**
+ * 宠物技能使用事件
+ * 
+ * 当用户使用宠物技能时触发此事件,允许其他系统响应宠物技能的使用。
+ * 此事件可用于记录技能使用日志、更新技能冷却时间、处理技能效果等。
+ */
+class PetSkillUsedEvent
+{
+    use Dispatchable, InteractsWithSockets, SerializesModels;
+
+    /**
+     * 用户ID
+     *
+     * @var int
+     */
+    public int $userId;
+
+    /**
+     * 宠物ID
+     *
+     * @var int
+     */
+    public int $petId;
+
+    /**
+     * 技能ID
+     *
+     * @var int
+     */
+    public int $skillId;
+
+    /**
+     * 技能参数
+     *
+     * @var array
+     */
+    public array $params;
+
+    /**
+     * 创建一个新的事件实例
+     *
+     * @param int $userId 用户ID
+     * @param int $petId 宠物ID
+     * @param int $skillId 技能ID
+     * @param array $params 技能参数
+     * @return void
+     */
+    public function __construct(int $userId, int $petId, int $skillId, array $params = [])
+    {
+        $this->userId = $userId;
+        $this->petId = $petId;
+        $this->skillId = $skillId;
+        $this->params = $params;
+    }
+}

+ 88 - 0
app/Module/Pet/Events/PetStatusChangedEvent.php

@@ -0,0 +1,88 @@
+<?php
+
+namespace App\Module\Pet\Events;
+
+use App\Module\Pet\Enums\PetStatus;
+use Illuminate\Broadcasting\InteractsWithSockets;
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Queue\SerializesModels;
+
+/**
+ * 宠物状态变更事件
+ * 
+ * 当宠物状态发生变化时触发此事件,允许其他系统响应宠物状态的变化。
+ * 此事件可用于处理宠物喂养、训练、战斗等操作导致的状态变更。
+ */
+class PetStatusChangedEvent
+{
+    use Dispatchable, InteractsWithSockets, SerializesModels;
+
+    /**
+     * 用户ID
+     *
+     * @var int
+     */
+    public int $userId;
+
+    /**
+     * 宠物ID
+     *
+     * @var int
+     */
+    public int $petId;
+
+    /**
+     * 旧状态
+     *
+     * @var PetStatus
+     */
+    public PetStatus $oldStatus;
+
+    /**
+     * 新状态
+     *
+     * @var PetStatus
+     */
+    public PetStatus $newStatus;
+
+    /**
+     * 变更原因
+     *
+     * @var string
+     */
+    public string $reason;
+
+    /**
+     * 附加数据
+     *
+     * @var array
+     */
+    public array $data;
+
+    /**
+     * 创建一个新的事件实例
+     *
+     * @param int $userId 用户ID
+     * @param int $petId 宠物ID
+     * @param PetStatus $oldStatus 旧状态
+     * @param PetStatus $newStatus 新状态
+     * @param string $reason 变更原因
+     * @param array $data 附加数据
+     * @return void
+     */
+    public function __construct(
+        int $userId, 
+        int $petId, 
+        PetStatus $oldStatus, 
+        PetStatus $newStatus, 
+        string $reason = '', 
+        array $data = []
+    ) {
+        $this->userId = $userId;
+        $this->petId = $petId;
+        $this->oldStatus = $oldStatus;
+        $this->newStatus = $newStatus;
+        $this->reason = $reason;
+        $this->data = $data;
+    }
+}

+ 202 - 0
app/Module/Pet/Listeners/ItemChangedListener.php

@@ -0,0 +1,202 @@
+<?php
+
+namespace App\Module\Pet\Listeners;
+
+use App\Module\GameItems\Events\ItemChangedEvent;
+use App\Module\Pet\Services\PetService;
+use Illuminate\Support\Facades\Log;
+
+/**
+ * 物品变更事件监听器
+ * 
+ * 监听物品变更事件,处理与宠物相关的物品变更
+ */
+class ItemChangedListener
+{
+    /**
+     * @var PetService
+     */
+    protected $petService;
+
+    /**
+     * 构造函数
+     * 
+     * @param PetService $petService
+     */
+    public function __construct(PetService $petService)
+    {
+        $this->petService = $petService;
+    }
+
+    /**
+     * 处理事件
+     * 
+     * @param ItemChangedEvent $event
+     * @return void
+     */
+    public function handle(ItemChangedEvent $event): void
+    {
+        try {
+            $userId = $event->userId;
+            $itemId = $event->itemId;
+            $changeType = $event->changeType;
+            $amount = $event->amount;
+            
+            // 记录日志
+            Log::info('处理物品变更事件', [
+                'user_id' => $userId,
+                'item_id' => $itemId,
+                'change_type' => $changeType,
+                'amount' => $amount
+            ]);
+            
+            // 处理狗粮物品变更
+            if ($this->isDogFoodItem($itemId)) {
+                $this->handleDogFoodItemChanged($userId, $itemId, $changeType, $amount);
+            }
+            
+            // 处理洗髓道具变更
+            if ($this->isRemouldItem($itemId)) {
+                $this->handleRemouldItemChanged($userId, $itemId, $changeType, $amount);
+            }
+            
+            // 处理其他宠物相关物品变更
+            if ($this->isOtherPetItem($itemId)) {
+                $this->handleOtherPetItemChanged($userId, $itemId, $changeType, $amount);
+            }
+            
+        } catch (\Exception $e) {
+            Log::error('处理物品变更事件失败', [
+                'error' => $e->getMessage(),
+                'user_id' => $event->userId,
+                'item_id' => $event->itemId
+            ]);
+        }
+    }
+    
+    /**
+     * 判断物品是否为狗粮
+     * 
+     * @param int $itemId
+     * @return bool
+     */
+    protected function isDogFoodItem(int $itemId): bool
+    {
+        // 获取配置中的狗粮物品ID列表
+        $dogFoodItems = config('pet.dog_food_items', []);
+        
+        return in_array($itemId, $dogFoodItems);
+    }
+    
+    /**
+     * 处理狗粮物品变更
+     * 
+     * @param int $userId
+     * @param int $itemId
+     * @param string $changeType
+     * @param int $amount
+     * @return void
+     */
+    protected function handleDogFoodItemChanged(int $userId, int $itemId, string $changeType, int $amount): void
+    {
+        // 如果是添加狗粮,可能需要更新UI提示或其他逻辑
+        if ($changeType === 'add') {
+            // 处理添加狗粮的逻辑
+            Log::info('用户获得了狗粮', [
+                'user_id' => $userId,
+                'item_id' => $itemId,
+                'amount' => $amount
+            ]);
+        }
+        
+        // 如果是消耗狗粮,可能是喂养宠物,需要检查是否通过正确途径消耗
+        if ($changeType === 'remove') {
+            // 处理消耗狗粮的逻辑
+            Log::info('用户消耗了狗粮', [
+                'user_id' => $userId,
+                'item_id' => $itemId,
+                'amount' => $amount
+            ]);
+        }
+    }
+    
+    /**
+     * 判断物品是否为洗髓道具
+     * 
+     * @param int $itemId
+     * @return bool
+     */
+    protected function isRemouldItem(int $itemId): bool
+    {
+        // 获取配置中的洗髓道具ID
+        $remouldItemId = config('pet.remould_cost.item_id');
+        
+        return $itemId === $remouldItemId;
+    }
+    
+    /**
+     * 处理洗髓道具变更
+     * 
+     * @param int $userId
+     * @param int $itemId
+     * @param string $changeType
+     * @param int $amount
+     * @return void
+     */
+    protected function handleRemouldItemChanged(int $userId, int $itemId, string $changeType, int $amount): void
+    {
+        // 如果是添加洗髓道具,可能需要更新UI提示或其他逻辑
+        if ($changeType === 'add') {
+            // 处理添加洗髓道具的逻辑
+            Log::info('用户获得了洗髓道具', [
+                'user_id' => $userId,
+                'item_id' => $itemId,
+                'amount' => $amount
+            ]);
+        }
+        
+        // 如果是消耗洗髓道具,可能是进行洗髓操作,需要检查是否通过正确途径消耗
+        if ($changeType === 'remove') {
+            // 处理消耗洗髓道具的逻辑
+            Log::info('用户消耗了洗髓道具', [
+                'user_id' => $userId,
+                'item_id' => $itemId,
+                'amount' => $amount
+            ]);
+        }
+    }
+    
+    /**
+     * 判断物品是否为其他宠物相关物品
+     * 
+     * @param int $itemId
+     * @return bool
+     */
+    protected function isOtherPetItem(int $itemId): bool
+    {
+        // 获取配置中的其他宠物相关物品ID列表
+        $otherPetItems = config('pet.other_pet_items', []);
+        
+        return in_array($itemId, $otherPetItems);
+    }
+    
+    /**
+     * 处理其他宠物相关物品变更
+     * 
+     * @param int $userId
+     * @param int $itemId
+     * @param string $changeType
+     * @param int $amount
+     * @return void
+     */
+    protected function handleOtherPetItemChanged(int $userId, int $itemId, string $changeType, int $amount): void
+    {
+        // 处理其他宠物相关物品变更的逻辑
+        Log::info('用户' . ($changeType === 'add' ? '获得' : '消耗') . '了宠物相关物品', [
+            'user_id' => $userId,
+            'item_id' => $itemId,
+            'change_type' => $changeType,
+            'amount' => $amount
+        ]);
+    }
+}

+ 165 - 0
app/Module/Pet/Listeners/LoginSuccessListener.php

@@ -0,0 +1,165 @@
+<?php
+
+namespace App\Module\Pet\Listeners;
+
+use App\Module\AppGame\Events\LoginSuccessEvent;
+use App\Module\Pet\Models\PetUser;
+use App\Module\Pet\Services\PetService;
+use Illuminate\Support\Facades\Log;
+
+/**
+ * 登录成功事件监听器
+ * 
+ * 监听用户登录成功事件,处理宠物相关的登录后操作
+ */
+class LoginSuccessListener
+{
+    /**
+     * @var PetService
+     */
+    protected $petService;
+
+    /**
+     * 构造函数
+     * 
+     * @param PetService $petService
+     */
+    public function __construct(PetService $petService)
+    {
+        $this->petService = $petService;
+    }
+
+    /**
+     * 处理事件
+     * 
+     * @param LoginSuccessEvent $event
+     * @return void
+     */
+    public function handle(LoginSuccessEvent $event): void
+    {
+        try {
+            $userId = $event->user->id;
+            $loginTime = $event->loginTime;
+            
+            // 记录日志
+            Log::info('用户登录成功,处理宠物相关操作', [
+                'user_id' => $userId,
+                'login_time' => date('Y-m-d H:i:s', $loginTime)
+            ]);
+            
+            // 获取用户的所有宠物
+            $pets = PetUser::where('user_id', $userId)->get();
+            
+            if ($pets->isEmpty()) {
+                Log::info('用户没有宠物,跳过处理', ['user_id' => $userId]);
+                return;
+            }
+            
+            foreach ($pets as $pet) {
+                // 更新宠物体力值
+                $this->updatePetStamina($pet, $loginTime);
+                
+                // 检查宠物状态
+                $this->checkPetStatus($pet);
+                
+                // 处理宠物技能冷却时间
+                $this->processPetSkillCooldown($pet, $loginTime);
+            }
+            
+            // 更新宠物每日任务状态
+            $this->updatePetDailyTasks($userId);
+            
+        } catch (\Exception $e) {
+            Log::error('处理登录成功事件失败', [
+                'error' => $e->getMessage(),
+                'user_id' => $event->user->id
+            ]);
+        }
+    }
+    
+    /**
+     * 更新宠物体力值
+     * 
+     * @param PetUser $pet
+     * @param int $loginTime
+     * @return void
+     */
+    protected function updatePetStamina(PetUser $pet, int $loginTime): void
+    {
+        // 获取上次更新时间
+        $lastUpdateTime = $pet->updated_at->timestamp;
+        
+        // 计算经过的分钟数
+        $minutesPassed = floor(($loginTime - $lastUpdateTime) / 60);
+        
+        if ($minutesPassed <= 0) {
+            return;
+        }
+        
+        // 获取宠物等级配置
+        $levelConfig = $this->petService->getPetLevelConfig($pet->level);
+        
+        if (!$levelConfig) {
+            Log::warning('宠物等级配置不存在', ['pet_id' => $pet->id, 'level' => $pet->level]);
+            return;
+        }
+        
+        // 计算恢复的体力值
+        $recoveryRate = $levelConfig->stamina_recovery_rate;
+        $recoveryAmount = $minutesPassed * $recoveryRate;
+        
+        // 更新体力值,不超过最大值
+        $maxStamina = $levelConfig->stamina_max;
+        $newStamina = min($pet->stamina + $recoveryAmount, $maxStamina);
+        
+        // 保存更新
+        $pet->stamina = $newStamina;
+        $pet->save();
+        
+        Log::info('更新宠物体力值', [
+            'pet_id' => $pet->id,
+            'old_stamina' => $pet->stamina,
+            'new_stamina' => $newStamina,
+            'recovery_amount' => $recoveryAmount,
+            'minutes_passed' => $minutesPassed
+        ]);
+    }
+    
+    /**
+     * 检查宠物状态
+     * 
+     * @param PetUser $pet
+     * @return void
+     */
+    protected function checkPetStatus(PetUser $pet): void
+    {
+        // 检查宠物状态,如果需要可以在这里添加状态转换逻辑
+        // 例如:从战斗状态恢复到正常状态等
+        $this->petService->checkAndUpdatePetStatus($pet);
+    }
+    
+    /**
+     * 处理宠物技能冷却时间
+     * 
+     * @param PetUser $pet
+     * @param int $loginTime
+     * @return void
+     */
+    protected function processPetSkillCooldown(PetUser $pet, int $loginTime): void
+    {
+        // 处理宠物技能冷却时间
+        $this->petService->updatePetSkillCooldowns($pet->id, $loginTime);
+    }
+    
+    /**
+     * 更新宠物每日任务状态
+     * 
+     * @param int $userId
+     * @return void
+     */
+    protected function updatePetDailyTasks(int $userId): void
+    {
+        // 更新宠物每日任务状态
+        $this->petService->resetPetDailyTasksIfNeeded($userId);
+    }
+}