/** * 道具变更下行协议 * @param $player_id * @param $change_prop 二维数组 传进去player_prop的内容 * 如果是位置变更 要加上 ['from_item_position'] 原始位置 ['from_grid'] 原始格子数 * player_prop里面的 item_position 赋值为新的位置编号 grid 赋值为新的格子编号 * @param $error_code 0 失败 1成功 * @param $cmd0 3 直接返回给flash 8 通过异步返回 * @param $flag 协议输出格式 0 直接输出 1 标志为粘包 2返回协议内容 3 附加粘包 * */ public static function prop_806($player_id, $change_prop, $func_id = 0, $error_code = 1, $cmd0 = 3, $flag = 3) { //后面三个参数不用了 $data['type'] = 1; $data['result'] = $error_code; $data['box'] = array(); if (!empty($change_prop)) { foreach ($change_prop as $prop) { $tmp_prop = array(); if ($prop['item_num'] <= 0) { //道具数量等于0的时候 只给位置信息就好了 $tmp_prop['item_position'] = $prop['item_position']; $tmp_prop['grid'] = $prop['grid']; } else { # 要求只有新发的道具的from_item_position=0,老道具都要求非0 $tmp_prop = $prop; $tmp_prop['from_item_position'] = $prop['from_item_position']; } $data['box'][] = Struct_Prop::get_item_box_operate_struct($tmp_prop); } } $data['func_id'] = $func_id; if (!IS_FRONT) { Protocol::input($player_id, 8, 8, 806, $data); Protocol::out(); } else { if (defined('FROM_GATEWAY')) { $cmd0 = 8; } Protocol::input($player_id, $cmd0, 8, 806, $data); } }
public static function get_fashion_struct($data) { if (empty($data)) { return array(); } return array(0 => intval($data['flag']), 1 => Struct_Prop::get_item_box_struct($data)); }
public static function out($func_id = 0) { if (!empty(self::$_reward)) { foreach (self::$_reward as $player_id => $reward) { $out = array('type' => 1, 'reward' => array()); foreach ($reward as $r) { if (isset($r['overlay_num']) && $r['overlay_num'] > 0) { $r['item_num'] = $r['overlay_num']; } $out['reward'][] = Struct_Prop::get_prop_struct($r); } $out['func_id'] = $func_id; Protocol::input($player_id, 8, 7, 843, $out); } self::$_reward = null; } }
public function get_chain_task_list($player_id, $task_info = null, $player_info = null, $finish_num = null, $daily_finish_num = null) { if (is_null($task_info)) { $task_info = $this->get_data('PlayerTask')->get_task_info($player_id, array('chain_val')); } if (is_null($player_info)) { $player_info = $this->get_data('Player')->get_player_info($player_id, array('level')); } if (is_null($finish_num)) { $finish_num = $this->get_data('PlayerTask')->get_chain_task_count($player_id); if ($finish_num <= 0 && !empty($task_info['chain_val'])) { $this->get_data('PlayerTask')->set_chain_task_count($player_id); } } if (is_null($daily_finish_num)) { $daily_finish_num = $this->get_data('PlayerTask')->get_chain_task_daily_count($player_id); } $out = array(); $out['list'] = array(); $chain_val = $task_info['chain_val']; if (!empty($chain_val)) { $reward = $this->get_reward($player_info['level'], $finish_num); if ($reward) { foreach ($reward as $key => $val) { $prop = Cache_Prop::getInstance()->get_prop_info($val['id']); $prop['item_num'] = $val['num']; $reward[$key] = Struct_Prop::get_prop_struct($prop); } } $out['list'][] = $this->format_task_chain_struct(array('task_id' => $chain_val['task_id'], 'task_step' => $chain_val['task_step'], 'task_status' => $chain_val['task_status'], 'cur_num' => $chain_val['cur_num'], 'task_award' => $reward, 'task_target' => $this->get_game('TaskMain')->format_target($chain_val['target'], $chain_val['step_type']), 'hero_status' => $chain_val['hero_status'])); } $out['count'] = $finish_num <= 0 ? 1 : $finish_num; $out['time'] = $this->get_data('PlayerTask')->get_chain_task_count_ttl($player_id); $out['daily_count'] = $daily_finish_num <= 0 ? 1 : $daily_finish_num; return $out; }
public function get_auth_reward_list($player_id, $vip_type) { $res = array(); $player_id = intval($player_id); $vip_type = intval($vip_type); $player_info = $this->get_data('Player')->get_player_info($player_id, array('vip')); $item_list = array(); $title_list = array(); if (!empty($player_info) && $player_info['vip'] >= $vip_type) { $reward_list = Cache_VipReward::getInstance()->get_vip_auth_list($vip_type); if (!empty($reward_list)) { foreach ($reward_list as $val) { if ($val['title_id'] > 0) { $title_list[] = $this->get_game('PlayerAchieve')->get_title_finish_progress($player_id, $val['title_id']); } else { $item_a = Cache_Prop::getInstance()->get_prop_info($val['item_id']); $item_a['item_num'] = $val['item_num']; $item_arrt = Struct_Prop::get_prop_struct($item_a); $item_list[] = $item_arrt; } } } else { $this->throw_error(10222, 2012016); } } $res[] = $item_list; $res[] = $title_list; $res[] = $vip_type; return $res; }
public function get_everyday_do($player_id, $type, $player_info_all = null, $player_detail_all = null, $player_used_time = null) { $everyday_config = Cache_EverydayDo::getInstance()->get_everyday_do_info($type); if (empty($everyday_config)) { $this->throw_error('10107'); } $out = array(); if (is_null($player_detail_all)) { $func_open = $this->get_data('PlayerDetail')->get_player_detail($player_id, 'func_open'); } else { $func_open = $player_detail_all['func_open']; } if (is_null($player_info_all)) { $player_info = $this->get_data('Player')->get_player_info($player_id, array('level', 'career_type')); } else { $player_info = $player_info_all; } if (is_null($player_used_time)) { $player_used_time = $this->get_data('PlayerDailyTime')->get_player_used_time($player_id); } $arr_times = $this->get_daily_time($player_id, null, $player_used_time); $finish = array(); $out[0] = array(); $i = 0; // $func_configs = Cache_FuncConfig::getInstance()->get_func_config_info(); foreach ($everyday_config as $val) { if (!isset($func_open[$val['func_id']])) { #判断功能是否开启 continue; } $arr_reward = array(); if (!empty($val['reward_1'])) { $rewards1 = Com_FmtData::format_table_prop2($val['reward_1']); if ($rewards1) { foreach ($rewards1 as $item) { if ($item['career_type'] != $player_info['career_type']) { continue; } $data = Cache_Prop::getInstance()->get_prop_info($item['id']); $data['item_num'] = $item['num']; $arr_reward[] = Struct_Prop::get_prop_struct($data); } } } if (!empty($val['reward_2'])) { $rewards2 = Com_FmtData::format_table_prop($val['reward_2']); foreach ($rewards2 as $item) { $data = array('prop_id' => $item['id'], 'item_num' => $item['num']); $arr_reward[] = Struct_Prop::get_prop_struct($data); } } if (in_array($val['func_id'], $this->_can_add_times)) { $show_add_times = 1; } else { $show_add_times = 0; } if ($arr_times[$val['func_id']]['cur_num'] < $arr_times[$val['func_id']]['max_num']) { if ($i < 2 && $type > 0) { $recommend = 1; } else { $recommend = 0; } $out[0][] = array('type' => $type, 'icon_id' => $val['func_id'], 'reward' => $arr_reward, 'max_num' => intval($arr_times[$val['func_id']]['max_num']), 'cur_num' => intval($arr_times[$val['func_id']]['cur_num']), 'jump_id' => $val['jump_id'], 'recommend' => $recommend, 'show_add_times' => $show_add_times, 'star' => $val['star']); } else { $finish[] = array('type' => $type, 'icon_id' => $val['func_id'], 'reward' => $arr_reward, 'max_num' => intval($arr_times[$val['func_id']]['max_num']), 'cur_num' => intval($arr_times[$val['func_id']]['cur_num']), 'jump_id' => $val['jump_id'], 'recommend' => 0, 'show_add_times' => $show_add_times, 'star' => $val['star']); } ++$i; } if (!empty($finish)) { $out[0] = array_merge($out[0], $finish); } return $out; }
public function get_enhanced_refine_info($player_id, $player_prop_id, $refine_attr_seq = 0) { #$this->get_game('PlayerFunc')->get_func_is_open($player_id, $this->func_id_enhanced_refine); $this->param_check_numeric(array($player_id)); $player_equip_info = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $player_prop_id); if (!$player_equip_info) { $this->throw_error('80013'); # 玩家没有该装备! } if (Com_Util::is_first_charge_item($player_equip_info['prop_id'])) { $this->throw_error('81105'); # 首充装备不允许精练 } $out_849 = array('player_prop_id' => $player_prop_id, 'refine_info_list' => array(), 'add_success_rate_cost' => "{$this->add_success_rate_cost_cur_type}:{$this->add_success_rate_cost_cur_value}", 'add_success_rate' => $this->add_success_rate, 'attr_perfection_avg' => 0, 'refine_attr_seq' => empty($refine_attr_seq) ? 1 : $refine_attr_seq); # -------------------------------------------------------------------- # 获取装备洗练属性信息 + 计算精炼属性增量,成功率与货币消耗 # -------------------------------------------------------------------- $attr_perfection_sum = 0; if (!empty($player_equip_info['refine_info'])) { $refine_info_mod = $this->get_en_refine_success_rate_and_cost_currency($player_equip_info['refine_info']); foreach ($refine_info_mod['attr_info'] as $attr_seq => $attr_info) { $en_refine_attr_value_current_lv = $attr_info['en_refine_success_num'] * ceil($attr_info['attr_limit'] / $attr_info['attr_section']); if ($attr_info['en_refine_lv'] >= $player_equip_info['level'] && $en_refine_attr_value_current_lv >= $attr_info['attr_limit']) { $en_refine_attr_delta = 0; # 已满 } else { $en_refine_attr_delta = ceil($attr_info['attr_limit'] / $attr_info['attr_section']); } $out_849['refine_info_list'][] = array('attr_seq' => $attr_info['attr_seq'], 'attr_key' => Cache_RoleKey::getInstance()->get_item_key($attr_info['attr_key']), 'attr_value' => $attr_info['attr_value'], 'attr_limit' => $attr_info['refine_attr_value'] + $attr_info['attr_stint'], 'attr_perfection' => $attr_info['attr_ratio'], 'en_refine_attr_delta' => $en_refine_attr_delta, 'en_refine_success_rate' => $attr_info['en_refine_success_rate'], 'en_refine_cost_currency' => $attr_info['en_refine_cost_currency'], 'lock_status' => 0); $attr_perfection_sum += $attr_info['attr_ratio']; } } $out_849['refine_info_list'] = Struct_Prop::attr_sort_2($out_849['refine_info_list']); $out_849['attr_perfection_avg'] = ceil($attr_perfection_sum / 5); #var_export($out_849); return $out_849; }
/** * 获取成就某勋章任务列表 * */ public function get_achieve_medal_task_list($player_id, $title_id) { $this->achieve_repair($player_id); $achieve_configs = Cache_AchieveConfig::getInstance()->get_achieve_config_by_titleid($title_id); if (empty($achieve_configs)) { $this->throw_error('10222'); } $task_type_progress = $this->get_data('PlayerAchieveCounter')->get_player_achieve_counter_info($player_id, 'task_type_progress'); $player_achieve_title_data = $this->get_data('PlayerAchieve')->get_player_achieve_info($player_id, $title_id); $data["achieve_list"] = array(); $target_finish_num = 0; foreach ($achieve_configs as $config) { $item = array(); $player_achieve_data = $player_achieve_title_data[$config['achieve_id']]; $item['achieve_id'] = $config['achieve_id']; $item['achieve_state'] = intval($player_achieve_data['state']); //1为点亮 $item['target_info'] = $config['target_info']; $item['reward'] = $this->get_format_achieve_reward($config["reward"]); foreach ($item['reward'] as $key => $val) { $prop_id = $val[0]; $prop_num = $val[1]; $arrPropConfig = Cache_Prop::getInstance()->get_prop_info($prop_id); if (!isset($arrPropConfig['base_attr'])) { if ($arrPropConfig['type'] == 1 || $arrPropConfig['type'] == 6) { if (isset($player_achieve_title_data[$config['achieve_id']]['config'][$prop_id])) { $arrPropConfig = $player_achieve_title_data[$config['achieve_id']]['config'][$prop_id]; } else { if (!isset($arrPropConfig['base_attr'])) { $arrPropConfig = $this->get_game("Prop")->get_equip_attr($arrPropConfig); } $player_achieve_title_data[$config['achieve_id']]['config'][$prop_id] = $arrPropConfig; $this->get_data("PlayerAchieve")->update_player_achieve($player_id, $title_id, $player_achieve_title_data, $config['achieve_id']); } } } $arrPropConfig['item_num'] = $prop_num; $arrPropConfig['bind_flag'] = 0; $item['reward'][$key][3] = Struct_Prop::get_prop_struct($arrPropConfig); } $item['icon'] = $config['icon']; $item['reward_state'] = $item['reward'] ? intval($player_achieve_data['reward_state']) : 0; //奖励领取状态 $item['achieve_point'] = intval($config['achieve_point']); //成就点 $item['upts'] = intval($player_achieve_data['upts']); $item['target_title'] = $config['target_title']; $finish_num = 0; $total_num = intval($config['target_val']); if (in_array($config['achieve_type'], array(6, 10, 35, 36, 40, 48))) { //装备(品质:星级:强化) $arr_target_val = explode(":", $config['target_val']); $total_num = $arr_target_val[0]; $finish_num = $player_achieve_data['val']; } else { if ($config['achieve_type'] == 28) { //圣器 $finish_val = 0; $arr_config_val = explode(":", $config['target_val']); for ($i = 0; $i < count($arr_config_val); $i++) { if ($i % 2 != 0) { $finish_val += intval($arr_config_val[$i]); } } $arr_finish_num = json_decode($finish_num, true); if (is_array($arr_finish_num)) { $finish_num = array_sum($arr_finish_num); } $total_num = $finish_val; } else { if (isset($task_type_progress[$config['achieve_type']]) && $finish_num == 0) { $finish_num = intval($task_type_progress[$config['achieve_type']]['val']); } } } #资源类从player表里读取 if ($config['achieve_type'] == 23) { $finish_num = $this->get_data('Player')->get_player_info($player_id, "silver"); } $item['target_finish_num'] = intval($finish_num); $item['target_total_num'] = intval($total_num); $item['target_tips'] = str_replace("%s", intval($finish_num), $config['target_tips']); $show_progress = 0; if ($item['achieve_state'] == 0) { $show_progress = intval($config['show_progress']); $item['upts'] = 0; } $item['show_progress'] = $show_progress; if ($item['achieve_state']) { $item['target_tips'] = ""; $target_finish_num++; } $item['achieve_rank'] = $config['achieve_rank']; $data["achieve_list"][] = $item; } $title_config = Cache_TitleConfig::getInstance()->get_title_config_by_id($title_id); //当前称号成就任务完成数量 $data["target_finish_num"] = $target_finish_num; $data["target_total_num"] = count($achieve_configs); $data["title_id"] = $title_id; $data["icon"] = $title_config['icon']; $data["title_name"] = $title_config['title_name']; $data['reward'] = $this->get_format_achieve_attr($title_config['reward']); Com_Array::multisort($data["achieve_list"], array('achieve_state' => 'desc', 'achieve_rank' => 'asc')); return $data; }
/** * 重新计算下装备下属性 在穿脱 强化身上的装备 * @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; }
/** * 获取玩家可合成碎片列表 * @param unknown $player_id * @param unknown $grab_treasure_info * @return Ambigous <multitype:, number> */ public function get_prop_compose_info($player_id, &$grab_treasure_info, $is_refresh = 0) { $grab_treasure_info = $this->get_cross("GrabTreasure")->get_grab_treasure($player_id); $func_vip_info = Cache_VipLevelLimit::getInstance()->get_limit_info_func(1240); foreach ($func_vip_info as $expand_info) { $expand_id = $this->default_refresh_compose_num + $expand_info['max_times']; if ($expand_info['max_times'] > 0 && !isset($expand[$expand_id])) { $expand[$expand_id] = $expand_info["vip_level"]; $max_expand_id = $expand_id; } } $player_info = $this->get_data('Player')->get_player_info($player_id, array('vip', 'level', 'privilege_level')); $auto_refresh_compose_num = $this->default_refresh_compose_num; if ($player_info['vip'] > 0) { #获取VIP类型 $vip_type = Cache_VipLevelLimit::getInstance()->get_limit_info_func_id(1240); if ($vip_type['fun_type'] == 2) { $left_time = $this->get_game('VipSpecial')->get_left_time($player_id); $player_vip = $left_time == 0 ? 0 : $player_info['privilege_level']; } else { $player_vip = $player_info['vip']; } if ($player_vip > 0) { $vip_set = Cache_VipLevelLimit::getInstance()->get_limit_info($player_vip, 1240); if (!empty($vip_set)) { $vip_num = $vip_set['max_times']; } $auto_refresh_compose_num += $vip_num; } } if (empty($grab_treasure_info) || $is_refresh == 1) { #数据空为新手引导 $is_guide = 0; if (empty($grab_treasure_info)) { $is_guide = 1; } #首次自动随机可合成物品 $rand_prop_list = $this->rand_compose_pieces($auto_refresh_compose_num, $player_info['level'], array(), $is_guide); foreach ($rand_prop_list as $prop_id => $pieces) { $rand_prop_ids[] = $prop_id; foreach ($pieces as $piece_id => $quality) { $quality_piece_ids[$quality][$piece_id] = $piece_id; } } $update_data['rand_prop_ids'] = $rand_prop_ids; #随便机产生的可合成物品 $update_data['compose_prop_ids'] = array(); #合成物品ID $update_data['quality_piece_ids'] = $quality_piece_ids; #品质碎片 $update_data['player_id'] = $player_id; $update_data['refresh_compose_num'] = $auto_refresh_compose_num; $update_data["is_guide"] = $is_guide; $update_data["config"] = array(); $this->get_cross("GrabTreasure")->update_grab_treasure($player_id, $update_data); $grab_treasure_info = $update_data; } else { if (!empty($grab_treasure_info['rand_prop_ids']) && count($grab_treasure_info['rand_prop_ids']) < $auto_refresh_compose_num) { #异常处理 $rand_num = $auto_refresh_compose_num - count($grab_treasure_info['rand_prop_ids']); $rand_prop_list = $this->rand_compose_pieces($rand_num, $player_info['level'], $grab_treasure_info['rand_prop_ids']); foreach ($rand_prop_list as $prop_id => $pieces) { $grab_treasure_info['rand_prop_ids'][] = $prop_id; foreach ($pieces as $piece_id => $quality) { $grab_treasure_info['quality_piece_ids'][$quality][$piece_id] = $piece_id; } } $this->get_cross("GrabTreasure")->update_grab_treasure($player_id, $grab_treasure_info); } } $compose_info = array(); for ($i = 0; $i < $max_expand_id; $i++) { $rand_prop_id = intval($grab_treasure_info["rand_prop_ids"][$i]); $pieces = array(); if ($rand_prop_id > 0) { $grab_prop_config = Cache_GrabTreasureBase::getInstance()->get_grab_treasure_id($rand_prop_id); $need_pieces = $grab_prop_config['piece_type']; $arr_need_pieces = explode(",", $need_pieces); foreach ($arr_need_pieces as $key => $piece_id) { $pieces[$key]['prop_id'] = $piece_id; $pieces[$key]['is_get'] = isset($grab_treasure_info['quality_piece_ids'][$grab_prop_config["quality"]][$piece_id]) ? 1 : 0; $pieces[$key]['quality'] = intval($grab_prop_config["quality"]); } } $compose_info[$i]["prop_id"] = $rand_prop_id; $compose_info[$i]["need_vip"] = intval($expand[$i + 1]); $compose_info[$i]["is_open"] = $rand_prop_id > 0 ? 1 : 0; $compose_info[$i]["is_compose"] = 0; $compose_info[$i]["pieces"] = $pieces; $arrPropConfig = Cache_Prop::getInstance()->get_prop_info($rand_prop_id); if (!isset($arrPropConfig['base_attr'])) { if ($arrPropConfig['type'] == 1 || $arrPropConfig['type'] == 6) { if (isset($grab_treasure_info['config'][$rand_prop_id])) { $arrPropConfig = $grab_treasure_info['config'][$rand_prop_id]; } else { if (!isset($arrPropConfig['base_attr'])) { $arrPropConfig = $this->get_game("Prop")->get_equip_attr($arrPropConfig); } $grab_treasure_info['config'][$rand_prop_id] = $arrPropConfig; $this->get_cross("GrabTreasure")->update_grab_treasure($player_id, $grab_treasure_info); } } } $compose_info[$i]["prop_attrs"] = Struct_Prop::get_prop_struct($arrPropConfig); } return $compose_info; }
/** * 获取道具展示 * @param $player_id * @param $player_prop_id * @return array */ public function show_prop($player_id, $player_prop_id) { if (empty($player_prop_id)) { $this->throw_error('80913'); } $prop_info = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $player_prop_id); // Com_Log::write("show_prop",var_export($prop_info,true)); if (empty($prop_info)) { $this->throw_error('80913'); } return array(Struct_Prop::get_prop_struct($prop_info)); }
/** * 获取道具tips * @param $player_id * @param $player_prop_id * @param $item_id * @param $item_num * @return array */ public function get_prop_tips($player_id, $params) { $out = array(); if ($params) { foreach ($params as $val) { if (!empty($val[0])) { $player_prop_info = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $val[0]); } else { $player_prop_info = Cache_Prop::getInstance()->get_prop_info($val[1]); $player_prop_info['item_num'] = $val[2]; } $out[] = Struct_Prop::get_prop_struct($player_prop_info); } } return array(0 => $out); }
public function get_sell_panel($player_id) { $auction_data = $this->get_data('Auction')->get_player_sell_list($player_id); $data = array(); if ($auction_data) { foreach ($auction_data as $val) { $s_time = $this->_past_due - (time() - $val['add_time']); $prop = json_decode($val['prop_info'], true); $data[] = array('auction_id' => $val['auction_id'], 'prop' => Struct_Prop::get_prop_struct($prop), 'time' => $s_time < 0 ? 0 : $s_time, 'sell_price' => $val['sell_price'] / $prop['item_num']); } } return array(0 => $data); }
private function get_list_for_time($time, $job_id) { $list = Cache_CzReward::getInstance()->get_reward_set(); if (empty($list)) { $this->throw_error('10222', 2010026); } $res = array(); foreach ($list as $v) { if ($v['date_type'] == $time) { $temp = array(); if ($v['job_id'] == 1) { $items = explode('|', $v['item_id']); if (count($items) < 4) { $this->throw_error(10222, 2010027); } if ($job_id > count($items)) { $job_id = count($items); } $temp['item_id'] = $items[$job_id - 1]; } else { $temp['item_id'] = intval($v['item_id']); } $value = array(); $value['sid'] = $v['sid']; if ($v['item_type'] == 1) { $item_a = Cache_Prop::getInstance()->get_prop_info($temp['item_id']); $value['attrs'] = Struct_Prop::get_prop_struct($item_a); $value['item_id'] = $temp['item_id']; $value['item_num'] = $v['item_num']; $value['item_type'] = $v['item_type']; $res[] = $value; } elseif ($v['item_type'] == 2) { #翅膀 $value['attrs'] = array(); $value['item_id'] = $temp['item_id']; $value['item_num'] = $v['item_num']; $value['item_type'] = $v['item_type']; $res[] = $value; } elseif ($v['item_type'] == 3) { #时装 $fashion = Cache_Fashion::getInstance()->get_fashion($temp['item_id']); if (empty($fashion)) { $this->throw_error(10222, 2010025); } $value['attrs'] = $this->get_game('PlayerFashion')->get_fashion_data($fashion, 0); $value['item_id'] = $temp['item_id']; $value['item_num'] = $v['item_num']; $value['item_type'] = $v['item_type']; $res[] = $value; } } } return $res; }
public function get_event_reward($player_id, $event_id, $reward_id, $event_template) { $this->param_check_numeric(array($player_id, $event_id, $reward_id)); # 加锁失败 if (!Com_Lock::lock("lock|get_event_reward|player_id={$player_id}")) { $this->throw_error('170501'); # 系统繁忙 } $player_info = $this->get_data('Player')->get_player_info($player_id, Com_Util::get_player_fields(array('currency', 'level', 'vip', 'privilege_level', 'map_id'))); if ($player_info['map_id'] == 2100) { $this->throw_error('12012'); # 请在完成序章后领取 } # 获取活动配置 $event_info = $this->get_data('Event')->get_event_info($event_id); if (empty($event_info) || empty($event_info['event_reward_info'])) { $this->throw_error('12004'); # 无效的活动,未找到活动配置信息 } $reward_id_array = explode(':', $event_info['event_reward_info']); if (!in_array($reward_id, $reward_id_array)) { $this->throw_error('12006'); # 无效的奖励,未找到活动奖励配置信息 } # NOTE: 因为允许在活动结束后领奖,所以领奖时不用活动开启时间段[open_date_head,open_date_tail]做检测 if ($event_info['reward_date_head'] > $this->current_time || $event_info['reward_date_tail'] < $this->current_time) { $this->throw_error('12005'); # 未到或已超过活动奖励领取时间 } # 获取奖励配置 $reward_info = $this->get_data('Event')->get_reward_info($reward_id); if (empty($reward_info) || empty($reward_info['cond_func'])) { $this->throw_error('12006'); # 无效的奖励,未找到活动奖励配置信息 } if (!empty($reward_info['valid_date_head']) || !empty($reward_info['valid_date_tail'])) { if ($reward_info['valid_date_head'] > $this->current_time || $reward_info['valid_date_tail'] < $this->current_time) { $this->throw_error('12007'); # 未到或已超过活动奖励有效时间 } } /** # -------------------------------------------------------------------- # 活动领奖周期内的领奖次数上限判断 # -------------------------------------------------------------------- if (!empty($event_info['event_reward_stint']) && !empty($event_info['event_reward_cycle'])) { # 向上取整获取最大领奖期数 $max_cycle = ceil(($event_info['reward_date_tail'] - $event_info['reward_date_head']) / $event_info['event_reward_cycle']); for($i = 1; $i <= $max_cycle; $i++) { $cycle_head = $event_info['reward_date_head'] + $event_info['event_reward_cycle'] * ($i - 1); # 领奖周期首部时间 $cycle_tail = $event_info['reward_date_head'] + $event_info['event_reward_cycle'] * $i - 1; # 领奖周期尾部时间,减一是为了相邻两个区间没有交集 if ($this->current_time < $cycle_head || $this->current_time > $cycle_tail) { # 当前时间不在该领奖周期内 continue; } else { # 获取该周期内的领奖次数 list($reward_record, $reward_record_count) = $this->get_data('Event')->get_event_reward_record_part($player_id, $event_id, $cycle_head, $cycle_tail); if ($reward_record_count >= $event_info['event_reward_stint']) { $this->throw_error('12008'); # 已达到活动领奖周期内的领取次数上限 } break; } } } # -------------------------------------------------------------------- # 奖励领奖周期内的领奖次数上限判断,NOTO:没有考虑循环奖励的领取上限不仅由reward_gain_stint决定,还由循环达成数loop_num决定 # -------------------------------------------------------------------- if (!empty($reward_info['reward_gain_stint']) && !empty($reward_info['reward_gain_cycle'])) { # 向上取整获取最大领奖期数 $max_cycle = ceil(($event_info['reward_date_tail'] - $event_info['reward_date_head']) / $reward_info['reward_gain_cycle']); for($i = 1; $i <= $max_cycle; $i++) { $cycle_head = $event_info['reward_date_head'] + $reward_info['reward_gain_cycle'] * ($i - 1); # 领奖周期首部时间 $cycle_tail = $event_info['reward_date_head'] + $reward_info['reward_gain_cycle'] * $i - 1; # 领奖周期尾部时间,减一是为了相邻两个区间没有交集 if ($this->current_time < $cycle_head || $this->current_time > $cycle_tail) { # 当前时间不在该领奖周期内 continue; } else { # 获取该周期内的领奖次数 list($reward_record, $reward_record_count) = $this->get_data('Event')->exactly_get_event_reward_record_part($player_id, $event_id, $reward_id, $cycle_head, $cycle_tail); if ($reward_record_count >= $reward_info['reward_gain_stint']) { $this->throw_error('12009'); # 已达到奖励领奖周期内的领取次数上限 } break; } } } **/ # 进度计算 $sys_params = array('event_id' => $event_info['event_id'], 'announce_date_head' => $event_info['announce_date_head'], 'announce_date_tail' => $event_info['announce_date_tail'], 'open_date_head' => $event_info['open_date_head'], 'open_date_tail' => $event_info['open_date_tail'], 'reward_id' => $reward_info['reward_id'], 'reward_type' => $reward_info['reward_type'], 'reward_billing_cycle' => $reward_info['reward_billing_cycle']); $ret = $this->call_cond_func($player_id, $reward_info['cond_func'], $reward_info['cond_func_relation'], $sys_params); # 剩余领奖次数计算 list($real_remain_gain_num, $reward_remain_gain_num, $config_gain_stint) = $this->_cal_reward_remain_gain_num($player_id, $event_info, $reward_info, $ret); if (empty($real_remain_gain_num)) { $this->throw_error('12009'); # 已达到奖励领奖周期内的领取次数上限 } # -------------------------------------------------------------------- # 奖励达成条件判断 # -------------------------------------------------------------------- # 进度计算 $sys_params = array('event_id' => $event_info['event_id'], 'announce_date_head' => $event_info['announce_date_head'], 'announce_date_tail' => $event_info['announce_date_tail'], 'open_date_head' => $event_info['open_date_head'], 'open_date_tail' => $event_info['open_date_tail'], 'reward_id' => $reward_info['reward_id'], 'reward_type' => $reward_info['reward_type'], 'reward_billing_cycle' => $reward_info['reward_billing_cycle']); $ret = $this->call_cond_func($player_id, $reward_info['cond_func'], $reward_info['cond_func_relation'], $sys_params); if (empty($ret['status'])) { $this->throw_error('12010'); # 未达到奖励的领取条件 } # -------------------------------------------------------------------- # 发奖 + 消耗道具 + 并刷新奖励信息 # -------------------------------------------------------------------- $this->start_trans(); # 消耗道具 if (!empty($reward_info['consume_info'])) { $consume_currency = false; $arr_logs_consume = array(); $reward_item_info_arr = explode("|", $reward_info['consume_info']); $log_param = array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'privilege_level' => $player_info['privilege_level'], 'cmd_id' => 2304); foreach ($reward_item_info_arr as $item_info) { list($item_id, $item_num) = explode(":", $item_info); $item_key = Cache_PropLoot::getInstance()->get_item_key($item_id); if ($item_key == 'prop') { # 消耗道具 # deduct_prop_by_prop_id方法中有判断道具是否足够,故外层不判断 $re = $this->get_game('Prop')->deduct_prop_by_prop_id($player_id, $item_id, $item_num, $arr_logs_consume, 0, $log_param); $this->write_check($re, 3010311); } else { # 消耗资源 $arr_consume = Com_Util::get_consume_info_for_data_center($player_info, $item_key, $item_num); $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $item_key, $item_num, 1, $item_id); $consume_currency = true; } } if ($consume_currency) { $re = $this->get_data('Player')->update_player_resource($player_id, $player_info, '2304', array(), $arr_consume); $this->write_check($re, 3010332); } } # 奖励道具 $reward = array(); $reward_detail = array(); if (!empty($reward_info['reward_info'])) { $reward_item_info_arr = explode("|", $reward_info['reward_info']); foreach ($reward_item_info_arr as $item_info) { list($item_id, $item_num, $item_tag) = explode(":", $item_info); $reward_detail[$item_id] = $item_num; } } $this->get_game('Reward')->gen_reward_array($reward_detail, $reward); $re = $this->get_game('Reward')->send_reward($player_id, $reward, array('cmd_id' => '2304', 'bind_flag' => 0)); $this->write_check_strict($re, 3010347); # 记录奖励领取日志 $re = $this->get_data('Event')->record_player_event_reward($player_id, $event_id, $reward_id, $this->current_time); $this->write_check($re, 3010351); $this->commit(); # 蛋疼的次数同步埋点 if ($event_template == 2) { # 充值回馈需要同步次数变更 $this->get_game('PlayerFunc')->sync_func_tips($player_id, 1260); } # 粘806 + 通知道具变更信息 $ndata = array(); if (!empty($arr_logs_consume)) { foreach ($arr_logs_consume as $k => $v) { # 消耗的道具 $ndata[] = $v; } Protocol_Prop::prop_806($player_id, $ndata); } # 该方法会自动推送843协议告知前端显示奖励信息,会调用prop_806协议通知道具变更,调用p2c_part_update通知人物信息变更 $ret = $this->get_game('Reward')->add_reward_log(true); #----------------------------------------------------------------- # 重新获取奖励项列表 #----------------------------------------------------------------- $event_reward_list = array(); $special_reward_list = array(); if (!empty($event_info['event_reward_info'])) { $reward_id_array = explode(':', $event_info['event_reward_info']); #echo "</br>===============".$event_info['event_id']."==================</br>"; #var_export($reward_id_array); $reward_info = $this->get_data('Event')->multi_get_reward_info($reward_id_array); #var_export($reward_info); # 对奖励列表升序排序 Com_Array::multisort($reward_info, array('reward_priority' => 'asc')); foreach ($reward_info as $reward) { #echo "</br>===============reward_id:".$reward['reward_id']."==================</br>"; # 获取奖励的具体道具列表 $reward_item_list = array(); if (!empty($reward['reward_info'])) { $reward_item_info_arr = explode("|", $reward['reward_info']); foreach ($reward_item_info_arr as $item_info) { list($item_id, $item_num, $item_tag) = explode(":", $item_info); $item_config = Cache_Prop::getInstance()->get_prop_info($item_id); $item_config['item_num'] = $item_num; $item_struct = Struct_Prop::get_prop_struct($item_config); $reward_item_list[$item_id] = $item_struct; if ($item_tag == $this->reward_item_tag_for_special) { $special_reward_list[$item_id] = $item_struct; } } } # 进度计算 $sys_params = array('event_id' => $event_info['event_id'], 'announce_date_head' => $event_info['announce_date_head'], 'announce_date_tail' => $event_info['announce_date_tail'], 'open_date_head' => $event_info['open_date_head'], 'open_date_tail' => $event_info['open_date_tail'], 'reward_id' => $reward['reward_id'], 'reward_type' => $reward['reward_type'], 'reward_billing_cycle' => $reward['reward_billing_cycle']); $ret = $this->call_cond_func($player_id, $reward['cond_func'], $reward['cond_func_relation'], $sys_params); # 剩余领奖次数计算 list($real_remain_gain_num, $reward_remain_gain_num, $config_gain_stint) = $this->_cal_reward_remain_gain_num($player_id, $event_info, $reward, $ret); # 领奖状态判定 if ($event_info['reward_date_head'] > $this->current_time || $event_info['reward_date_tail'] < $this->current_time) { $reward_status = 0; # 未到或已超过活动奖励领取时间 } elseif ((!empty($reward['valid_date_head']) || !empty($reward['valid_date_tail'])) && ($reward['valid_date_head'] > $this->current_time || $reward['valid_date_tail'] < $this->current_time)) { $reward_status = 0; # 未到或已超过活动奖励有效时间 } elseif (empty($real_remain_gain_num)) { # 用实际剩余领奖次数判断领奖状态 $reward_status = 0; } else { $reward_status = $ret['status']; } # 可领奖总数计算 if ($reward_status) { $can_receive_reward_num += 1; } $event_reward_list[] = array('reward_id' => $reward['reward_id'], 'reward_cond' => $reward['cond_desc'], 'reward_item_list' => $reward_item_list, 'reward_progress_head' => $ret['progress_head'], 'reward_progress_tail' => $ret['progress_tail'], 'reward_remain_gain_num' => $reward_remain_gain_num, 'reward_status' => $reward_status, 'reward_type' => $reward['reward_type'], 'consume_info' => $reward['consume_info'], 'reward_gain_stint' => $config_gain_stint); } } $out_2304 = array('event_tag' => $event_info['event_tag'], 'event_id' => $event_id, 'event_reward_list' => $event_reward_list, 'event_template' => $event_template); # 记录行为 Com_Log::write('xgame.event', "{$player_id}\t" . "get_event_reward\t" . "{$event_id}\t" . "{$reward_id}\t"); return $out_2304; }
public function reset_reward($reward, $prop, $player_id) { if (!empty($reward)) { Com_Array::multisort($reward, array('item_id' => 'asc')); if (!empty($prop)) { foreach ($reward as &$v) { if (isset($v['prop_config'])) { unset($v['prop_config']); } if ($v['item_id'] > 100) { foreach ($prop as $pv) { if ($pv['prop_id'] == $v['item_id']) { if (isset($pv['overlay_num'])) { $pv['item_num'] = $pv['overlay_num']; } $v['attrs'] = Struct_Prop::get_prop_struct($pv); $arr_replace = array(); $arr_replace[] = array('rep_type' => 0, 'rep_val' => $player_id); $arr_replace[] = array('rep_type' => 1, 'rep_val' => 1030); $arr_replace[] = array('rep_type' => 2, 'rep_val' => $v['item_id']); $need_b = Cache_Prop::getInstance()->get_prop_info($v['item_id']); $this->get_game('SystemNotice')->push_sys_notice($player_id, 1030, 0, $arr_replace, 0, $need_b['need_broad_cast']); } } } else { $v['attrs'] = array(); } } } else { foreach ($reward as &$v) { $v['attrs'] = array(); } } } return $reward; }
/** * @Purpose: * 获取精灵升级信息 * @Method Name: get_fairy_upgrade_info() * @Parameter: $player_id 玩家ID * @Parameter: $fairy_id 精灵ID * @Return: mixed 精灵升级信息 */ public function get_fairy_upgrade_info($player_id, $fairy_id) { $player_id = intval($player_id); //获取玩家精灵数据 $obj_player_fairy_data = $this->get_data('Fairy'); $data = $obj_player_fairy_data->get_player_fairy_info($fairy_id); if (!$data) { $this->throw_error('10112'); } //获取指定类型精灵配置表数据 $fairy_list_table = $this->get_fairy_table_data_by_type($data['type']); if (!$fairy_list_table[0]['change_name_expend']) { $this->throw_error('10109'); //配置表读取错误 } $data['grow'] = $obj_player_fairy_data->get_fairy_grow($fairy_id, 'grow'); //是否满级 $is_level = $this->is_next_level($data, false); if ($is_level === true) { $rtn_data['next_level'] = $data['level']; $rtn_data['next_star'] = 0; $rtn_data['fairy_code'] = $data['fairy_code']; return Struct_Fairy::get_fairy_upgrade_panel_struct($rtn_data); } else { if ($is_level !== false) { return $is_level; } } //获取下级精灵数据 $get_fairy_res = $this->get_next_fairy_data($data, $fairy_data, false); if ($get_fairy_res !== true) { $this->throw_error($get_fairy_res); } //获取消耗道具数据 $get_item_res = $this->get_item_data($data['fairy_code'], $data['star'], $item_data); if ($get_item_res !== true) { $this->throw_error($get_item_res); } //获取玩家背包道具信息 $obj_prop_game = $this->get_game('Prop'); $item_list = $obj_prop_game->get_prop_list_by_prop_id($player_id, $item_data['item']); //格式化数据结构 $rtn_data['item_box'] = Struct_Prop::get_item_box_struct($item_list[0]); //获取精灵属性数据 $rtn_data['next_level'] = $fairy_data['lvl']; $rtn_data['grow_value'] = $data['grow']; $rtn_data['shield_limit'] = $fairy_data['shield_lvl']; $rtn_data['Attr_id'] = $fairy_data['attribute']; $rtn_data['open_hole'] = $fairy_data['skill_hole']; $rtn_data['next_star'] = $fairy_data['star']; $rtn_data['fairy_code'] = $data['fairy_code']; $rtn_data['auto_buy'] = $data['auto_buy']; //获取下一级精灵配置表ID $fairy_other_table = $this->get_fairy_table_data_Multiple($data['type'], $data['level'] + 1); $rtn_data['next_fairy_code'] = $fairy_other_table['sid']; //获取成长值过期时间 $rtn_data['expire_time'] = $obj_player_fairy_data->get_fairy_grow_expire($fairy_id); $rtn_data['expire_time'] = $rtn_data['expire_time'] > 0 && $rtn_data['expire_time'] <= 86400 ? $rtn_data['expire_time'] : 0; $fairy_level_table = $this->get_fairy_lvl_tabel_data($data['fairy_code'], $data['star']); if (!$fairy_level_table) { $this->throw_error('10109'); //配置表读取错误 } /* #获取玩家声望等级 $player_fame_level = $this->get_data('Player')->get_player_info($player_id, 'fame_level'); $fame_table = Cache_PlayerFame::getInstance()->get_player_fame_info($player_fame_level); $rtn_data['cur_fame_level'] = $fame_table['title']; */ if ($fairy_level_table['fame'] > 0) { $fame_table = Cache_PlayerFame::getInstance()->get_player_fame_info($fairy_level_table['fame']); if (!$fame_table) { $this->throw_error('10109'); //配置表读取错误 } $rtn_data['need_fame_level'] = $fame_table['title']; } return Struct_Fairy::get_fairy_upgrade_panel_struct($rtn_data); }
public function equip_unload_inlaygems($player_id, $player_prop_id, $hole_id) { $this->get_game('PlayerFunc')->get_func_is_open($player_id, $this->func_id); $this->param_check_numeric(array($player_id, $hole_id)); # 装备检查 $player_prop_info = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $player_prop_id); if (empty($player_prop_info)) { $this->throw_error('80013'); //玩家没有该装备信息! } # 孔位检查 $hole_stint = $this->get_prop_inlay_gem_hole_stint($player_prop_info); if ($hole_id > $hole_stint || $hole_id <= 0) { $this->throw_error('80406'); //孔位错误! } if (empty($player_prop_info['inlay_gems']) || empty($player_prop_info['inlay_gems'][$hole_id])) { $this->throw_error('80405'); //玩家装备该孔位没有镶嵌宝石! } $player_info = $this->get_data('Player')->get_player_info($player_id, array('level', 'vip')); $before_inlay_gems = $player_prop_info['inlay_gems']; # 获取宝石配置信息 $gems_config = Cache_Forge::getInstance()->get_inlay_gems_by_id($player_prop_info['inlay_gems'][$hole_id], 1); $this->start_trans(); # 卸载已镶嵌宝石到背包 # 不调用add_prop_reward_log或add_reward_log,则send_reward不会调用806协议通知道具变更,并且不记录Log日志 $reward[] = array('type' => 'prop', 'item_id' => $player_prop_info['inlay_gems'][$hole_id], 'item_num' => 1); $re = $this->get_game('Reward')->send_reward($player_id, $reward, array('cmd_id' => 820)); #send_reward失败时,会返回各种失败情况的错误码 $this->write_check_strict($re, 3010251); $arrLogs = $this->get_game('Reward')->get_prop_log(); # 更新装备的宝石镶嵌信息 unset($player_prop_info['inlay_gems'][$hole_id]); $player_prop_info['inlay_gems_lv'] -= $arrLogs[0]['level']; # 以item表的level为准 $player_prop_info['star_map_desc'] = $this->get_game('EquipStarMap')->get_latest_starmap_desc($player_prop_info); $equip_update_field = array('inlay_gems' => $player_prop_info['inlay_gems'], 'inlay_gems_lv' => $player_prop_info['inlay_gems_lv'], 'star_map_desc' => $player_prop_info['star_map_desc']); $re = $this->get_data('PlayerProp')->update_player_prop($player_prop_info, $equip_update_field); $this->write_check($re, 3010264); $this->commit(); # 刷新玩家属性 if ($player_prop_info['item_position'] == 3) { $this->get_game('EquipAttr')->equip_attr($player_id); } # 通知道具变更 粘包806 $this->get_game('Reward')->add_reward_log(); # 调用add_reward_log,触发806协议通知道具变更,并记录道具获取日志 #$ndata[] = $arrLogs[0]; # 宝石变更后的信息 $ndata[] = $player_prop_info; # 装备变更后的信息 Protocol_Prop::prop_806($player_id, $ndata); # 重新获取宝石列表 粘包817 $gems = $this->get_game('Prop')->get_prop_list_by_type($player_id, $this->compose_gem_type, $this->compose_gem_sub_type); $gems = $this->filter_unvalid_gems($player_prop_info, $gems); # 过滤不允许镶嵌该装备的宝石 $emp = Struct_Prop::get_item_boxes_info($gems); $data = array('pid' => $player_prop_id, 'gem_list' => isset($emp[1]) ? $emp[1] : array('pos' => 1, 'indexes' => array())); Protocol::input($player_id, 3, 8, 817, $data); # -------------------------------------------------------------------- # 游戏日志记录 # -------------------------------------------------------------------- $log_info = array('player_id' => $player_id, 'player_level' => $player_info['level'], 'vip_level' => $player_info['vip'], 'vip_special_level' => $player_info['privilege_level'], 'add_time' => $this->current_time, 'action_type' => 0, 'player_prop_id_master' => $player_prop_info['player_prop_id'], 'item_id_master' => $player_prop_info['prop_id'], 'item_type' => $player_prop_info['type'], 'item_sub_type' => $player_prop_info['sub_type'], 'item_quality' => $player_prop_info['quality'], 'item_level' => $player_prop_info['level'], 'item_star_level' => $player_prop_info['star_level'], 'player_prop_id_slave' => $arrLogs[0]['player_prop_id'], 'item_id_slave' => $arrLogs[0]['prop_id'], 'hole_index' => $hole_id, 'before_inlay_gems_lv' => $player_prop_info['inlay_gems_lv'] + $arrLogs[0]['level'], 'after_inlay_gems_lv' => $player_prop_info['inlay_gems_lv'], 'before_inlay_gems' => $before_inlay_gems, 'after_inlay_gems' => $player_prop_info['inlay_gems']); Log_Forge::getInstance()->add_log($log_info, 'inlay'); return array('hole_id' => $hole_id, 'gem_box_info' => array('pos' => $arrLogs[0]['item_position'], 'index' => $arrLogs[0]['grid'])); }
public function get_equip_intensify_info($player_id, $player_prop_id) { $this->get_game('PlayerFunc')->get_func_is_open($player_id, $this->func_id_intensifier); # 参数检查 $this->param_check_numeric(array($player_id)); $player_equip_info = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $player_prop_id); if (!$player_equip_info) { $this->throw_error('80013'); //玩家没有该装备! } # 获取强化等级上限 $intensify_lv_limit = $this->get_intensify_lv_limit_by_item_level($player_equip_info['level']); $silver_index = Cache_Currency::getInstance()->get_index('silver'); # 判断是否满级 if ($player_equip_info['intensive_level'] >= $intensify_lv_limit) { # 取强化配置信息 $intensify_config = Cache_Forge::getInstance()->get_intensify_info($player_equip_info['intensive_level'], 1); $data[] = array('result' => 1, 'item_pid' => $player_prop_id, 'upgrade_item' => array(), 'success_per' => 0, 'success_num' => 0, 'fail_num' => 0, 'expend_prop' => "{$intensify_config['item_id']}:0", 'expend_currency' => "{$silver_index}:0", 'max_intensify_lv' => $intensify_lv_limit); } else { # 更新装备的强化等级 $player_equip_info['intensive_level'] += 1; # 取强化配置信息 $intensify_config = Cache_Forge::getInstance()->get_intensify_info($player_equip_info['intensive_level'], 1); # 获取最新的星图加成信息与强化属性加成信息 if ($player_equip_info['star_map_id']) { $player_equip_info['star_map_desc'] = $this->get_game('EquipStarMap')->get_latest_starmap_desc($player_equip_info); } $player_equip_info['intensive_desc'] = Game_EquipIntensifier::get_latest_intensive_desc($player_equip_info, $intensify_config); $sure_succeed = $intensify_config['lose_num'] - $player_equip_info['intensive_lose_times']; # 剩余必定成功次数 if ($sure_succeed < 0) { $sure_succeed = 0; } $succeed_probability = $sure_succeed == 0 ? 100 : intval($intensify_config['chance_display'] / 100); # 剩余必定成功次数为0时成功率置为100 if ($sure_succeed > $this->sure_succeed_show_norm) { $sure_succeed = 0; } # 超过标准则不显示强化剩余必定成功次数 $data[] = array('result' => 0, 'item_pid' => $player_prop_id, 'upgrade_item' => Struct_Prop::get_prop_struct($player_equip_info), 'success_per' => $succeed_probability, 'success_num' => $sure_succeed, 'fail_num' => intval($player_equip_info['intensive_lose_times']), 'expend_prop' => "{$intensify_config['item_id']}:{$intensify_config['item_num']}", 'expend_currency' => "{$silver_index}:{$intensify_config['silver_num']}", 'max_intensify_lv' => $intensify_lv_limit); } #var_export($data); return $data; }
public function game_over($world_boss_id, $roles, $roles_dmg, $roles_online, $killer_role_id, $killer_role_name) { $world_boss_id = intval($world_boss_id); $killer_role_id = intval($killer_role_id); $baseinfo = $this->get_base_info_id($world_boss_id); if (empty($baseinfo)) { $this->throw_error('10222', 2010100); } #配置表错误 $res = array(); $reward_result = array(); if ($killer_role_id > 0) { $reward_result['sid'] = 1; } else { $reward_result['sid'] = 0; } if ($world_boss_id) { $killer_player_info = null; $rank_list = Cache_WorldBoss::getInstance()->get_rank_reward(); $rank_num = count($rank_list); #邮件内容 $phrase_config = Cache_FuncPhraseConfig::getInstance()->get_phrase_config_info(4000); $time = time(); if (!empty($roles) && !empty($roles_dmg)) { $num = count($roles); $use_set = Cache_ActivityHall::getInstance()->get_Activity_set(4011); #功能按钮开启 $setting = Cache_WorldBoss::getInstance()->get_worldboss_set(); $dps_list = Cache_UnionBoss::getInstance()->get_dps_reward(); if ($killer_role_id) { #结束活动 $this->get_data('WorldBoss')->set_game_over(); } for ($i = 0; $i < $num; $i++) { if ($roles[$i] == 0) { continue; } if ($killer_role_id) { #重置挖尸体相关数据 $reset_list = array('list' => '', 'sid' => $world_boss_id, 'start_time' => $time, 'list_log' => json_encode(array())); $this->get_data('WorldBoss')->set_boss_reward_list($roles[$i], $reset_list); } $player_info = $this->get_data('Player')->get_player_info($roles[$i], array('player_id', 'privilege_level', 'level', 'vip', 'name', 'gm', 'is_dummy')); #非本服玩家忽略 if ($player_info['player_id'] <= 0) { continue; } #更新玩家伤害值,形成排行榜 if (!empty($player_info) && ($player_info['gm'] == 0 || $player_info['gm'] == 3) && $player_info['is_dummy'] == 0) { $this->get_data('WorldBoss')->set_harm_list($roles[$i], $roles_dmg[$i]); } #vip特权加成奖励 $vip_exp = 0; if ($player_info['privilege_level'] > 0) { $left_cd = $this->get_game('VipSpecial')->get_left_time($roles[$i]); if ($left_cd > 0) { $vip_set = Cache_VipLevelLimit::getInstance()->get_limit_info($player_info['privilege_level'], 10034); if (!empty($vip_set)) { $vip_exp = $vip_set['max_times']; } } } #获取排名奖励 $all_reward = $this->get_rank_reward($rank_list, $rank_num, $i, $roles[$i], $player_info, $vip_exp, $baseinfo); if ($roles[$i] == $killer_role_id) { #最后一击奖励走掉落库 $killer_player_info = $player_info; $bossreward = explode('|', $baseinfo['boss_reward']); if (!empty($bossreward)) { foreach ($bossreward as $lid) { $temp = Cache_FbLoot::getInstance()->get_loot($lid, $killer_role_id); if (!empty($temp)) { foreach ($temp as $v) { if ($v['item_id'] == 3) { $v['item_num'] = ($vip_exp / 10000 + 1) * $v['item_num']; } $all_reward[] = $v; } } } } } #伤害奖励 $dps_rewards = $this->get_dps_reward($baseinfo['dps_reward'], $baseinfo['crystal_reward'], $roles_dmg[$i], $vip_exp, $dps_list); $all_reward[] = $dps_rewards['exp']; $reward_result['rank_num'] = $i + 1; #排名 $reward_result['reward_list'] = array(); if ($roles_online[$i] == 1) { #在线直接发奖励 $result = $this->get_game('Reward')->send_reward($roles[$i], $all_reward, array('cmd_id' => '462', 'bind_flag' => 0), 1); if ($result === true) { $sum_exp = 0; $this->get_game('Reward')->add_reward_log(); //记录日志 $out_reward_log = $this->get_game('Reward')->get_out_reward(); if ($out_reward_log) { #获取修正倍率后的奖励 foreach ($out_reward_log as $item_id => $item_num) { if ($item_id == 1) { $sum_exp += $item_num; } } if ($sum_exp > 0) { $prop_attr = Cache_Prop::getInstance()->get_prop_info(1); $prop_attr['item_num'] = $sum_exp; $attr = Struct_Prop::get_prop_struct($prop_attr); if (!empty($attr)) { $reward_result['reward_list'][] = $attr; } } } $prop_logs = $this->get_game('Reward')->get_prop_log(); if ($prop_logs) { foreach ($prop_logs as $val) { if (isset($val['overlay_num'])) { $val['item_num'] = $val['overlay_num']; } $reward_result['reward_list'][] = Struct_Prop::get_prop_struct($val); } } } Protocol::input($roles[$i], 8, 11, 1118, $reward_result); } else { #不在线发邮件 if (!empty($phrase_config)) { $content = sprintf($phrase_config['content'], $res['rank_num']); $attachment = array(); if (!empty($all_reward)) { foreach ($all_reward as $val_reward) { $attachment[] = array("prop_id" => $val_reward['item_id'], "prop_num" => $val_reward['item_num']); } } $re = $this->get_game('Mail')->async_trigger_mail($roles[$i], $phrase_config['title'], $content, $attachment, $phrase_config['sender'], 1, 462, 0); $this->write_check($re); } } #-------------------------扣次数-----同步次数给c++--------------------------- $this->get_data("PlayerDailyTime")->add_used_time($roles[$i], "world_boss_count"); $used = 0 + $this->get_data("PlayerDailyTime")->get_player_used_time($roles[$i], "world_boss_count"); if (empty($use_set)) { $left_num = 0; } else { $left_num = $use_set[0]['max_times'] - $used; } if ($left_num < 0) { $left_num = 0; } Protocol_Player::p2c_part_update($roles[$i], array('worldboss_remaining_count' => $left_num)); #添加日常任务进度跟踪 $this->get_game('TaskTrigger')->async_trigger_task($roles[$i], 104, $world_boss_id, 1); //找回资源埋点 $this->get_game('GetBackCurrency')->add_function_day_times($roles[$i], 7); $rank = $i + 1; $this->get_data('GetBackCurrency')->set_player_times($roles[$i], 'world_boss_battle_rank', $rank); #活动日志 $_event_log = array('log_type' => 'world_boss', 'player_id' => $roles[$i], 'reg_time' => time(), 'map_id' => $world_boss_id, 'damage' => $roles_dmg[$i], 'rank' => $i + 1); $this->get_game('Event')->async_deal_event_log($_event_log); #添加活跃度 $this->get_game('DailyBoon')->async_trigger_daily_boon_task($roles[$i], 3005); if ($killer_role_id) { #通知功能按钮开启 $func[0][] = array('operate' => 1, 'func_id' => 1110, 'open' => 1, 'guide' => 0, 'cd' => $setting[0]['corpse_save_time']); Protocol::input($roles[$i], 8, 7, 741, $func); } //添加日志 $log_data = array('player_id' => $roles[$i], 'channel' => 62, 'player_level' => $player_info['level'], 'vip_level' => $player_info['vip'], 'add_time' => time(), 'sid' => $world_boss_id, 'role_dmg' => $roles_dmg[$i], 'type' => 1); Log_WorldBoss::getInstance()->add_log($log_data); } } //保存世界boss纪录 $save_data['sid'] = $world_boss_id; $save_data['roles'] = json_encode($roles); $save_data['roles_dmp'] = json_encode($roles_dmg); $save_data['roles_online'] = json_encode($roles_online); $save_data['killer_role_id'] = $killer_role_id; if ($killer_role_id) { #if(is_null($killer_player_info)){ # $killer_player_info = $this->get_data('Player')->get_player_info($killer_role_id,array('name')); #} $save_data['killer_role_name'] = $killer_role_name; #$killer_player_info['name']; #发广播通知 $arr_replace = array(); $arr_replace[] = array('rep_type' => 0, 'rep_val' => $killer_role_id, 'txt' => $killer_role_name); $msg = Language_Message::make_message(11018, $arr_replace); $this->get_game('SystemNotice')->send_system_msg($killer_role_id, $msg, 1, 6); #判断是否开启抢宝箱 $open_set = Cache_WorldBoss::getInstance()->get_open_boss_set($world_boss_id); if (!empty($open_set) && $open_set['treasure_loot_entrance_sid'] > 0) { $arr_replace = array(); $arr_replace[] = array('rep_type' => 0, 'rep_val' => $killer_role_id, 'txt' => $killer_role_name); $msg = Language_Message::make_message(11019, $arr_replace); $this->get_game('SystemNotice')->send_system_msg($killer_role_id, $msg, 1, 6); } } else { $save_data['killer_role_name'] = ''; } $this->get_data('WorldBoss')->save_rank_log($save_data, $world_boss_id); } else { #参数错误 $this->throw_error('10107', 2010101); } }
/** * 格式化奖励 * @param string $reward * @param int $career_type career_type * @return array */ protected function format_reward($reward, $career_type = 0) { if (empty($reward)) { return array(); } $arr = explode("|", $reward); $props = array(); if ($arr) { foreach ($arr as $val) { $prop = explode(":", $val); if ($career_type && isset($prop[2]) && $prop[2] && $career_type != $prop[2]) { continue; } $prop_info = Cache_Prop::getInstance()->get_prop_info($prop[0]); $prop_info['item_num'] = $prop[1]; $props[] = Struct_Prop::get_prop_struct($prop_info); //$props[] = $prop[0]; } } return $props; }
public function equip_starmap_do($player_id, $player_prop_id, $star_spid) { $this->get_game('PlayerFunc')->get_func_is_open($player_id, $this->func_id); $this->param_check_numeric(array($player_id)); # 没有玩家信息 $player_info = $this->get_data('Player')->get_player_info($player_id); if (empty($player_info)) { $this->throw_error('10104'); } # 玩家没有该装备 $player_prop_info = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $player_prop_id); if (empty($player_prop_info)) { $this->throw_error('80013'); } if (Com_Util::is_first_charge_item($player_prop_info['prop_id'])) { $this->throw_error('81103'); # 首充装备不允许觉醒 } # 824展示协议返回数据 $out_824 = array('player_prop_id' => $player_prop_id, 'star_pid' => $star_spid, 'box_up' => array(), 'box_down' => array()); $before_starmap_desc = $player_prop_info['star_map_desc']; # 判断行为类型:flag=0星图卸载;flag=1星图安装;flag=2星图替换 if (empty($star_spid)) { if (empty($player_prop_info['star_map_id'])) { $this->throw_error('80031'); //该装备未曾安装星图! } $flag = 0; } else { $flag = empty($player_prop_info['star_map_id']) ? 1 : 2; } # 检查旧星图配置信息【卸载||替换】 if ($flag == 0 || $flag == 2) { $starmap_config_forSend = Cache_Prop::getInstance()->get_prop_info($player_prop_info['star_map_id']); if (!$starmap_config_forSend) { $this->throw_error('80033'); //没有该星图的配置信息! } } # 检查新星图配置信息【安装||替换】 if ($flag == 1 || $flag == 2) { $starmap_info_forInstall = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $star_spid); if (!$starmap_info_forInstall) { $this->throw_error('80032'); //玩家没有该星图! } $out_824['box_up'] = array('pos' => $starmap_info_forInstall['item_position'], 'index' => $starmap_info_forInstall['grid']); $starmap_config_forInstall = Cache_Prop::getInstance()->get_prop_info($starmap_info_forInstall['prop_id']); if (!$starmap_config_forInstall) { $this->throw_error('80033'); //没有该星图的配置信息! } $starmap_config = Cache_Forge::getInstance()->get_starmap_info($starmap_info_forInstall['prop_id']); # 允许的装备种类检查 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)) { $this->throw_error('80035'); //该觉醒石不允许镶嵌在该种类的装备上 } } # 要求的等级检查 if (!empty($starmap_config[0]['require_equip_level']) && $player_prop_info['level'] < $starmap_config[0]['require_equip_level']) { $this->throw_error('80040'); # 装备等级低于觉醒石要求等级,不允许镶嵌 } } $this->start_trans(); if ($flag == 0 || $flag == 2) { //发放旧星图【卸载||替换】 $reward = array(); $sendarrLogs = array(); $reward[] = array('type' => 'prop', 'item_id' => $player_prop_info['star_map_id'], 'item_num' => 1); $re = $this->get_game('Reward')->send_reward($player_id, $reward, array('cmd_id' => 824)); #send_reward失败时,会返回各种失败情况的错误码 $this->write_check_strict($re, 3010130); $sendarrLogs = $this->get_game('Reward')->get_prop_log(); $out_824['box_down'] = array('pos' => $sendarrLogs[0]['item_position'], 'index' => $sendarrLogs[0]['grid']); if ($flag == 2) { //扣除新星图【替换】 $re = $this->get_data('PlayerProp')->update_prop_num($player_id, $starmap_info_forInstall, 1, '-', array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'cmd_id' => 824)); $this->write_check($re, 3010136); } } else { //扣除新星图【安装】 $re = $this->get_data('PlayerProp')->update_prop_num($player_id, $starmap_info_forInstall, 1, '-', array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'cmd_id' => 824)); $this->write_check($re, 3010140); } # 更新装备状态 if ($flag) { # 【安装||替换】 $player_prop_info['star_map_id'] = $starmap_info_forInstall['prop_id']; $player_prop_info['star_map_desc'] = $this->get_latest_starmap_desc($player_prop_info); } else { # 【卸载】 $player_prop_info['star_map_id'] = ''; $player_prop_info['star_map_desc'] = array(); } $re = $this->get_data('PlayerProp')->update_player_prop($player_prop_info, array('star_map_id' => $player_prop_info['star_map_id'], 'star_map_desc' => $player_prop_info['star_map_desc'])); $this->write_check($re, 3010152); $this->commit(); # -------------------------------------------------------------------- # 游戏日志记录 # -------------------------------------------------------------------- $log_info = array('player_id' => $player_id, 'player_level' => $player_info['level'], 'vip_level' => $player_info['vip'], 'vip_special_level' => $player_info['privilege_level'], 'add_time' => $this->current_time, 'player_prop_id_master' => $player_prop_info['player_prop_id'], 'item_id_master' => $player_prop_info['prop_id'], 'item_type' => $player_prop_info['type'], 'item_sub_type' => $player_prop_info['sub_type'], 'item_quality' => $player_prop_info['quality'], 'item_level' => $player_prop_info['level'], 'item_star_level' => $player_prop_info['star_level'], 'player_prop_id_install' => $starmap_info_forInstall ? $starmap_info_forInstall['player_prop_id'] : 0, 'item_id_install' => $starmap_info_forInstall ? $starmap_info_forInstall['prop_id'] : 0, 'player_prop_id_uninstall' => $sendarrLogs ? $sendarrLogs[0]['player_prop_id'] : 0, 'item_id_uninstall' => $sendarrLogs ? $sendarrLogs[0]['prop_id'] : 0, 'before_starmap_desc' => $before_starmap_desc, 'after_starmap_desc' => $player_prop_info['star_map_desc']); Log_Forge::getInstance()->add_log($log_info, 'starmap'); if ($flag == 1 || $flag == 2) { # 安装和替换才算 # 引导任务埋点 $this->get_game('TaskTrigger')->async_trigger_guide_task($player_id, 25, 1); } $this->handle_starmap_refer_achieve($player_id); # 刷新玩家属性 if ($player_prop_info['item_position'] == 3) { $this->get_game('EquipAttr')->equip_attr($player_id); } # 通知道具变更 粘包806 $this->get_game('Reward')->add_reward_log(); # 调用add_reward_log,触发806协议通知道具变更,并记录道具获取日志 $ndata = array(); $ndata[] = $player_prop_info; /** //发放的星图 if($flag == 0 || $flag == 2) { foreach($sendarrLogs as $key => $val) { $ndata[] = $val; } } **/ //扣除的星图 if ($flag == 1 || $flag == 2) { $starmap_info_forInstall['item_num'] -= 1; $ndata[] = $starmap_info_forInstall; } Protocol_Prop::prop_806($player_id, $ndata); //获取 星图 $player_star_map = $this->get_game('Prop')->get_prop_list_by_type($player_id, $this->starmap_type, $this->starmap_sub_type); # 过滤不允许镶嵌该装备的星图 $player_star_map = $this->filter_unvalid_starmap($player_prop_info, $player_star_map); $data = array(); if ($player_star_map) { foreach ($player_star_map as $k => $v) { $data[] = Struct_Prop::get_item_box_struct($v); } } $emp = array(0 => $player_prop_id, 1 => $data); Protocol::input($player_id, 3, 8, 824, $out_824); Protocol::input($player_id, 3, 8, 823, $emp); }
public function get_equips_info($type, $player_id, $pp_id, $pp_inherit_id) { $this->get_game('PlayerFunc')->get_func_is_open($player_id, $this->func_id); # 参数检查 $this->param_check_numeric(array($type, $player_id), 0); # 玩家检测 $player_info = $this->get_data('Player')->get_player_info($player_id, Com_Util::get_player_fields(array('currency', 'level', 'vip', 'privilege_level'))); if (empty($player_info)) { $this->throw_error('20002'); } # 传承道具检测 $player_props_info = $this->get_data('PlayerProp')->get_player_prop_detail_multi($player_id, array($pp_id, $pp_inherit_id)); if (empty($player_props_info[$pp_id]) || empty($player_props_info[$pp_inherit_id])) { $this->throw_error('80013'); } if (Com_Util::is_first_charge_item($player_props_info[$pp_id]['prop_id']) || Com_Util::is_first_charge_item($player_props_info[$pp_inheirt_id]['prop_id'])) { $this->throw_error('81102'); # 首充装备不允许传承 } $cost_prop_flag = true; # 是否消耗道具标识,同等级传承不能消耗道具 # 传承等级判断 if ($player_props_info[$pp_id]['level'] > $player_props_info[$pp_inherit_id]['level']) { $this->throw_error('80504'); } elseif ($player_props_info[$pp_id]['level'] == $player_props_info[$pp_inherit_id]['level']) { $cost_prop_flag = false; # 传承品质判断 if ($player_props_info[$pp_id]['quality'] > $player_props_info[$pp_inherit_id]['quality']) { $this->throw_error('80502'); } elseif ($player_props_info[$pp_id]['quality'] == $player_props_info[$pp_inherit_id]['quality']) { # 传承星级判断 if ($player_props_info[$pp_id]['star_level'] >= $player_props_info[$pp_inherit_id]['star_level']) { $this->throw_error('80505'); # 继承装备星级低于传承装备,无法传承 } } } # 传承类型判断 if ($player_props_info[$pp_id]['sub_type'] != $player_props_info[$pp_inherit_id]['sub_type']) { $this->throw_error('80503'); } # -------------------------------------------------------------------- # 传承与继承装备变化字段 # -------------------------------------------------------------------- $update_fields_for_inherit = array(); # 继承装备 $update_fields = array(); # 传承装备 # -------------------------------------------------------------------- # 强化处理:强化等级取二者较高保留 # -------------------------------------------------------------------- $is_inherit_intensify = $this->inherit_handle_for_intensify($player_props_info[$pp_id], $player_props_info[$pp_inherit_id], $update_fields_for_inherit); # -------------------------------------------------------------------- # 镶嵌宝石处理,记录需要发放的宝石 NOTE:如果取消注释,则之后一定要对$update_fields中的宝石相关field项进行置空操作 # -------------------------------------------------------------------- #$send_gems = $this->inherit_handle_for_inlay_gem($player_props_info[$pp_id], $player_props_info[$pp_inherit_id], $update_fields_for_inherit); # -------------------------------------------------------------------- # 吞噬属性处理,取二者较高保留 # -------------------------------------------------------------------- $is_inherit_swallow = $this->inherit_handle_for_swallow_info($player_props_info[$pp_id], $player_props_info[$pp_inherit_id], $update_fields_for_inherit); # -------------------------------------------------------------------- # 星图处理,A覆盖B NOTE:如果取消注释,则之后一定要对$update_fields中的星图相关field项进行置空操作 # -------------------------------------------------------------------- #$send_starmap = $this->inherit_handle_for_starmap($player_props_info[$pp_id], $player_props_info[$pp_inherit_id], $update_fields_for_inherit); # -------------------------------------------------------------------- # 洗练处理:A覆盖B,并将B的配置相关信息按等级重置 # -------------------------------------------------------------------- $is_inherit_refine = $this->inherit_handle_for_refine($player_props_info[$pp_id], $player_props_info[$pp_inherit_id], $update_fields_for_inherit); # 传承装备 有传承的属性需要置空,没传承的属性需要保留 if ($is_inherit_intensify) { $prop_config = Cache_Prop::getInstance()->get_prop_info($pp_id); $update_fields['intensive_level'] = 0; $update_fields['intensive_lose_times'] = 0; $update_fields['intensive_desc'] = array(); $update_fields['equip_view'] = $prop_config['equip_view']; } if ($is_inherit_swallow) { $update_fields['swallow_info'] = array(); } if ($is_inherit_refine) { list($refine_attr, $refine_info) = $this->get_game('EquipRefine')->extend_refine($player_props_info[$pp_id]['sub_type'], $player_props_info[$pp_id]['level']); $update_fields['refine_attr'] = $refine_attr; $update_fields['refine_info'] = $refine_info; } # 更新传承与被传承的装备信息 if ($type) { if (!$is_inherit_intensify && !$is_inherit_swallow && !$is_inherit_refine) { $this->throw_error('80506'); # 传承装备的属性小于继承装备,无需进行操作 } $this->start_trans(); # -------------------------------------------------------------------- # 通用消耗处理 # -------------------------------------------------------------------- $forge_common_info = Cache_Forge::getInstance()->get_forge_common_info($player_props_info[$pp_inherit_id]['level'], 1); if (!empty($forge_common_info['inherit_cost'])) { # 消耗的货币|消耗的道具 list($cost_currency, $cost_prop) = $this->get_common_depletion_detail($forge_common_info['inherit_cost']); if (!empty($cost_currency)) { foreach ($cost_currency as $key => $value) { $arr_consume = Com_Util::get_consume_info_for_data_center($player_info, $key, $value); # 传承货币消耗策划配多种时,此处的数据不准确,目前只配1种 $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $key, $value, 1, 1); } $re = $this->get_data('Player')->update_player_resource($player_id, $player_info, '826', array(), $arr_consume); $this->write_check($re, 3010178); } if (!empty($cost_prop) && $cost_prop_flag) { # 消耗道具 $arr_logs_cost = array(); $log_param = array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'privilege_level' => $player_info['privilege_level'], 'cmd_id' => 826); foreach ($cost_prop as $prop_id => $prop_num) { $result = $this->get_game('Prop')->deduct_prop_by_prop_id($player_id, $prop_id, $prop_num, $arr_logs_cost, 0, $log_param); } } } # -------------------------------------------------------------------- # 多余宝石,多余星图发放 # -------------------------------------------------------------------- $reward = array(); if (!empty($send_gems)) { foreach ($send_gems as $k => $v) { $reward[] = array('type' => 'prop', 'item_id' => $k, 'item_num' => $v); } } if (!empty($send_starmap)) { $reward[] = array('type' => 'prop', 'item_id' => $send_starmap, 'item_num' => 1); } if (!empty($reward)) { $re = $this->get_game('Reward')->send_reward($player_id, $reward, array('cmd_id' => 826)); #send_reward失败时,会返回各种失败情况的错误码 $this->write_check_strict($re, 3010203); $arr_logs = $this->get_game('Reward')->get_prop_log(); } # -------------------------------------------------------------------- # 传承与继承装备更新 # -------------------------------------------------------------------- if (!empty($update_fields_for_inherit)) { $re = $this->get_data('PlayerProp')->update_player_prop($player_props_info[$pp_inherit_id], $update_fields_for_inherit); $this->write_check($re, 3010211); } if (!empty($update_fields)) { $re = $this->get_data('PlayerProp')->update_player_prop($player_props_info[$pp_id], $update_fields); $this->write_check($re, 3010214); } $this->commit(); # -------------------------------------------------------------------- # 游戏日志记录 # -------------------------------------------------------------------- $log_info = array('player_id' => $player_id, 'player_level' => $player_info['level'], 'vip_level' => $player_info['vip'], 'vip_special_level' => $player_info['privilege_level'], 'add_time' => $this->current_time, 'player_prop_id_master' => $player_props_info[$pp_inherit_id]['player_prop_id'], 'item_id_master' => $player_props_info[$pp_inherit_id]['prop_id'], 'item_type' => $player_props_info[$pp_inherit_id]['type'], 'item_sub_type' => $player_props_info[$pp_inherit_id]['sub_type'], 'item_quality' => $player_props_info[$pp_inherit_id]['quality'], 'item_level' => $player_props_info[$pp_inherit_id]['level'], 'item_star_level' => $player_props_info[$pp_inherit_id]['star_level'], 'player_prop_id_slave' => $player_props_info[$pp_id]['player_prop_id'], 'item_id_slave' => $player_props_info[$pp_id]['prop_id'], 'before_intensive_level' => $player_props_info[$pp_inherit_id]['intensive_level'], 'after_intensive_level' => isset($update_fields_for_inherit['intensive_level']) ? $update_fields_for_inherit['intensive_level'] : $player_props_info[$pp_inherit_id]['intensive_level'], 'before_intensive_desc' => $player_props_info[$pp_inherit_id]['intensive_desc'], 'after_intensive_desc' => isset($update_fields_for_inherit['intensive_desc']) ? $update_fields_for_inherit['intensive_desc'] : $player_props_info[$pp_inherit_id]['intensive_desc'], 'before_inlay_gems_lv' => $player_props_info[$pp_inherit_id]['inlay_gems_lv'], 'after_inlay_gems_lv' => isset($update_fields_for_inherit['inlay_gems_lv']) ? $update_fields_for_inherit['inlay_gems_lv'] : $player_props_info[$pp_inherit_id]['inlay_gems_lv'], 'before_inlay_gems' => $player_props_info[$pp_inherit_id]['inlay_gems'], 'after_inlay_gems' => isset($update_fields_for_inherit['inlay_gems']) ? $update_fields_for_inherit['inlay_gems'] : $player_props_info[$pp_inherit_id]['inlay_gems'], 'before_starmap_id' => $player_props_info[$pp_inherit_id]['star_map_id'], 'after_starmap_id' => isset($update_fields_for_inherit['star_map_id']) ? $update_fields_for_inherit['star_map_id'] : $player_props_info[$pp_inherit_id]['star_map_id'], 'before_starmap_desc' => $player_props_info[$pp_inherit_id]['star_map_desc'], 'after_starmap_desc' => isset($update_fields_for_inherit['star_map_desc']) ? $update_fields_for_inherit['star_map_desc'] : $player_props_info[$pp_inherit_id]['star_map_desc'], 'before_swallow_info' => $player_props_info[$pp_inherit_id]['swallow_info'], 'after_swallow_info' => isset($update_fields_for_inherit['swallow_info']) ? $update_fields_for_inherit['swallow_info'] : $player_props_info[$pp_inherit_id]['swallow_info']); Log_Forge::getInstance()->add_log($log_info, 'inherit'); # ------------------------------------------------------------ # 更新传承与继承装备信息 # ------------------------------------------------------------ if (!empty($update_fields_for_inherit)) { foreach ($update_fields_for_inherit as $k => $v) { $player_props_info[$pp_inherit_id][$k] = $v; } } if (!empty($update_fields)) { foreach ($update_fields as $k => $v) { $player_props_info[$pp_id][$k] = $v; } } # ------------------------------------------------------------ # 若传承或被传承装备有其一在玩家身上,则刷新玩家属性 # ------------------------------------------------------------ if ($player_props_info[$pp_inherit_id]['item_position'] == 3 || $player_props_info[$pp_id]['item_position'] == 3) { $this->get_game('EquipAttr')->equip_attr($player_id); } # ------------------------------------------------------------ # 粘806 + 通知道具变更信息 # ------------------------------------------------------------ $this->get_game('Reward')->add_reward_log(); # 调用add_reward_log,触发806协议通知道具变更,并记录道具获取日志 $ndata = array(); $ndata[] = $player_props_info[$pp_inherit_id]; $ndata[] = $player_props_info[$pp_id]; if (!empty($arr_logs_cost)) { foreach ($arr_logs_cost as $k => $v) { # 消耗的道具 $ndata[] = $v; } } Protocol_Prop::prop_806($player_id, $ndata); $out_825 = array(0 => $pp_id, 1 => $pp_inherit_id, 2 => Struct_Prop::get_prop_struct($player_props_info[$pp_inherit_id])); $out_825[3] = $this->get_inherit_consume_info($player_props_info[$pp_inherit_id]['level'], $cost_prop_flag); Protocol::input($player_id, 3, 8, 825, $out_825); /*old $out_826 = array( 'pp_id' => $pp_id, 'pp_inherit_id' => $pp_inherit_id, 'pp_box_info' => array('item_position' => 1, 'grid' => $player_props_info[$pp_id]['grid']), 'pp_inherit_box_info' => array('item_position' => 1, 'grid' => $player_props_info[$pp_inherit_id]['grid']), ); */ $out_826 = array('pp_prop_info' => Struct_Prop::get_prop_struct($player_props_info[$pp_id]), 'pp_inherit_prop_info' => Struct_Prop::get_prop_struct($player_props_info[$pp_inherit_id])); return $out_826; } else { if (!empty($update_fields_for_inherit)) { foreach ($update_fields_for_inherit as $k => $v) { $player_props_info[$pp_inherit_id][$k] = $v; } } if (!empty($update_fields)) { foreach ($update_fields as $k => $v) { $player_props_info[$pp_id][$k] = $v; } } $out_825 = array(0 => $pp_id, 1 => $pp_inherit_id, 2 => Struct_Prop::get_prop_struct($player_props_info[$pp_inherit_id])); $out_825[3] = $this->get_inherit_consume_info($player_props_info[$pp_inherit_id]['level'], $cost_prop_flag); return $out_825; } }
/** * 格式化奖励 * @param $reward * @return array */ protected function format_reward($reward) { if (empty($reward)) { return array(); } $arr = explode("|", $reward); $props = array(); if ($arr) { foreach ($arr as $val) { $prop = explode(":", $val); $prop_info = Cache_Prop::getInstance()->get_prop_info($prop[0]); $prop_info['item_num'] = $prop[1]; $props[] = Struct_Prop::get_prop_struct($prop_info); } } return $props; }
public function wing_equip_swallow($type, $player_id, $player_prop_id, $swallow_equips, $onekey = 0) { $this->get_game('PlayerFunc')->get_func_is_open($player_id, $this->func_id); $this->param_check_numeric(array($type, $player_id), 0); if (empty($swallow_equips)) { $this->throw_error('10107'); } # 参数错误 $player_info = $this->get_data('Player')->get_player_info($player_id, array('level', 'vip', 'career_type')); $player_detail = $this->get_data('PlayerDetail')->get_player_detail($player_id, Protocol_Player::get_player_attr_detail_key()); # 1515展示协议返回数据,1515协议需要写死传回已配置的所有吞噬属性,即便当前道具尚未有激活任意项吞噬属性,也需要用初始值填充 $out_1515 = array('player_ppid' => $player_prop_id, 'swallow_ppids' => $swallow_equips, 'item_struct' => array()); $swallow_equips = explode(':', $swallow_equips); $swallow_equips = array_filter($swallow_equips); $player_prop_info = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $player_prop_id); $before_player_prop_info = $player_prop_info; if (empty($player_prop_info)) { $this->throw_error('80013'); //玩家没有该装备! } if (Com_Util::is_first_charge_item($player_prop_info['prop_id'])) { if (!empty($type)) { # 实际吞噬 $this->throw_error('81106'); # 首充装备不允许吞噬 } else { $message = array('texts' => array(array('code' => 81106, 'content' => array(), 'params' => array())), 'delay' => 0); Protocol::input($player_id, 3, 7, 742, $message); # 首充装备不允许吞噬 $out_1515['swallow_ppids'] = ""; return $out_1515; } } # 计算吞噬属性最大等级 $swallow_lv_max = $this->get_we_swallow_lv_max($player_prop_info['vocation_limit'], $player_detail); $swallow_config_max = Cache_Forge::getInstance()->get_we_swallow_config_by_lv($swallow_lv_max); if (empty($swallow_config_max)) { $this->throw_error('80047'); # 未找到翅膀装备吞噬配置信息 } $player_prop_details = $this->get_data('PlayerProp')->get_player_prop_detail_multi($player_id, $swallow_equips); if (empty($player_prop_details)) { $this->throw_error('80024'); //未选择有效的被吞噬装备 } # 被吞噬装备信息 $before_swallow_info = empty($player_prop_info['we_swallow_info']) ? array() : $player_prop_info['we_swallow_info']; $player_prop_id_slave = ""; $item_id_slave = ""; $onekey_prop_list = array(); # 保存允许一键吞噬的装备ID列表 foreach ($swallow_equips as $pprop_id) { if (!empty($type)) { # 实际吞噬 if (empty($player_prop_details[$pprop_id])) { $this->throw_error('80013'); # 玩家没有该装备! } if (Com_Util::is_first_charge_item($player_prop_details[$pprop_id]['prop_id'])) { $this->throw_error('81107'); # 首充装备不允许被吞噬 } if ($player_prop_details[$pprop_id]['quality'] < $this->min_swallow_quality) { $this->throw_error('80044'); # 装备品质未达到被吞噬要求 } if (isset($player_prop_info['we_swallow_info']['swallow_exp']) && $player_prop_info['we_swallow_info']['swallow_exp'] >= $swallow_config_max['swallow_exp'] - 1) { $this->throw_error('80045'); # 装备已达到最大吞噬等级 } } else { # 非实际吞噬 if (!empty($onekey)) { # 一键勾选 if (empty($player_prop_details[$pprop_id])) { continue; } if (Com_Util::is_first_charge_item($player_prop_details[$pprop_id]['prop_id'])) { continue; } if ($player_prop_details[$pprop_id]['quality'] < $this->min_swallow_quality) { continue; } if (isset($player_prop_info['we_swallow_info']['swallow_exp']) && $player_prop_info['we_swallow_info']['swallow_exp'] >= $swallow_config_max['swallow_exp'] - 1) { continue; } } else { # 单项勾选,单次勾选获取吞噬信息需要弹提示属性满的消息,但不能阻断程序执行,只能跳出循环 if (empty($player_prop_details[$pprop_id])) { $message = array('texts' => array(array('code' => 80013, 'content' => array(), 'params' => array())), 'delay' => 0); Protocol::input($player_id, 3, 7, 742, $message); # 玩家没有该装备! break; } if (Com_Util::is_first_charge_item($player_prop_details[$pprop_id]['prop_id'])) { $message = array('texts' => array(array('code' => 81107, 'content' => array(), 'params' => array())), 'delay' => 0); Protocol::input($player_id, 3, 7, 742, $message); # 首充装备不允许被吞噬 break; } if ($player_prop_details[$pprop_id]['quality'] < $this->min_swallow_quality) { $message = array('texts' => array(array('code' => 80044, 'content' => array(), 'params' => array())), 'delay' => 0); Protocol::input($player_id, 3, 7, 742, $message); # 装备品质未达到被吞噬要求 break; } if (isset($player_prop_info['we_swallow_info']['swallow_exp']) && $player_prop_info['we_swallow_info']['swallow_exp'] >= $swallow_config_max['swallow_exp'] - 1) { $message = array('texts' => array(array('code' => 80045, 'content' => array(), 'params' => array())), 'delay' => 0); Protocol::input($player_id, 3, 7, 742, $message); # 装备已达到最大吞噬等级 break; } } } $player_prop_id_slave .= "{$pprop_id}:"; $item_id_slave .= $player_prop_details[$pprop_id]['prop_id'] . ":"; $onekey_prop_list[] = $pprop_id; # 计算增加属性值 && 修正经验值 $add_swallow_exp = self::$swallow_quality_to_exp_map[$player_prop_details[$pprop_id]['quality']] * (1 + intval($player_prop_details[$pprop_id]['level'] / 5) / 4); if (isset($player_prop_info['we_swallow_info'])) { $player_prop_info['we_swallow_info']['swallow_exp'] += $add_swallow_exp; } else { $player_prop_info['we_swallow_info'] = array('swallow_lv' => 0, 'swallow_exp' => $add_swallow_exp, 'swallow_attr' => array()); } } # 根据吞噬属性的exp,刷新吞噬属性的lv if (!empty($player_prop_info['we_swallow_info'])) { $swallow_config = Cache_Forge::getInstance()->get_we_swallow_config_by_exp($player_prop_info['we_swallow_info']['swallow_exp']); if (!empty($swallow_config)) { $player_prop_info['we_swallow_info']['swallow_lv'] = min($swallow_config['swallow_lv'], $swallow_lv_max); # 根据最大lv,修正经验值 if ($player_prop_info['we_swallow_info']['swallow_exp'] >= $swallow_config_max['swallow_exp'] - 1) { $player_prop_info['we_swallow_info']['swallow_exp'] = $swallow_config_max['swallow_exp'] - 1; } } else { $this->throw_error('80047'); # 未找到翅膀装备吞噬配置信息 } } # 根据吞噬等级,计算吞噬加成附加属性 $we_swallow_revise_info = Cache_Forge::getInstance()->get_we_swallow_config_by_lv($player_prop_info['we_swallow_info']['swallow_lv']); if (empty($we_swallow_revise_info)) { $this->throw_error('80047'); # 未找到翅膀装备吞噬配置信息 } foreach ($player_prop_info['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]; $player_prop_info['we_swallow_info']['swallow_attr'][$attr_key] = $attr_val; } if (empty($type)) { # 修正被吞噬的装备列表,去除吞噬属性达到上限及之后的其它装备 $out_1515['swallow_ppids'] = empty($onekey_prop_list) ? "" : implode(":", $onekey_prop_list); $out_1515['item_struct'] = Struct_Prop::get_prop_struct($player_prop_info); if (empty($out_1515['swallow_ppids']) && !empty($onekey)) { # 没有能被吞噬的装备 $message = array('texts' => array(array('code' => 80046, 'content' => array(), 'params' => array())), 'delay' => 0); Protocol::input($player_id, 3, 7, 742, $message); # 没有可以被吞噬的装备 } return $out_1515; } $out_1516 = array(0 => $player_prop_id, 1 => array('item_position' => 1, 'grid_list' => array())); $this->start_trans(); # 更新吞噬信息 $re = $this->get_data('PlayerProp')->update_player_prop($player_prop_info, array('we_swallow_info' => $player_prop_info['we_swallow_info'], 'we_swallow_version' => $this->we_swallow_version)); $this->write_check($re, 3010177); # 扣除被吞噬装备 foreach ($player_prop_details as $k => $v) { $re = $this->get_data('PlayerProp')->update_prop_num($player_id, $v, 1, '-', array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'cmd_id' => 1516)); $this->write_check($re, 3010182); } # 刷新玩家翅膀战力与镶嵌装备的附加属性及战力 if ($player_prop_info['item_position'] == $this->wing_pos) { $wing_attr = $player_detail['wing_info'][$player_prop_info['vocation_limit']]; # 修正缓存的翅膀装备吞噬信息 $wing_attr['equipment'][$player_prop_info['sub_type']]['we_swallow_info'] = $player_prop_info['we_swallow_info']; $wing_attr['equip_attr'] = $this->get_game('PlayerWing')->get_wing_equip_attr($wing_attr['equipment']); # 减去吞噬之前的战力 Struct_Prop::get_item_additions($before_player_prop_info); $wing_attr['fight'] -= $before_player_prop_info['fpower']; $wing_attr['equipment_fight'] -= $before_player_prop_info['fpower']; if ($wing_attr['fight'] < 0) { $wing_attr['fight'] = 0; } if ($wing_attr['equipment_fight'] < 0) { $wing_attr['equipment_fight'] = 0; } # 加上吞噬之后的战力 $player_prop_info_cp = $player_prop_info; Struct_Prop::get_item_additions($player_prop_info_cp); $wing_attr['fight'] += $player_prop_info_cp['fpower']; $wing_attr['equipment_fight'] += $player_prop_info_cp['fpower']; # 更新wing_info $player_detail['wing_info'][$player_prop_info['vocation_limit']] = $wing_attr; $re = $this->get_data('PlayerDetail')->update_player_detail($player_id, array('wing_info' => $player_detail['wing_info'])); $this->write_check($re, 3010242); #更新翅膀排行 if ($player_detail['wing_info'][$player_prop_info['vocation_limit']]['fight'] > 0) { $wing_fight = $player_detail['wing_info'][$player_prop_info['vocation_limit']]['fight']; $this->get_data('RankList')->update_wing_rank($player_id, $player_prop_info['vocation_limit'], $wing_fight); } } $this->commit(); # 成就相关埋 $this->get_game('PlayerAchieve')->async_trigger_achieve_target($player_id, 39, $player_prop_info['we_swallow_info']['swallow_lv'], 8); # -------------------------------------------------------------------- # 游戏日志记录 # -------------------------------------------------------------------- $log_info = array('player_id' => $player_id, 'player_level' => $player_info['level'], 'vip_level' => $player_info['vip'], 'vip_special_level' => $player_info['privilege_level'], 'add_time' => $this->current_time, 'player_prop_id_master' => $player_prop_info['player_prop_id'], 'item_id_master' => $player_prop_info['prop_id'], 'item_type' => $player_prop_info['type'], 'item_sub_type' => $player_prop_info['sub_type'], 'item_quality' => $player_prop_info['quality'], 'item_level' => $player_prop_info['level'], 'item_star_level' => $player_prop_info['star_level'], 'player_prop_id_slave' => rtrim($player_prop_id_slave, ":"), 'item_id_slave' => rtrim($item_id_slave, ":"), 'before_swallow_info' => $before_swallow_info, 'after_swallow_info' => $player_prop_info['we_swallow_info'], 'before_swallow_lv' => empty($before_swallow_info) ? 0 : $before_swallow_info['swallow_lv'], 'after_swallow_lv' => $player_prop_info['we_swallow_info']['swallow_lv'], 'before_swallow_exp' => empty($before_swallow_info) ? 0 : $before_swallow_info['swallow_exp'], 'after_swallow_exp' => $player_prop_info['we_swallow_info']['swallow_exp']); Log_Forge::getInstance()->add_log($log_info, 'we_swallow'); # 通知翅膀属性变更 if ($player_prop_info['item_position'] == $this->wing_pos) { #同步翅膀属性 $str = $this->get_game('PlayerWing')->get_activation_wing_interface($player_id, $player_detail['wing_info']); Protocol_Player::p2c_part_update($player_id, array('had_on_swings' => $str, 'wing' => '', 'attr' => '', 'player_data' => array('player_detail' => $player_detail, 'player' => array('career_type' => $player_info['career_type'], 'level' => $player_info['level'])))); } # 通知道具变更806 $ndata = array(); $ndata[] = $player_prop_info; foreach ($player_prop_details as $key => &$val) { $val['item_num'] -= 1; $out_1516[1]['grid_list'][] = $val['grid']; $ndata[] = $val; } Protocol_Prop::prop_806($player_id, $ndata); # 刷装备1506[翅膀装备强化面板]与1514[可吞噬道具列表] $out_1506 = $this->get_game('PlayerWing')->equipment_intensify_panel($player_id, 4); $out_1514 = $this->get_wing_equips_for_swallow($player_id, $player_prop_id); Protocol::input($player_id, 3, 15, 1506, $out_1506); Protocol::input($player_id, 3, 15, 1514, $out_1514); # 记录行为 Com_Log::write('xgame.forge_we_swallow', "{$player_id}\t" . "we_swallow\t" . "{$type}\t" . "{$player_prop_id}\t" . implode(",", $swallow_equips)); return $out_1516; }
public function get_wing_equip_gift_list($player_id, $vocation_limit = 7, $out_type = 0) { $this->param_check_numeric(array($player_id)); # 获取装备列表 $item_list = Cache_PlayerWing::getInstance()->get_wing_equip_gift_info_list($vocation_limit); if (empty($item_list)) { $this->throw_error('80048'); # 未配置赠送的翅膀装备 } #var_export($item_list); $start = strtotime(SERVER_FIRST_START_TIME); list($login_series_max, $login_acc) = $this->get_game('EventCondFunc')->_cal_login_refer($player_id, $start, $this->current_time); $deal_log_hash = $this->get_data('Wing')->get_deal_log_by_player_id($player_id); #var_export($deal_log_hash); $out_1517 = array('vocation_limit' => $vocation_limit, 'item_list' => array()); $out_status = 0; # 0没有可领取道具,1有可领取道具 foreach ($item_list as $item_info) { $gain_status = 0; # 领取状态:0可领,1条件未达成不可领,2已领取不可领[NOTE:可领只有一种情况,不可领有多种情况,所以这样表示] # 判断达成条件 if ($login_acc < $item_info['login_acc']) { $gain_status = 1; } # 判断是否已领取 if (!empty($deal_log_hash[$item_info['item_id']])) { $gain_status = 2; } $prop_info = Cache_Prop::getInstance()->get_prop_info($item_info['item_id']); $prop_info['item_num'] = 1; $out_1517['item_list'][] = array('item' => Struct_Prop::get_prop_struct($prop_info), 'login_acc' => $item_info['login_acc'], 'login_series' => $item_info['login_series'], 'gain_status' => $gain_status); if ($gain_status == 0) { $out_status = 1; } } if (empty($out_type)) { return $out_1517; } else { return $out_status; } }
/** * @Purpose: * 格式化配置表装备通用结构 * @param $prop_list 道具列表 * @param $career_type 职业 */ private function format_prop_currency_struct_table($prop_info, $career_type = 0) { $rtn_data = array(); if ($prop_info) { $data = explode("|", $prop_info); if (Com_Array::is_good_arr($data)) { foreach ($data as $second_layer) { $list = explode(":", $second_layer); if ($career_type > 0) { if ($list[0] == $career_type) { for ($i = 1; $i < count($list); $i++) { $item = Cache_Prop::getInstance()->get_prop_info($list[$i]); $item['item_num'] = 1; $rtn_data[] = Struct_Prop::get_prop_struct($item); } } } else { $item = Cache_Prop::getInstance()->get_prop_info($list[0]); $item['item_num'] = $list[1]; $rtn_data[] = Struct_Prop::get_prop_struct($item); } } } } return $rtn_data; }
/** * 获取邮件详细信息 * @param $player_id * @param $mail_id * @return null|array */ public function get_mail_detail_info($player_id, $mail_id) { $player_id = intval($player_id); $mail_id = intval($mail_id); $objmail = $this->get_data('PlayerMail'); $data = $objmail->get_player_mail_info($player_id, $mail_id); $prop_tip = array(); if (isset($data['isread'])) { if ($data['isread'] == 0) { //未读 $data['isread'] = 1; $objmail->update_player_mail($player_id, $mail_id, $data); $this->get_data('PlayerMail')->decr_unread_mail_num($player_id); } if (Com_Array::is_good_arr($data['attachment'])) { foreach ($data['attachment'] as $key => $val) { $player_prop_info = Cache_Prop::getInstance()->get_prop_info($val['prop_id']); $player_prop_info['item_num'] = $val['prop_num']; $player_prop_info['bind_flag'] = $data['bind_flag']; $data['attachment'][$key]['prop_tips'] = Struct_Prop::get_prop_struct($player_prop_info); } } } return $data; }
public static function get_prop_change_struct($data) { if (Com_Array::is_good_arr($data['prop_list'])) { //格式化符文背包信息列表 foreach ($data['prop_list'] as $key => $val) { $data['prop_list'][$key] = Struct_Prop::get_item_box_struct($val); } } return array(0 => intval($data['type']), 1 => intval($data['result']), 2 => $data['prop_list']); }
/** * 装备模块的战力 * @param $player_id */ public function calc_equip_fpower($player_id) { $equips = $this->get_game('Prop')->get_player_equip($player_id); $sum_power = 0; if (!empty($equips)) { foreach ($equips as $prop) { Struct_Prop::get_item_additions($prop); $sum_power += $prop['fpower']; } } // $sum_power = 0; // $player_detail = $this->get_data('PlayerDetail')->get_player_detail($player_id,array('equip_attr')); // if(!empty($player_detail['equip_attr'])){ // $attr = array(); // foreach($player_detail['equip_attr'] as $key=>$value){ // $attr[$key] += $value; // } // $sum_power = Formula_Fpower::calc_fpower($attr); // } return ceil($sum_power); }