public function get_we_swallow_lv_max($vocation_limit, $player_detail) { $wing_lvl = max($player_detail['wing_info'][$vocation_limit]['lvl'], 1); # 翅膀品阶 $max_swallow_lv = 5 + ($wing_lvl - 1); $max_swallow_lv_config = Cache_Forge::getInstance()->get_max_we_swallow_lv(); return min($max_swallow_lv, $max_swallow_lv_config); }
/** * 道具属性结构体 * @param $data * @return array */ public static function get_item_additions(&$data) { $attr_index = Cache_ItemKey::getInstance()->get_item_key(); $role_index = Cache_RoleKey::getInstance()->get_item_key(); // echo "sub_type:".$data['sub_type']."<br>"; $out = array(); $arr_other = array(); $fpower_calc = array(); $fpower_base_calc = array(); if ($data['type'] == 1 || $data['type'] == 6) { if (empty($data['player_prop_id'])) { // $attrData = Cache_EquipBaseAttr::getInstance()->get_equip_base_attr($data['sub_type'],$data['quality'],$data['level'],$data['star_level']); $obj = new Game_Prop(); $attrData = $obj->get_equip_attr($data); unset($obj); // Com_Log::log($attrData,'cache_prop',1); $data['base_attr'] = $attrData['base_attr']; $data['addition_attr'] = $attrData['addition_attr']; $data['base_attr'] = $attrData['base_attr']; $data['level'] = $attrData['level']; $data['intensive_level'] = $attrData['intensive_level']; $data['intensive_desc'] = $attrData['intensive_desc']; } # ---------------------------------------------------------------- # 星图加成信息 # ---------------------------------------------------------------- $star_map = array(); $we_swallow_revise_info = array(); if (!empty($data['star_map_desc'])) { if (is_string($data['star_map_desc'])) { $data['star_map_desc'] = json_decode($data['star_map_desc'], true); } $star_map = self::parse_star_map($data['star_map_desc']); } # ---------------------------------------------------------------- # 基础属性 # ---------------------------------------------------------------- if (!empty($data['base_attr'])) { if (is_string($data['base_attr'])) { $data['base_attr'] = json_decode($data['base_attr'], true); } list($key, $val) = each($data['base_attr']); //基础属性 就一个 # atk相关特殊处理,将atk与atk_max替换成atk_min,因为role_key只有atk_min if ($key == 'atk' || $key == 'atk_max') { $key = 'atk_min'; } $fpower_base_calc[$key] += $val; # ---------------------------------------------------------------- # 强化属性加成 # ---------------------------------------------------------------- if (!empty($data['intensive_desc'])) { if (is_string($data['intensive_desc'])) { $data['intensive_desc'] = json_decode($data['intensive_desc'], true); } list($i_key, $i_val) = each($data['intensive_desc']); //强化属性 if ($i_key == 'atk' || $i_key == 'atk_max') { $i_key = 'atk_min'; } if (isset($star_map['intensify'])) { $i_val += ceil($i_val * ($star_map['intensify'] / 10000)); //星图加成 } $fpower_calc[$i_key] += $i_val; } $fpower_calc[$key] += $val; $out[] = array(0 => intval($attr_index['equip_base_val']), 1 => array(0 => $role_index[$key], 1 => ceil($val), 2 => 0, 3 => $i_val)); } # ---------------------------------------------------------------- # 附加属性 # ---------------------------------------------------------------- if (!empty($data['addition_attr']) && is_array($data['addition_attr'])) { $out_additional = array(); foreach ($data['addition_attr'] as $key => $val) { # -------------------------------------------------------- # 翅膀装备吞噬属性加成 # -------------------------------------------------------- if (!empty($data['we_swallow_info']) && is_array($data['we_swallow_info']['swallow_attr'])) { if (isset($data['we_swallow_info']['swallow_attr'][$key])) { $add_val = $data['we_swallow_info']['swallow_attr'][$key]; if ($key == 'atk' || $key == 'atk_max') { $key = 'atk_min'; } $fpower_calc[$key] += $add_val; } } # -------------------------------------------------------- # 星图加成 # -------------------------------------------------------- if (isset($star_map['additional'])) { $val += $val * ($star_map['additional'] / 10000); } # atk相关特殊处理,将atk与atk_max替换成atk_min,因为role_key只有atk_min if ($key == 'atk' || $key == 'atk_max') { $key = 'atk_min'; } $fpower_base_calc[$key] += $val; if (in_array($key, Cache_AttrConfig::getInstance()->get_percent_key())) { $show_type = 1; //前端显示百分比 } else { $show_type = 0; } $out_additional[] = array(0 => $role_index[$key], 1 => ceil($val), 2 => $show_type, 3 => ceil($add_val), 'sort_priority' => self::$_sort_priority[$key]); $fpower_calc[$key] += $val; } # 排序 Com_Array::multisort($out_additional, array('sort_priority' => 'asc')); unset($out_additional['sort_priority']); $out[] = array(0 => $attr_index['equip_additional'], 1 => $out_additional); } # ---------------------------------------------------------------- # 洗练属性 # ---------------------------------------------------------------- if ($data['type'] == 1) { # 只有装备类才获取 if (empty($data['refine_attr']) || empty($data['refine_info'])) { # 为空显示默认洗练属性 if (!Com_Util::is_first_charge_item($data['prop_id'])) { list($data['refine_attr'], $data['refine_info']) = TenYear::getInstance('Game_EquipRefine')->extend_refine($data['sub_type'], $data['level']); } } if (!empty($data['refine_attr']) && is_array($data['refine_attr'])) { $out_refine = array(); $attr_perfection_sum = 0; $attr_progress_sum = 0; foreach ($data['refine_attr'] as $attr_seq => $attr_info) { # -------------------------------------------------------- # 注意,这两项的取值必须在key做转换之前,否则在key转换后可能导致取不到值 # -------------------------------------------------------- $attr_limit = $data['refine_info']['attr_info'][$attr_seq]['refine_attr_value'] + $data['refine_info']['attr_info'][$attr_seq]['attr_stint']; $attr_ratio = $data['refine_info']['attr_info'][$attr_seq]['attr_ratio']; $attr_progress = ceil($data['refine_info']['attr_info'][$attr_seq]['en_refine_attr_value'] / $data['refine_info']['attr_info'][$attr_seq]['attr_stint'] * 10000); # atk相关特殊处理,将atk与atk_max替换成atk_min,因为role_key只有atk_min if (!is_array($attr_info)) { continue; } # TODO: 为了兼容旧的洗练数据,以后要清档上功能,可以除去这行 list($key, $val) = each($attr_info); if ($key == 'atk' || $key == 'atk_max') { $key = 'atk_min'; } $fpower_base_calc[$key] += $val; $fpower_calc[$key] += $val; $out_refine[] = array(0 => $role_index[$key], 1 => ceil($val), 2 => 0, 3 => $attr_limit, 'sort_priority' => self::$_sort_priority[$key]); $attr_perfection_sum += $attr_ratio; $attr_progress_sum += $attr_progress; } # 排序 Com_Array::multisort($out_refine, array('sort_priority' => 'asc')); unset($out_refine['sort_priority']); $out[] = array(0 => $attr_index['equip_refine'], 1 => $out_refine); $out[] = array(0 => $attr_index['equip_refine_perfection'], 1 => ceil($attr_perfection_sum / 5)); $out[] = array(0 => $attr_index['equip_en_refine_progress'], 1 => ceil($attr_progress_sum / $data['refine_info']['last_refine_type'])); } } #策划要一个道具的基础属性战力 $fpower_base = Formula_Fpower::calc_fpower($fpower_base_calc); $out[] = array(0 => intval($attr_index['raw_fpower']), 1 => $fpower_base); # ---------------------------------------------------------------- # 强化等级 # ---------------------------------------------------------------- if (!empty($data['intensive_level'])) { $out[] = array(0 => $attr_index['intensive_level'], 1 => $data['intensive_level']); } # ---------------------------------------------------------------- # 最大强化等级 # ---------------------------------------------------------------- if ($data['type'] == 1) { # 只有装备类才获取 $intensify_lv_limit = TenYear::getInstance('Game_EquipIntensifier')->get_intensify_lv_limit_by_item_level($data['level']); $out[] = array(0 => $attr_index['intensify_max'], 1 => $intensify_lv_limit); } # ---------------------------------------------------------------- # 强化属性 # ---------------------------------------------------------------- if (!empty($data['intensive_desc'])) { if (is_string($data['intensive_desc'])) { $data['intensive_desc'] = json_decode($data['intensive_desc'], true); } $val = 0; list($key, $val) = each($data['intensive_desc']); //强化属性 # atk相关特殊处理,将atk与atk_max替换成atk_min,因为role_key只有atk_min if ($key == 'atk' || $key == 'atk_max') { $key = 'atk_min'; } if (isset($star_map['intensify'])) { $val += ceil($val * ($star_map['intensify'] / 10000)); //星图加成 } $fpower_calc[$key] += $val; $out[] = array(0 => $attr_index['equip_strengthen_val'], 1 => $val); } # ---------------------------------------------------------------- # 翅膀装备吞噬等级与经验 # ---------------------------------------------------------------- if ($data['type'] == 6) { # 只有翅膀装备类才获取 if (!empty($data['we_swallow_info'])) { $out[] = array(0 => $attr_index['wing_equip_swallow_lv'], 1 => $data['we_swallow_info']['swallow_lv']); $out[] = array(0 => $attr_index['wing_equip_swallow_exp'], 1 => $data['we_swallow_info']['swallow_exp']); } else { $out[] = array(0 => $attr_index['wing_equip_swallow_lv'], 1 => 0); $out[] = array(0 => $attr_index['wing_equip_swallow_exp'], 1 => 0); } } # ---------------------------------------------------------------- # 镶嵌宝石属性 # ---------------------------------------------------------------- $gem_item = array(); $gem_configs = array(); $hole_stint = TenYear::getInstance('Game_EquipInlayGems')->get_prop_inlay_gem_hole_stint($data); # 孔位上限 for ($i = 1; $i <= $hole_stint; $i++) { //镶嵌部分 if (!empty($data['inlay_gems'][$i])) { $gem_id = $data['inlay_gems'][$i]; if (!isset($gem_configs[$gem_id])) { $gem_configs[$gem_id] = Cache_Forge::getInstance()->get_inlay_gems_by_id($gem_id); } $attr = self::parse_gem_config_attr($gem_configs[$gem_id]); $out_additional = array(); $gem_fpower = 0; if (!empty($attr)) { foreach ($attr as $key => $val) { if ($key == 'atk' || $key == 'atk_max') { $key = 'atk_min'; } if (isset($star_map['gem'])) { $val += ceil($val * ($star_map['gem'] / 10000)); //星图加成 } /** if(in_array($key,Cache_AttrConfig::getInstance()->get_percent_key())){ $show_type = 1; //前端显示百分比 } else{ $show_type = 0; } **/ if (isset($role_index[$key])) { $fpower_calc[$key] += $val; $out_additional[] = array(0 => $role_index[$key], 1 => intval($val)); } } $gem_fpower += Formula_Fpower::calc_fpower($attr); } $gem_item[] = array(0 => $i, 1 => self::get_prop_struct($gem_configs[$gem_id]), 2 => $gem_fpower, 3 => $out_additional); //0 sid 1 战力 2 属性 } else { $gem_item[] = array(0 => $i, 1 => array(), 2 => 0, 3 => array()); //0 sid 1 战力 2 属性 } } $out[] = array(0 => $attr_index['gem'], 1 => $gem_item); //星图属性 if (isset($data['star_map_id']) && $data['star_map_id'] > 0) { $star_attr = array(); $star_map_config = Cache_Prop::getInstance()->get_prop_info($data['star_map_id']); $star_attr['star'] = self::get_prop_struct($star_map_config); $star_attr['power'] = 0; //战力计算 $star_attr['property'] = array(); $star_map_info = Cache_Forge::getInstance()->get_star_map_config_byid($data['star_map_id']); if ($star_map_info) { foreach ($star_map_info as $k => $v) { $a = array(); $a['addition_type'] = self::$_star_map_attr_enum[$v['data']]; #$a['addition_key'] = $v['data']; $a['addition_val'] = $v['data_value']; if (isset($attr_index[$k])) { // if(!isset($attr_index[$k])){ // Com_Log::log($k,'addition',1); // } $a['condition_type'] = 0; $a['condition_key'] = array('k' => $attr_index[$k], 'v' => $v['limit_value'], 'per' => 0); } else { if ($k == 'inlay_gems_lv') { $a['condition_type'] = 1; } elseif ($k == 'inlay_gems') { $a['condition_type'] = 2; } elseif ($k == 'activate') { $a['condition_type'] = 3; } $a['condition_key'] = array('k' => 0, 'v' => $v['limit_value'], 'per' => 0); } $star_attr['property'][] = $a; } } $out[] = array(0 => $attr_index['star'], 1 => $star_attr); } # ---------------------------------------------------------------- # 吞噬属性:需要写死传回已配置的所有吞噬属性,即便当前道具尚未有激活任意项吞噬属性,也需要用初始值填充 # ---------------------------------------------------------------- list($allow_swallow_sub_type, $allow_swallow_id) = TenYear::getInstance('Game_EquipSwallow')->get_swallow_restriction_info($data['sub_type']); $distinct_swallow_list = Cache_Forge::getInstance()->get_distinct_swallow_list(); foreach ($distinct_swallow_list as $swallow_info) { if (!empty($allow_swallow_id) && !in_array($swallow_info['swallow_id'], $allow_swallow_id)) { continue; } $swallow[$swallow_info['swallow_id']] = array('swallow_id' => $swallow_info['swallow_id'], 'swallow_lv' => 0, 'swallow_exp' => 0); } if (!empty($data['swallow_info'])) { foreach ($data['swallow_info'] as $swallow_id => $swallow_info) { $swallow[$swallow_id] = array('id' => $swallow_info['swallow_id'], 'lv' => $swallow_info['swallow_lv'], 'value' => $swallow_info['swallow_exp']); } } $out[] = array(0 => $attr_index['swallow'], 1 => $swallow); if (!empty($data['equip_view'])) { if (is_string($data['equip_view'])) { $equip_view = $data['equip_view']; } else { $equip_view = implode(':', $data['equip_view']); } if ($equip_view == '0:0:0:0' || $equip_view == '0:0:0') { $equip_view = ''; } } $out[] = array(0 => $attr_index['equip_view'], 1 => $equip_view); if (!empty($fpower_calc)) { // Com_Log::log('============[start]===========','equip_fpower',1); // Com_Log::log("prop_id:{$data['prop_id']}",'equip_fpower',1); // Com_Log::log($fpower_calc,'equip_fpower',1); $data['fpower'] = Formula_Fpower::calc_fpower($fpower_calc); // Com_Log::log("fpower:{$data['fpower']}",'equip_fpower',1); // Com_Log::log('============[end]===========','equip_fpower',1); } else { $data['fpower'] = 0; } } foreach (self::$_out_base_keys as $key) { if ($key == 'bind_type') { #特殊处理下 if (isset($attr_index[$key]) && isset($data['bind_flag'])) { $out[] = array(0 => intval($attr_index[$key]), 1 => intval($data['bind_flag'])); } } elseif ($key == 'star_level') { if ($data['star_level'] > 10) { $data['star_level'] = $data['show_star']; } $out[] = array(0 => intval($attr_index[$key]), 1 => intval($data['star_level'])); } else { if (isset($attr_index[$key]) && isset($data[$key]) && !empty($data[$key])) { $out[] = array(0 => intval($attr_index[$key]), 1 => intval($data[$key])); } } } return $out; }
/** * 获取装备的属性 * @param $arrPropConfig * @return mixed */ public function get_equip_attr($arrPropConfig) { if (($arrPropConfig['type'] == 1 or $arrPropConfig['type'] == 6) && !isset($arrPropConfig['base_attr'])) { if ($arrPropConfig['rechage'] == 1) { #首充 $rechage_config = Cache_Rechage::getInstance()->get_rechage($arrPropConfig['prop_id']); if (empty($rechage_config)) { $arrPropConfig['base_attr'] = array(); $arrPropConfig['addition_attr'] = array(); } else { if ($rechage_config['base_attribute']) { $base = explode(":", $rechage_config['base_attribute']); $arrPropConfig['base_attr'][$base[0]] = $base[1]; } if ($rechage_config['add_attribute']) { $addition = explode("|", $rechage_config['add_attribute']); foreach ($addition as $attrs) { $attr = explode(":", $attrs); $arrPropConfig['addition_attr'][$attr[0]] = $attr[1]; } } if ($rechage_config['use_level']) { $arrPropConfig['level'] = $rechage_config['use_level']; } if ($rechage_config['strengthen_level']) { $arrPropConfig['intensive_level'] = $rechage_config['strengthen_level']; $intensify_config = Cache_Forge::getInstance()->get_intensify_info($rechage_config['strengthen_level']); $arrPropConfig['intensive_desc'] = Game_EquipIntensifier::get_latest_intensive_desc($arrPropConfig, $intensify_config); } } return $arrPropConfig; } else { #$equip = Cache_EquipBaseAttr::getInstance()->get_equip_base_attr($arrPropConfig['sub_type'],$arrPropConfig['quality'],$arrPropConfig['level'],$arrPropConfig['star_level']); $equip = Cache_EquipBaseAttr::getInstance()->generate_prop_attr($arrPropConfig['type'], $arrPropConfig['sub_type'], $arrPropConfig['quality'], $arrPropConfig['level'], $arrPropConfig['vocation_limit'], $arrPropConfig['star_level']); if ($arrPropConfig['type'] == 6 && $arrPropConfig['sub_type'] == 7 && $arrPropConfig['attr_not_rand']) { # 翅膀装备羽心类可能要求附加属性不随机 $stable_addition_attr = array(); # 获取翅膀装备信息 $item_info = Cache_PlayerWing::getInstance()->get_wing_equip_gift_info($arrPropConfig['prop_id']); if (!empty($item_info)) { $attr_key_hash = Struct_Prop::$_sort_priority; # 使用这个哈希可以确保属性key的有效性及顺序性 foreach ($attr_key_hash as $attr_key => $val) { if (!empty($item_info[$attr_key])) { $stable_addition_attr[$attr_key] = $item_info[$attr_key]; } } } if (!empty($stable_addition_attr)) { $equip['addition_attr'] = $stable_addition_attr; } } $arrPropConfig['star_level'] = $equip['star_level']; if (!empty($equip['base_attr'])) { $arrPropConfig['base_attr'] = $equip['base_attr']; } if (!empty($equip['addition_attr'])) { $arrPropConfig['addition_attr'] = $equip['addition_attr']; } if (!empty($equip['refine_attr'])) { $arrPropConfig['refine_attr'] = $equip['refine_attr']; } if (!empty($equip['refine_info'])) { $arrPropConfig['refine_info'] = $equip['refine_info']; } return $arrPropConfig; } } else { return $arrPropConfig; } }
private function get_inherit_consume_info($item_level, $cost_prop_flag) { $forge_common_info = Cache_Forge::getInstance()->get_forge_common_info($item_level, 1); if ($cost_prop_flag) { return $forge_common_info['inherit_cost']; } $cost_currency_string_list = array(); # 消耗的货币 if (!empty($forge_common_info['inherit_cost'])) { $cost_entry_array = explode("|", $forge_common_info['inherit_cost']); # 消耗项数组 foreach ($cost_entry_array as $cost_entry) { list($cost_type, $cost_num) = explode(":", $cost_entry); $cost_key = Cache_Currency::getInstance()->get_key($cost_type); if ($cost_key != 'prop') { $cost_currency_string_list[] = $cost_entry; } } } return implode("|", $cost_currency_string_list); }
/** * 重新计算下装备下属性 在穿脱 强化身上的装备 * @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; }
public function get_swallow_restriction_info($item_sub_type) { $allow_swallow_sub_type = array(); $allow_swallow_id = array(); if (empty($item_sub_type)) { return array($allow_swallow_sub_type, $allow_swallow_id); } $swallow_restriction = Cache_Forge::getInstance()->get_swallow_restriction($item_sub_type); if (!empty($swallow_restriction['allow_swallow_sub_type'])) { $allow_swallow_sub_type = explode(":", $swallow_restriction['allow_swallow_sub_type']); } $swallow_id_list = Cache_Forge::getInstance()->get_swallow_id_by_sub_type($allow_swallow_sub_type); if (!empty($swallow_id_list)) { foreach ($swallow_id_list as $record) { $allow_swallow_id[] = $record['swallow_id']; } } return array($allow_swallow_sub_type, $allow_swallow_id); }
/** * @Purpose: * 获取传承后的翅膀装备 * @Param &$inherit_equipment 传承装备 * @Param &$be_inherit_equipment 继承装备 */ private function get_inherit_wing_equip(&$inherit_equipment, &$be_inherit_equipment) { $is_inherit = $this->is_inherit($inherit_equipment, $be_inherit_equipment); if ($is_inherit !== true) { $this->throw_error($is_inherit); } if ($inherit_equipment['intensive_level'] <= $be_inherit_equipment['intensive_level'] && $inherit_equipment['we_swallow_info']['swallow_exp'] <= $be_inherit_equipment['we_swallow_info']['swallow_exp']) { $this->throw_error('80506'); #没有可传承的属性 } #强化传承 if ($inherit_equipment['intensive_level'] > $be_inherit_equipment['intensive_level']) { #继承装备强化属性计算 $be_inherit_equipment['intensive_level'] = $inherit_equipment['intensive_level']; $be_inherit_equipment['intensive_lose_times'] = 0; $update_field[$be_inherit_equipment['player_prop_id']]['intensive_level'] = $be_inherit_equipment['intensive_level']; $update_field[$be_inherit_equipment['player_prop_id']]['intensive_lose_times'] = $be_inherit_equipment['intensive_lose_times']; $intensify_table = Cache_WingEquipment::getInstance()->get_wing_equip_intensify_info(array('level' => $be_inherit_equipment['intensive_level'])); if (empty($intensify_table)) { $this->throw_error('10109'); #配置表读取错误 } $be_inherit_equipment['intensive_desc'] = $this->get_latest_intensive_desc($be_inherit_equipment, $intensify_table); $update_field[$be_inherit_equipment['player_prop_id']]['intensive_desc'] = $be_inherit_equipment['intensive_desc']; #传承装备强化属性还原 $inherit_equipment['intensive_level'] = 0; $inherit_equipment['intensive_desc'] = array(); $inherit_equipment['intensive_lose_times'] = 0; $update_field[$inherit_equipment['player_prop_id']]['intensive_level'] = $inherit_equipment['intensive_level']; $update_field[$inherit_equipment['player_prop_id']]['intensive_desc'] = $inherit_equipment['intensive_desc']; $update_field[$inherit_equipment['player_prop_id']]['intensive_lose_times'] = $inherit_equipment['intensive_lose_times']; } #吞噬传承 if ($inherit_equipment['we_swallow_info']['swallow_exp'] > $be_inherit_equipment['we_swallow_info']['swallow_exp']) { $be_inherit_equipment['we_swallow_info']['swallow_lv'] = $inherit_equipment['we_swallow_info']['swallow_lv']; $be_inherit_equipment['we_swallow_info']['swallow_exp'] = $inherit_equipment['we_swallow_info']['swallow_exp']; # 根据吞噬等级,计算吞噬加成附加属性 $we_swallow_revise_info = Cache_Forge::getInstance()->get_we_swallow_config_by_lv($be_inherit_equipment['we_swallow_info']['swallow_lv']); if (empty($we_swallow_revise_info)) { $this->throw_error('80047'); # 未找到翅膀装备吞噬配置信息 } foreach ($be_inherit_equipment['addition_attr'] as $attr_key => $attr_val) { $attr_val = ceil($attr_val * $we_swallow_revise_info['attr_revise_ratio'] / 10000) + $we_swallow_revise_info[$attr_key]; $be_inherit_equipment['we_swallow_info']['swallow_attr'][$attr_key] = $attr_val; } $update_field[$be_inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_lv'] = $be_inherit_equipment['we_swallow_info']['swallow_lv']; $update_field[$be_inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_exp'] = $be_inherit_equipment['we_swallow_info']['swallow_exp']; $update_field[$be_inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_attr'] = $be_inherit_equipment['we_swallow_info']['swallow_attr']; $inherit_equipment['we_swallow_info']['swallow_lv'] = 0; $inherit_equipment['we_swallow_info']['swallow_exp'] = 0; $inherit_equipment['we_swallow_info']['swallow_attr'] = array(); $update_field[$inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_lv'] = $inherit_equipment['we_swallow_info']['swallow_lv']; $update_field[$inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_exp'] = $inherit_equipment['we_swallow_info']['swallow_exp']; $update_field[$inherit_equipment['player_prop_id']]['we_swallow_info']['swallow_attr'] = $inherit_equipment['we_swallow_info']['swallow_attr']; } return $update_field; }
private function filter_unvalid_starmap($player_prop_info, $player_star_map) { foreach ($player_star_map as $key => $val) { $starmap_config = Cache_Forge::getInstance()->get_starmap_info($val['prop_id']); if (!empty($starmap_config[0]['require_career_type'])) { $require_career_type = explode(":", $starmap_config[0]['require_career_type']); if (!in_array($player_prop_info['career_type'], $require_career_type)) { unset($player_star_map[$key]); } } if (!empty($starmap_config[0]['require_sub_type'])) { $require_sub_type = explode(":", $starmap_config[0]['require_sub_type']); if (!in_array($player_prop_info['sub_type'], $require_sub_type)) { unset($player_star_map[$key]); } } if (!empty($starmap_config[0]['require_equip_level'])) { if ($player_prop_info['level'] < $starmap_config[0]['require_equip_level']) { unset($player_star_map[$key]); } } } return $player_star_map; }
private function filter_unvalid_gems($player_prop_info, $gems) { foreach ($gems as $key => $val) { $gems_config = Cache_Forge::getInstance()->get_inlay_gems_by_id($val['prop_id']); if (!empty($gems_config['require_sub_type'])) { $require_sub_type = explode(":", $gems_config['require_sub_type']); if (!in_array($player_prop_info['sub_type'], $require_sub_type)) { unset($gems[$key]); } } } return $gems; }
public function get_intensify_lv_limit_by_item_level($item_level, $is_throw_error = 0) { $forge_common_info = Cache_Forge::getInstance()->get_forge_common_info($item_level); if ($is_throw_error && empty($forge_common_info)) { $this->throw_error('80319'); # 找不到锻造通用配置信息 } $intensify_lv_limit = empty($forge_common_info['intensify_lv_limit']) ? 0 : $forge_common_info['intensify_lv_limit']; $real_intensify_lv_limit = min($intensify_lv_limit, $this->max_intensify_lv); return $real_intensify_lv_limit; }
private function _forward_compatibility_for_wing_equip_swallow_info(&$prop_detail, $player_detail = null) { if (empty($prop_detail) || !is_array($prop_detail)) { return; } if ($prop_detail['type'] == 6 && !empty($prop_detail['we_swallow_info']) && intval($prop_detail['refine_version']) < 13) { if (empty($player_detail)) { $player_detail = $this->get_data('PlayerDetail')->get_player_detail($prop_detail['player_id'], array('wing_info')); } $swallow_lv_max = $this->get_game('WingEquipSwallow')->get_we_swallow_lv_max($prop_detail['vocation_limit'], $player_detail); # 根据吞噬属性的exp,刷新吞噬属性的lv $swallow_config = Cache_Forge::getInstance()->get_we_swallow_config_by_exp($prop_detail['we_swallow_info']['swallow_exp']); if (!empty($swallow_config)) { $prop_detail['we_swallow_info']['swallow_lv'] = min($swallow_config['swallow_lv'], $swallow_lv_max); } # 根据吞噬等级,修正经验并计算吞噬加成附加属性 $we_swallow_revise_info = Cache_Forge::getInstance()->get_we_swallow_config_by_lv($prop_detail['we_swallow_info']['swallow_lv']); if (!empty($we_swallow_revise_info)) { if ($prop_detail['we_swallow_info']['swallow_exp'] > $we_swallow_revise_info['swallow_exp'] - 1) { $prop_detail['we_swallow_info']['swallow_exp'] = $we_swallow_revise_info['swallow_exp'] - 1; } foreach ($prop_detail['addition_attr'] as $attr_key => $attr_val) { $attr_val = ceil($attr_val * $we_swallow_revise_info['attr_revise_ratio'] / 10000) + $we_swallow_revise_info[$attr_key]; $prop_detail['we_swallow_info']['swallow_attr'][$attr_key] = $attr_val; } } } }