wanggangzero 6 місяців тому
батько
коміт
2eadf0a388
1 змінених файлів з 68 додано та 8 видалено
  1. 68 8
      Gameserver/App/process/StoreProc.php

+ 68 - 8
Gameserver/App/process/StoreProc.php

@@ -55,7 +55,7 @@ class StoreProc {
             case CmdCode::store_equip_compose:                                  # 6417 装备合成
                 return StoreProc::Equip_Compose();
             case CmdCode::store_equip_OnekeyCompose:                            # 6418 装备一键合成
-                return StoreProc::Equip_OnekeyCompose();
+                return StoreProc::Equip_OnekeyCompose_new();
             case CmdCode::store_equip_downGradingLevel:                         # 6419 降级
                 return StoreProc::Equip_DownGradingLevel();
             case CmdCode::store_equip_downGradingQual:                          # 6420 降品
@@ -189,7 +189,7 @@ class StoreProc {
         $num = $arr[2];
 
         $all_num = 0;
-        
+
         $materialItemType = 0;
         $materialItemNum = 0;
         if ($type == 2 && $composeMaterial_typeIds != null) {//部位去校验
@@ -231,11 +231,11 @@ class StoreProc {
                 StlUtil::dictRemove(ctx()->store(true)->equip, $eqUid);
             }
         }
-        
-        if($materialItemType != 0){
+
+        if ($materialItemType != 0) {
             ctx()->store(true)->removeItem($materialItemType, $materialItemNum);
         }
-       
+
         UserProc::updateUserInfo();
         return Resp::ok(array(
                     'gold' => ctx()->baseInfo->gold,
@@ -276,7 +276,7 @@ class StoreProc {
         if ($ins_equip->qual < 4) {
             $newEquipTypeId = substr($ins_equip->typeId, 0, strlen($ins_equip->typeId) - 5);
             $rarity = substr($ins_equip->typeId, -3);
-            $newEquipTypeId = $newEquipTypeId ."0".$qual.$rarity;           
+            $newEquipTypeId = $newEquipTypeId . "0" . $qual . $rarity;
         }
 
         $ins_equip->typeId = $newEquipTypeId;
@@ -285,6 +285,67 @@ class StoreProc {
         return $ins_equip;
     }
 
+    /**
+     * 6418 装备一键合成 (gwang 2024年11月16日)
+     * @return type
+     */
+    public static function Equip_OnekeyCompose_new() {
+        $equipDic = ctx()->store(true)->equip;
+        $arr = array();                                                         # 待处理装备临时数组
+        $composeEquip = array();                                                # 合成记录
+        foreach ($equipDic as $equip) {
+            if ($equip->qual <= 4) {                                            # 4 品以上的不参与合成
+                $arr[] = new Ins_Equip($equip);
+            }
+        }
+        usort($arr, function ($a, $b) {                                         # 按等级大小排序, 等级大的放最后
+            if ($a->level > $b->level) {
+                return 1;
+            } else if ($a->level == $b->level) {
+                return 0;
+            } else {
+                return -1;
+            }
+        });
+
+        while (count($arr) > 0) {                                               # 循环处理每一个装备
+            $equip_compose = array_pop($arr);                                   # 从末尾弹出一个元素做合成运算
+            if (null == $equip_compose) {                                       # 防御空对象
+                continue;
+            }
+            $eqQualCfg = GameConfig::equip_compose_getItem($equip_compose->qual); # 按照品阶查询合成配置数据
+            my_Assert(null != $eqQualCfg, ErrCode::err_const_no);               # 防御配置数据错误
+            list($type, $costQual, $num) = explode(',', $eqQualCfg->compose_condition); # 从配置提取合成条件
+            $composeArr = array();                                              # 消耗集合
+            foreach ($arr as $v) {                                              # 从剩余元素中查找合成所需
+                if ($v->qual == $costQual) {                                    # 同品阶
+                    if (($type == 1) ? $v->typeId == $equip_compose->typeId #   # type: 1 与本体相同 2 同部位即可
+                                    : $v->mo()->position == $equip_compose->mo()->position) {
+                        $composeArr[] = $v;                                     # 成为消耗品
+                    }
+                    if (count($composeArr) >= $num) {                           # 达到消耗数量就停
+                        break;
+                    }
+                }
+            }
+            if (count($composeArr) >= $num) {                                   # 合成的回收 不合成的可不能给回收了
+                $uid = $equip_compose->uid;
+                $equipDic->$uid = self::ComposeNewEquip($equip_compose);        # 原地合成
+                $composeEquip[] = $uid;                                         # 添加合成记录
+                foreach ($composeArr as $val) {                                 # 回收消耗的装备中所含材料
+                    self::equipLevelUp_Material_Recovery($val->mo()->rarity, $val->qual, $val->mo()->position, $val->level); # 回收材料
+                    StlUtil::dictRemove(ctx()->store(true)->equip, $val->uid);  # 背包删除
+                }
+            }
+        }
+        UserProc::updateUserInfo();                                             # 回存玩家数据
+        return Resp::ok(array(#                                                 # 返回给客户端的数据
+                    'gold' => ctx()->baseInfo->gold,
+                    'store' => ctx()->store,
+                    'composeEquip' => $composeEquip,
+        ));
+    }
+
     /**
      * 6418 装备一键合成
      * @return type
@@ -930,7 +991,7 @@ class StoreProc {
 
         $ins_equip->level += 1;
         ctx()->store->equip->$uid = $ins_equip;
-        
+
         TaskProc::OnAnyEquipUpLevel_X();
         TaskProc::OnAllEquipUpLevel_X();
         TaskProc::OnEquipLevelUpNum();
@@ -956,7 +1017,6 @@ class StoreProc {
         $maxLevel = $ins_equip->Equip_MaxLevel();
         my_Assert($ins_equip->level < $ins_equip->Equip_MaxLevel(), ErrCode::user_store_equipLevelLimit);
 
-
         $tuzhiId = GameConfig::equip_position_getItem($ins_equip->mo()->position)->costTuzhiId;
         $itemNum_store = 0;
         if (StlUtil::dictHasProperty(ctx()->store->items, $tuzhiId)) {