Esempio n. 1
0
 /**
  * 重新计算下装备下属性 在穿脱 强化身上的装备
  * @param $player_id
  * @return mixed
  */
 public function equip_attr($player_id)
 {
     $get_field = Protocol_Player::get_player_attr_detail_key();
     $get_field[] = 'skill_starmap_info';
     $get_field[] = 'skill_info';
     $get_field[] = 'skill_rune_info';
     $get_field[] = 'dower_info';
     $get_field[] = 'fashion_fit';
     $get_field[] = 'player_settings';
     $player_detail = $this->get_data('PlayerDetail')->get_player_detail($player_id, $get_field);
     # 需要将星图对技能的加成信息初始化为空后,再重新计算身上装备的星图对技能的加成信息,否则,skill_starmap_info只增不减
     # 即每次重新计算身上装备的属性时,都重新计算skill_starmap_info
     $player_detail['skill_starmap_info'] = array();
     $equip_lists = $this->get_game('Prop')->get_player_equip($player_id);
     $arr_equip_attr = array();
     $equip_skill = array();
     $equip_swallow = array();
     if (!empty($equip_lists)) {
         $equip_suit_quality = array();
         $equip_suit_strength = array();
         $equip_suit_star = array();
         $equip_suit_inlay = 0;
         $equip_level = array();
         foreach ($equip_lists as $equip) {
             if ($equip['grid'] < 10) {
                 $equip_level[$equip['level']] += 1;
                 $equip_suit_quality[$equip['quality']] += 1;
                 if ($equip['intensive_level']) {
                     $equip_suit_strength[$equip['intensive_level']] += 1;
                 }
                 $equip_suit_star[$equip['star_level']] += 1;
             }
             if (is_string($equip['base_attr'])) {
                 $base_attr = json_decode($equip['base_attr'], true);
             } else {
                 $base_attr = $equip['base_attr'];
             }
             $star_map = array();
             if (!empty($equip['star_map_desc'])) {
                 if (is_string($equip['star_map_desc'])) {
                     $equip['star_map_desc'] = json_decode($equip['star_map_desc'], true);
                 }
                 $star_map = Struct_Prop::parse_star_map($equip['star_map_desc']);
                 # 星图觉醒技能信息更新到player_detail表的skill_starmap_info中
                 if (!empty($equip['career_type']) && !empty($star_map['skill'])) {
                     foreach ($star_map['skill'] as $career_type => $skill_info) {
                         if ($equip['career_type'] != $career_type) {
                             continue;
                         }
                         $player_detail['skill_starmap_info'][$skill_info['skill_id']] += $skill_info['skill_level'];
                     }
                 }
             }
             # 吞噬属性
             if (!empty($equip['swallow_info']) && is_array($equip['swallow_info'])) {
                 foreach ($equip['swallow_info'] as $swallow_id => $swallow_info) {
                     $swallow_config = Cache_Forge::getInstance()->get_swallow_config($swallow_id, $swallow_info['swallow_lv']);
                     $equip_swallow[$swallow_id] += intval($swallow_config['swallow_param']);
                 }
             }
             if (!empty($base_attr)) {
                 //计算基础属性
                 foreach ($base_attr as $key => $val) {
                     $val += $val * (intval($star_map['equip_attr']) / 100);
                     //星图加成
                     if ($key == 'atk' || $key == 'atk_max' || $key == 'atk_min') {
                         $arr_equip_attr['atk_min'] += $val;
                     } else {
                         $arr_equip_attr[$key] += $val;
                     }
                 }
             }
             if (intval($equip['addition_attr']) > 0) {
                 foreach ($equip['addition_attr'] as $key => $val) {
                     if (isset($star_map['additional'])) {
                         $val += ceil($val * ($star_map['additional'] / 10000));
                         //星图加成
                     }
                     if ($key == 'atk' || $key == 'atk_max' || $key == 'atk_min') {
                         $arr_equip_attr['atk_min'] += $val;
                     } else {
                         $arr_equip_attr[$key] += $val;
                     }
                 }
             }
             # ------------------------------------------------------------
             # 洗练属性处理
             # ------------------------------------------------------------
             if (!empty($equip['refine_attr'])) {
                 foreach ($equip['refine_attr'] as $attr_seq => $attr_info) {
                     if (!is_array($attr_info)) {
                         continue;
                     }
                     # TODO: 为了兼容旧的洗练数据,以后要清档上功能,可以除去这行
                     list($key, $val) = each($attr_info);
                     # atk相关特殊处理,将atk与atk_max替换成atk_min,因为role_key只有atk_min
                     if ($key == 'atk' || $key == 'atk_max') {
                         $key = 'atk_min';
                     }
                     $arr_equip_attr[$key] += $val;
                 }
             }
             if (is_string($equip['intensive_desc'])) {
                 $intensive_desc = json_decode($equip['intensive_desc'], true);
             } else {
                 $intensive_desc = $equip['intensive_desc'];
             }
             if (!empty($intensive_desc)) {
                 foreach ($intensive_desc as $key => $val) {
                     $val += $val * (intval($star_map['intensify']) / 10000);
                     //星图加成
                     if ($key == 'atk' || $key == 'atk_min' || $key == 'atk_max') {
                         $arr_equip_attr['atk_min'] += $val;
                     } else {
                         $arr_equip_attr[$key] += $val;
                     }
                 }
             }
             $gem_configs = array();
             if (is_string($equip['inlay_gems'])) {
                 $inlay_gems = json_decode($equip['intensive_desc'], true);
             } else {
                 $inlay_gems = $equip['inlay_gems'];
             }
             if (!empty($inlay_gems)) {
                 foreach ($inlay_gems as $gem_id) {
                     if (!isset($gem_configs[$gem_id])) {
                         $gem_configs[$gem_id] = Cache_Forge::getInstance()->get_inlay_gems_by_id($gem_id);
                     }
                     if ($equip['grid'] < 10) {
                         $equip_suit_inlay += $gem_configs[$gem_id]['lv'];
                     }
                     $attr = Struct_Prop::parse_gem_config_attr($gem_configs[$gem_id]);
                     if (!empty($attr)) {
                         foreach ($attr as $key => $val) {
                             if ($key == 'atk' || $key == 'atk_min' || $key == 'atk_max') {
                                 $arr_equip_attr['atk_min'] += $val;
                             } else {
                                 $arr_equip_attr[$key] += $val;
                             }
                         }
                     }
                 }
             }
         }
         //套装加成
         $item_flags = Cache_ItemFlag::getInstance()->get_item_flag_info(1);
         $level_count = count($equip_level);
         if (!empty($item_flags)) {
             $flags_addition = array();
             foreach ($item_flags as $flag) {
                 if ($flag['type'] == 'quality') {
                     $conditions = explode("|", $flag['condition']);
                     $fnum = explode(":", $flag['flag']);
                     $add_flag = 0;
                     foreach ($conditions as $c) {
                         $condition = explode(":", $c);
                         if ($condition[0] == 'quality' && $this->get_conditions_num($equip_suit_quality, $condition[1]) >= $fnum[1]) {
                             $add_flag += 1;
                         }
                         if ($condition[0] == 'level' && $this->get_conditions_num($equip_level, $condition[1]) >= $fnum[1]) {
                             $add_flag += 1;
                         }
                         if ($condition[0] == 'star' && $this->get_conditions_num($equip_suit_star, $condition[1]) >= $fnum[1]) {
                             $add_flag += 1;
                         }
                     }
                     if (count($conditions) == $add_flag) {
                         $flag_attr = json_decode($flag['attr'], true);
                         $flags_addition['quality'] = $flag_attr;
                         # 改同一类型覆盖了
                         //                            Com_Log::write('equip_flags.'.$player_id,"quality_flag_attr:".var_export($flag_attr,true));
                         //                            foreach($flag_attr as $key=>$val){
                         //                                $arr_equip_attr[$key] += $val['val'];
                         //                            }
                     }
                 } elseif ($flag['type'] == 'strength') {
                     $conditions = explode("|", $flag['condition']);
                     $fnum = explode(":", $flag['flag']);
                     $add_flag = 0;
                     foreach ($conditions as $c) {
                         $condition = explode(":", $c);
                         if ($condition[0] == 'intensive_level' && $this->get_conditions_num($equip_suit_strength, $condition[1]) >= $fnum[1]) {
                             $add_flag += 1;
                         }
                     }
                     if (count($conditions) == $add_flag) {
                         $flag_attr = json_decode($flag['attr'], true);
                         $flags_addition['strength'] = $flag_attr;
                         //                            Com_Log::write('equip_flags.'.$player_id,"strength_flag_attr:".var_export($flag_attr,true));
                         //                            foreach($flag_attr as $key=>$val){
                         //                                $arr_equip_attr[$key] += $val['val'];
                         //                            }
                     }
                 } elseif ($flag['type'] == 'inlay') {
                     $fnum = explode(":", $flag['flag']);
                     if ($equip_suit_inlay >= $fnum[1]) {
                         $flag_attr = json_decode($flag['attr'], true);
                         $flags_addition['inlay'] = $flag_attr;
                         //                            Com_Log::write('equip_flags.'.$player_id,"inlay_flag_attr:".var_export($flag_attr,true));
                         //                            foreach($flag_attr as $key=>$val){
                         //                                $arr_equip_attr[$key] += $val['val'];
                         //                            }
                     }
                 }
             }
         }
         if (!empty($flags_addition)) {
             foreach ($flags_addition as $flag_attr) {
                 foreach ($flag_attr as $key => $val) {
                     $arr_equip_attr[$key] += $val['val'];
                 }
             }
         }
     }
     $equip_model = array();
     for ($i = 0; $i < 10; $i++) {
         if (isset($equip_lists[$i])) {
             if (!empty($equip_lists[$i]['equip_view'])) {
                 if (is_string($equip_lists[$i]['equip_view'])) {
                     $equip_model[$i] = $equip_lists[$i]['equip_view'];
                 } else {
                     $equip_model[$i] = implode(':', $equip_lists[$i]['equip_view']);
                     //先这样 不想清理数据了  下次清理完数据改了
                 }
                 if ($equip_model[$i] == '0:0:0:0' || $equip_model[$i] == '0:0:0') {
                     $equip_model[$i] = '';
                 }
             } else {
                 $equip_model[$i] = '';
             }
         }
     }
     $player_detail['equip_attr'] = $arr_equip_attr;
     $player_detail['skill_starmap_info'] = $player_detail['skill_starmap_info'];
     $result = $this->get_data('PlayerDetail')->update_player_detail($player_id, array('equip_attr' => $arr_equip_attr, 'skill_starmap_info' => $player_detail['skill_starmap_info']));
     if ($result) {
         $player_info = $this->get_data('Player')->get_player_info($player_id, array('career_type', 'level'));
         //同步人物属性
         $arr_part_update['attr'] = '';
         $arr_part_update['player_data'] = array('player_detail' => $player_detail, 'player' => array('career_type' => $player_info['career_type'], 'level' => $player_info['level']));
         $arr_part_update['equip_skill'] = $equip_skill;
         $arr_part_update['equip_model'] = $equip_model;
         $arr_part_update['equip_swallow'] = $equip_swallow;
         $arr_part_update['skill_infos'] = '';
         Protocol_Player::p2c_part_update($player_id, $arr_part_update);
     }
     return $result;
 }