/** * 重新计算下装备下属性 在穿脱 强化身上的装备 * @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; }