AI Assistant há 6 meses atrás
pai
commit
1393da0c1d
1 ficheiros alterados com 124 adições e 123 exclusões
  1. 124 123
      app/Module/GameItems/Logics/Item.php

+ 124 - 123
app/Module/GameItems/Logics/Item.php

@@ -82,7 +82,7 @@ class Item
 
         // 获取来源信息
         $sourceType = $options['source_type'] ?? null;
-        $sourceId   = $options['source_id'] ?? null;
+        $sourceId = $options['source_id'] ?? null;
         // 检查用户是否已有该物品且过期时间相同,并且未满堆叠(排除冻结的物品)
         $userItem = ItemUser::where('user_id', $userId)
             ->where('item_id', $itemId)
@@ -103,33 +103,33 @@ class Item
             })
             ->first();
 
-        $addedQuantity   = $quantity;
+        $addedQuantity = $quantity;
         $currentQuantity = 0;
 
         if ($userItem) {
             // 已有物品,增加数量
             $currentQuantity = $userItem->quantity;
-            $newQuantity     = $currentQuantity + $quantity;
+            $newQuantity = $currentQuantity + $quantity;
 
             // 检查最大堆叠限制
             if ($item->max_stack > 0 && $newQuantity > $item->max_stack) {
                 // 超过最大堆叠,先填满当前堆叠
-                $canAddToCurrent    = $item->max_stack - $currentQuantity;
+                $canAddToCurrent = $item->max_stack - $currentQuantity;
                 $userItem->quantity = $item->max_stack;
                 $userItem->save();
 
                 // 触发物品数量变更事件(更新现有堆叠)
                 Event::dispatch(new ItemQuantityChanged(
-                                    $userId,
-                                    $itemId,
-                                    null,
-                                    $currentQuantity,
-                                    $item->max_stack,
-                                    $userItem->id,
-                                    $userItem->is_frozen, // 旧冻结状态(数量变更时冻结状态不变)
-                                    $userItem->is_frozen, // 新冻结状态(数量变更时冻结状态不变)
-                                    $options
-                                ));
+                    $userId,
+                    $itemId,
+                    null,
+                    $currentQuantity,
+                    $item->max_stack,
+                    $userItem->id,
+                    $userItem->is_frozen, // 旧冻结状态(数量变更时冻结状态不变)
+                    $userItem->is_frozen, // 新冻结状态(数量变更时冻结状态不变)
+                    $options
+                ));
 
                 // 剩余数量递归添加到新堆叠
                 $remainingQuantity = $quantity - $canAddToCurrent;
@@ -137,51 +137,51 @@ class Item
                     self::addNormalItem($userId, $itemId, $remainingQuantity, $options);
                 }
 
-                $addedQuantity   = $quantity;
+                $addedQuantity = $quantity;
                 $currentQuantity = $item->max_stack;
             } else {
                 // 未超过最大堆叠,直接更新数量
-                $oldQuantity        = $userItem->quantity;
+                $oldQuantity = $userItem->quantity;
                 $userItem->quantity = $newQuantity;
                 $userItem->save();
                 $currentQuantity = $newQuantity;
 
                 // 触发物品数量变更事件
                 Event::dispatch(new ItemQuantityChanged(
-                                    $userId,
-                                    $itemId,
-                                    null,
-                                    $oldQuantity,
-                                    $newQuantity,
-                                    $userItem->id,
-                                    $userItem->is_frozen, // 旧冻结状态(数量变更时冻结状态不变)
-                                    $userItem->is_frozen, // 新冻结状态(数量变更时冻结状态不变)
-                                    $options
-                                ));
+                    $userId,
+                    $itemId,
+                    null,
+                    $oldQuantity,
+                    $newQuantity,
+                    $userItem->id,
+                    $userItem->is_frozen, // 旧冻结状态(数量变更时冻结状态不变)
+                    $userItem->is_frozen, // 新冻结状态(数量变更时冻结状态不变)
+                    $options
+                ));
             }
         } else {
             // 没有该物品,创建新记录
             $createQuantity = min($quantity, $item->max_stack > 0 ? $item->max_stack : $quantity);
-            $userItem       = new ItemUser([
-                                               'user_id'   => $userId,
-                                               'item_id'   => $itemId,
-                                               'quantity'  => $createQuantity,
-                                               'expire_at' => $expireAt,
-                                           ]);
+            $userItem = new ItemUser([
+                'user_id' => $userId,
+                'item_id' => $itemId,
+                'quantity' => $createQuantity,
+                'expire_at' => $expireAt,
+            ]);
             $userItem->save();
 
             // 触发物品数量变更事件(新增物品)
             Event::dispatch(new ItemQuantityChanged(
-                                $userId,
-                                $itemId,
-                                null,
-                                0, // 旧数量为0
-                                $createQuantity,
-                                $userItem->id,
-                                false, // 旧冻结状态(新增物品时为 false )
-                                false, // 新冻结状态(新增物品默认未冻结)
-                                $options
-                            ));
+                $userId,
+                $itemId,
+                null,
+                0, // 旧数量为0
+                $createQuantity,
+                $userItem->id,
+                false, // 旧冻结状态(新增物品时为 false )
+                false, // 新冻结状态(新增物品默认未冻结)
+                $options
+            ));
 
             // 如果数量超过最大堆叠,递归添加剩余数量
             if ($item->max_stack > 0 && $quantity > $item->max_stack) {
@@ -214,11 +214,11 @@ class Item
         Event::dispatch(new ItemAcquired($userId, $itemId, null, $addedQuantity, $options));
 
         return [
-            'success'          => true,
-            'item_id'          => $itemId,
-            'quantity'         => $addedQuantity,
+            'success' => true,
+            'item_id' => $itemId,
+            'quantity' => $addedQuantity,
             'current_quantity' => $currentQuantity,
-            'user_item_id'     => $userItem->id,
+            'user_item_id' => $userItem->id,
         ];
     }
 
@@ -254,32 +254,32 @@ class Item
 
         // 获取来源信息
         $sourceType = $options['source_type'] ?? null;
-        $sourceId   = $options['source_id'] ?? null;
-        if(!$sourceType  || !$sourceId){
+        $sourceId = $options['source_id'] ?? null;
+        if (!$sourceType || !$sourceId) {
             throw new Exception("物品 {$itemId} ,缺少来源类型.");
         }
         // 创建物品实例
         $instance = new ItemInstance([
-                                         'item_id'            => $itemId,
-                                         'name'               => $options['name'] ?? $item->name,
-                                         'display_attributes' => $options['display_attributes'] ?? $item->display_attributes,
-                                         'numeric_attributes' => $options['numeric_attributes'] ?? $item->numeric_attributes,
-                                         'tradable'           => $options['tradable'] ?? $item->tradable,
-                                         'is_bound'           => $options['is_bound'] ?? false,
-                                         'bound_to'           => $options['bound_to'] ?? null,
-                                         'bind_exp_time'      => $options['bind_exp_time'] ?? null,
-                                         'expire_at'          => $expireAt,
-                                     ]);
+            'item_id' => $itemId,
+            'name' => $options['name'] ?? $item->name,
+            'display_attributes' => $options['display_attributes'] ?? $item->display_attributes,
+            'numeric_attributes' => $options['numeric_attributes'] ?? $item->numeric_attributes,
+            'tradable' => $options['tradable'] ?? $item->tradable,
+            'is_bound' => $options['is_bound'] ?? false,
+            'bound_to' => $options['bound_to'] ?? null,
+            'bind_exp_time' => $options['bind_exp_time'] ?? null,
+            'expire_at' => $expireAt,
+        ]);
         $instance->save();
 
         // 关联到用户
         $userItem = new ItemUser([
-                                     'user_id'     => $userId,
-                                     'item_id'     => $itemId,
-                                     'instance_id' => $instance->id,
-                                     'quantity'    => 1, // 单独属性物品数量始终为1
-                                     'expire_at'   => $expireAt,
-                                 ]);
+            'user_id' => $userId,
+            'item_id' => $itemId,
+            'instance_id' => $instance->id,
+            'quantity' => 1, // 单独属性物品数量始终为1
+            'expire_at' => $expireAt,
+        ]);
         $userItem->save();
 
         // 记录交易日志
@@ -302,21 +302,21 @@ class Item
 
         // 触发物品数量变更事件(新增物品)
         Event::dispatch(new ItemQuantityChanged(
-                            $userId,
-                            $itemId,
-                            $instance->id,
-                            0, // 旧数量为0
-                            1, // 新数量为1
-                            $userItem->id,
-                            false, // 旧冻结状态(新增物品时为false)
-                            false, // 新冻结状态(新增物品默认未冻结)
-                            $options
-                        ));
+            $userId,
+            $itemId,
+            $instance->id,
+            0, // 旧数量为0
+            1, // 新数量为1
+            $userItem->id,
+            false, // 旧冻结状态(新增物品时为false)
+            false, // 新冻结状态(新增物品默认未冻结)
+            $options
+        ));
 
         return [
-            'success'      => true,
-            'item_id'      => $itemId,
-            'instance_id'  => $instance->id,
+            'success' => true,
+            'item_id' => $itemId,
+            'instance_id' => $instance->id,
             'user_item_id' => $userItem->id,
         ];
     }
@@ -353,8 +353,9 @@ class Item
         if ($includeFrozen) {
             // 当包含冻结物品时,优先消耗冻结物品,再消耗未冻结物品
             $userItems = $query->orderBy('is_frozen', 'desc') // 冻结物品优先(true > false)
-                              ->orderBy('expire_at') // 然后按过期时间排序
-                              ->get();
+            ->orderBy('quantity', 'desc')// 数量倒序
+                ->orderBy('expire_at') // 然后按过期时间排序
+                ->get();
         } else {
             // 只消耗未冻结物品时,按过期时间排序
             $userItems = $query->orderBy('expire_at')->get();
@@ -368,7 +369,7 @@ class Item
 
         // 获取来源信息
         $sourceType = $options['source_type'] ?? null;
-        $sourceId   = $options['source_id'] ?? null;
+        $sourceId = $options['source_id'] ?? null;
 
         // 开始消耗物品
         $remainingQuantity = $quantity;
@@ -379,9 +380,9 @@ class Item
 
             if ($userItem->quantity <= $remainingQuantity) {
                 // 当前堆叠数量不足,全部消耗
-                $consumedQuantity  = $userItem->quantity;
+                $consumedQuantity = $userItem->quantity;
                 $remainingQuantity -= $consumedQuantity;
-                $oldQuantity       = $userItem->quantity;
+                $oldQuantity = $userItem->quantity;
 
                 // 记录交易日志
                 self::logTransaction(
@@ -404,21 +405,21 @@ class Item
 
                 // 触发物品数量变更事件
                 Event::dispatch(new ItemQuantityChanged(
-                                    $userId,
-                                    $itemId,
-                                    null,
-                                    $oldQuantity,
-                                    0,
-                                    $userItem->id,
-                                    $userItem->is_frozen, // 旧冻结状态(消耗时冻结状态不变)
-                                    $userItem->is_frozen, // 新冻结状态(消耗时冻结状态不变)
-                                    $options
-                                ));
+                    $userId,
+                    $itemId,
+                    null,
+                    $oldQuantity,
+                    0,
+                    $userItem->id,
+                    $userItem->is_frozen, // 旧冻结状态(消耗时冻结状态不变)
+                    $userItem->is_frozen, // 新冻结状态(消耗时冻结状态不变)
+                    $options
+                ));
             } else {
                 // 当前堆叠数量足够,部分消耗
-                $consumedQuantity   = $remainingQuantity;
-                $oldQuantity        = $userItem->quantity;
-                $newQuantity        = $oldQuantity - $consumedQuantity;
+                $consumedQuantity = $remainingQuantity;
+                $oldQuantity = $userItem->quantity;
+                $newQuantity = $oldQuantity - $consumedQuantity;
                 $userItem->quantity = $newQuantity;
                 $userItem->save();
                 $remainingQuantity = 0;
@@ -440,16 +441,16 @@ class Item
 
                 // 触发物品数量变更事件
                 Event::dispatch(new ItemQuantityChanged(
-                                    $userId,
-                                    $itemId,
-                                    null,
-                                    $oldQuantity,
-                                    $newQuantity,
-                                    $userItem->id,
-                                    $userItem->is_frozen, // 旧冻结状态(消耗时冻结状态不变)
-                                    $userItem->is_frozen, // 新冻结状态(消耗时冻结状态不变)
-                                    $options
-                                ));
+                    $userId,
+                    $itemId,
+                    null,
+                    $oldQuantity,
+                    $newQuantity,
+                    $userItem->id,
+                    $userItem->is_frozen, // 旧冻结状态(消耗时冻结状态不变)
+                    $userItem->is_frozen, // 新冻结状态(消耗时冻结状态不变)
+                    $options
+                ));
             }
 
             // 触发物品消耗事件
@@ -457,9 +458,9 @@ class Item
         }
 
         return [
-            'success'            => true,
-            'item_id'            => $itemId,
-            'quantity'           => $quantity,
+            'success' => true,
+            'item_id' => $itemId,
+            'quantity' => $quantity,
             'remaining_quantity' => $totalQuantity - $quantity,
         ];
     }
@@ -500,7 +501,7 @@ class Item
 
         // 获取来源信息
         $sourceType = $options['source_type'] ?? null;
-        $sourceId   = $options['source_id'] ?? null;
+        $sourceId = $options['source_id'] ?? null;
 
         // 记录交易日志
         self::logTransaction(
@@ -529,7 +530,7 @@ class Item
         Event::dispatch(new ItemConsumed($userId, $itemId, $instanceId, 1, $options));
 
         return Res::success('', [
-            'item_id'     => $itemId,
+            'item_id' => $itemId,
             'instance_id' => $instanceId,
         ]);
     }
@@ -556,7 +557,7 @@ class Item
         ?int    $instanceId,
         int     $quantity,
         int     $transactionType,
-        $sourceType = null,
+                $sourceType = null,
         ?int    $sourceId = null,
         ?array  $details = null,
         ?string $expireAt = null,
@@ -580,18 +581,18 @@ class Item
         }
 
         return ItemTransactionLog::create([
-                                              'user_id'          => $userId,
-                                              'item_id'          => $itemId,
-                                              'instance_id'      => $instanceId,
-                                              'quantity'         => $quantity,
-                                              'transaction_type' => $transactionType,
-                                              'source_type'      => $sourceTypeValue,
-                                              'source_id'        => $sourceId,
-                                              'details'          => $details,
-                                              'expire_at'        => $expireAt,
-                                              'ip_address'       => $ipAddress,
-                                              'device_info'      => $deviceInfo,
-                                          ]);
+            'user_id' => $userId,
+            'item_id' => $itemId,
+            'instance_id' => $instanceId,
+            'quantity' => $quantity,
+            'transaction_type' => $transactionType,
+            'source_type' => $sourceTypeValue,
+            'source_id' => $sourceId,
+            'details' => $details,
+            'expire_at' => $expireAt,
+            'ip_address' => $ipAddress,
+            'device_info' => $deviceInfo,
+        ]);
     }
 
 }