Explorar el Código

refactor(pet): 重构宠物喂养功能

- 优化了宠物喂养的逻辑和流程- 移除了不必要的状态变更事件和复杂的数据结构
-简化了经验值和体力值的计算方式
- 修复了可能的逻辑错误和异常处理
notfff hace 7 meses
padre
commit
99cfc27959

+ 22 - 2
app/Module/AppGame/HttpControllers/DemoController.php

@@ -5,7 +5,9 @@ namespace App\Module\AppGame\HttpControllers;
 use App\Http\Controllers\Controller;
 use App\Module\AppGame\Tools\Protobuf;
 use App\Module\AppGame\Validations\PetEatValidation;
+use App\Module\Pet\Services\PetService;
 use Illuminate\Http\Request as HttpRequest;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Str;
 use UCore\App;
@@ -15,6 +17,7 @@ use UCore\Helper\Logger;
 use Uraus\Kku\Common\RESPONSE_CODE;
 use Uraus\Kku\Request;
 use Uraus\Kku\Response;
+use Uraus\Kku\Response\ResponsePetEat;
 
 /**
  * Protobuf 控制器
@@ -29,10 +32,27 @@ class DemoController extends Controller
         $validation = PetEatValidation::make([
                                                  'user_id' => 10006,
                                                  'itemId'  => 49,
-                                                 'petId'=>8,
-                                                 'num'=>1
+                                                 'petId'   => 8,
+                                                 'num'     => 1
                                              ]);
         $validation->validated();
+
+        // 获取请求参数
+        $petId  = $validation->getSafe('petId');
+        $itemId = $validation->getSafe('itemId');
+        $num    = $validation->getSafe('num');
+        $userId = 10006;
+
+        // 创建响应对象
+        $response = new ResponsePetEat();
+
+        // 开启数据库事务
+        DB::beginTransaction();
+
+        // 调用宠物服务进行喂养
+        $feedResult = PetService::feedPet($userId, $petId, $itemId, $num);
+        DB::rollBack();
+
     }
 
 

+ 18 - 41
app/Module/Pet/Logic/PetLogic.php

@@ -2,6 +2,7 @@
 
 namespace App\Module\Pet\Logic;
 
+use App\Module\GameItems\Dtos\ItemDto;
 use App\Module\GameItems\Services\ItemService;
 use App\Module\Pet\Enums\PetStatus;
 use App\Module\Pet\Events\PetCreatedEvent;
@@ -219,10 +220,16 @@ class PetLogic
     public function feedPet(int $petId, int $itemId, int $amount): array
     {
         // 获取宠物信息
+        /**
+         * @var PetUser $pet
+         */
         $pet = PetUser::findOrFail($petId);
 
 
         // 获取物品信息
+        /**
+         * @var ItemDto $item
+         */
         $item = ItemService::getItemInfo($itemId);
         if (!$item) {
             throw new LogicException("物品不存在");
@@ -246,41 +253,11 @@ class PetLogic
         }
 
         // 计算获得的经验值和体力
-        $expGained = ($item->numeric_attributes->pet_exp ?? 0) * $amount;
-        $staminaGained = ($item->numeric_attributes->pet_power ?? 0) * $amount;
-
-        // 更新宠物状态为喂养中
-        $oldStatus = $pet->status;
-        $pet->status = PetStatus::FEEDING;
-        $pet->save();
-
-        // 创建旧状态数据
-        $oldStatusData = new \App\Module\Pet\Dtos\DataPetSimpleDto();
-        $oldStatusData->id = $pet->id;
-        $oldStatusData->status = $oldStatus->value;
-
-        // 创建新状态数据
-        $newStatusData = new \App\Module\Pet\Dtos\DataPetSimpleDto();
-        $newStatusData->id = $pet->id;
-        $newStatusData->status = PetStatus::FEEDING->value;
-
-        // 创建完整的宠物数据
-        $petData = new \App\Module\Pet\Dtos\DataPetSimpleDto();
-        $petData->id = $pet->id;
-        $petData->name = $pet->name;
-        $petData->level = $pet->level;
-//        $petData->grade = $pet->grade->value;
-        $petData->power = $pet->stamina;
-
-        // 触发宠物状态变更事件
-        event(new PetStatusChangedEvent(
-            $pet->user_id,
-            $pet->id,
-            $oldStatusData,
-            $newStatusData,
-            'pet_feed',
-            $petData
-        ));
+        $expGained = ($item->numericAttributes['pet_exp'] ?? 0) * $amount;
+        $staminaGained = ($item->numericAttributes['pet_power'] ?? 0) * $amount;
+        if(!$expGained && !$staminaGained ){
+            throw new LogicException('错误的参数');
+        }
 
         // 增加经验值
         $levelUpOccurred = $this->addExperience($petId, $expGained);
@@ -323,12 +300,12 @@ class PetLogic
         ));
 
         Log::info('宠物喂养成功', [
-            'pet_id' => $petId,
-            'item_id' => $itemId,
-            'amount' => $amount,
-            'exp_gained' => $expGained,
+            'pet_id'         => $petId,
+            'item_id'        => $itemId,
+            'amount'         => $amount,
+            'exp_gained'     => $expGained,
             'stamina_gained' => $staminaGained,
-            'level_up' => $levelUpOccurred
+            'level_up'       => $levelUpOccurred
         ]);
 
         return [
@@ -390,7 +367,7 @@ class PetLogic
 
         // 计算实际增加的体力值
         $oldStamina = $pet->stamina;
-        $newStamina = min($maxStamina, $oldStamina + $staminaAmount);
+        $newStamina = max($maxStamina, $oldStamina + $staminaAmount);
         $actualGained = $newStamina - $oldStamina;
 
         // 更新体力值

+ 6 - 6
app/Module/Pet/Models/PetUser.php

@@ -10,17 +10,17 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
 /**
  * 宠物模型
  *
- * field start 
- * @property  int  $id  
+ * field start
+ * @property  int  $id
  * @property  int  $user_id  用户ID
  * @property  string  $name  宠物名称
  * @property  int  $grade  品阶
  * @property  int  $level  等级
  * @property  int  $experience  经验
  * @property  int  $stamina  体力
- * @property  App\Module\Pet\Enums\PetStatus  $status  宠物状态:0未知,1正常,2战斗中,3死亡
- * @property  \Carbon\Carbon  $created_at  
- * @property  \Carbon\Carbon  $updated_at  
+ * @property  \App\Module\Pet\Enums\PetStatus  $status  宠物状态:0未知,1正常,2战斗中,3死亡
+ * @property  \Carbon\Carbon  $created_at
+ * @property  \Carbon\Carbon  $updated_at
  * field end
  */
 class PetUser extends ModelCore
@@ -37,7 +37,7 @@ class PetUser extends ModelCore
      *
      * @var array
      */
-    // attrlist start 
+    // attrlist start
     protected $fillable = [
         'id',
         'user_id',