/** * 获取挑战双方战斗信息 * @param unknown $player_id * @param unknown $opponent_player_id 对手玩家ID * @return multitype:number */ public function grab_treasure_battle($player_id, $opponent_player_id, $need_pieces_id, $battle_log_id = 0) { $opponent_player_id = intval($opponent_player_id); $battle_log_id = intval($battle_log_id); $opponent_player_info = $this->get_cross("GrabTreasure")->get_player_info($opponent_player_id, array("player_id", "is_dummy", "server_id")); if (empty($opponent_player_info)) { $opponent_player_info = $this->get_data("Player")->get_player_info($opponent_player_id, array("player_id", "is_dummy", "server_id")); if (empty($opponent_player_info)) { $this->throw_error('20002'); #获取玩家信息失败 } $opponent_player_info['server_id'] = SERVER_ID; } list($prop_id, $pieces_index) = explode("_", $need_pieces_id); $pieceConfig = Cache_GrabTreasurePiece::getInstance()->get_grab_treasure_piece($need_pieces_id); if (empty($pieceConfig)) { $this->throw_error('80003', "5010905{$prop_id}{$pieces_index}"); } $grab_prop_config = Cache_GrabTreasureBase::getInstance()->get_grab_treasure_id($prop_id); if (empty($grab_prop_config)) { $this->throw_error('80003', "5010900{$prop_id}"); //游戏配置出错,请联系客服! } #限制挑战玩家在推荐列表中或抢回日志列表中 if ($battle_log_id == 2) { $recommend_player_list = $this->get_cross("GrabTreasure")->get_grab_treasure($player_id, "recommend_player_list"); #操作不符法 if (empty($recommend_player_list) || !in_array($opponent_player_id, $recommend_player_list)) { $this->throw_error('173702', "5010916"); } } else { $log_data = $this->get_game("GrabTreasure")->grab_treasure_log($player_id, 1, 100); if (empty($log_data['list'])) { $this->throw_error('173702', "5010923"); } $is_allow_grab = 0; foreach ($log_data['list'] as $val) { if ($val["is_allow_grab"] == 1 && $val['grab_player_id'] == $opponent_player_id) { $is_allow_grab = 1; break; } } if ($is_allow_grab == 0) { $this->throw_error('173702', "5010932"); } } $quality = $grab_prop_config['quality']; # 当天剩余可用挑战次数验证 $buy_times_info = Cache_BuyTimes::getInstance()->get_buy_times_info($this->grab_treasure_battle_buy_type, 1); $battle_times = $this->get_data('PlayerDailyTime')->get_player_used_time($player_id, 'grab_treasure_battle_times'); $battle_buy_times = $this->get_data('PlayerDailyTime')->get_player_used_time($player_id, 'grab_treasure_battle_buy_times'); if (empty($battle_times)) { $battle_times = 0; } if (empty($battle_buy_times)) { $battle_buy_times = 0; } $battle_times_max = $battle_buy_times * $buy_times_info['per_num'] + $this->grab_treasure_max_times; if ($battle_times >= $battle_times_max) { $this->throw_error('113706'); # 剩余可用挑战次数不足 } $cd_acc_lock = $this->get_data('GrabTreasure')->get_battle_cd_acc_lock($player_id); # 获取挑战CD时间累计锁状态 $battle_remain_cd = $this->get_data('GrabTreasure')->get_battle_remain_cd($player_id); # 获取:挑战剩余cd时间 $safe_remain_cd = $this->get_cross('GrabTreasure')->get_safe_remain_cd($player_id); # 获取保护时间 $allow_battle = 1; if (!empty($cd_acc_lock)) { # CD时间累计锁打开,不再允许CD累计 if ($battle_remain_cd > 0) { $allow_battle = 0; } } else { # CD时间累计锁关闭,允许CD累计 if ($battle_remain_cd >= $this->grab_treasure_battle_cd_stint) { $allow_battle = 0; } } if ($allow_battle == 0) { $this->throw_error('122201'); # 夺宝战斗CD中[上次超过上限后CD尚未清零,CD累计锁尚未关闭] } #对手是否挑战中 $is_in_battle = $this->get_cross("GrabTreasure")->get_battle_lock($opponent_player_id); if ($is_in_battle) { $this->throw_error("122203"); } $player_info = $this->get_data('Player')->get_player_info($player_id, array("is_online", "privilege_level")); $is_online = $player_info["is_online"]; #对方在线保护状态不可挑战 $safe_remain_cd = $this->get_cross('GrabTreasure')->get_safe_remain_cd($opponent_player_id); # 获取保护时间 if ($safe_remain_cd > 0) { #离线玩家没有开启保护模式 if ($is_online) { $this->throw_error('122202'); } } #验证对手是否存在该碎片 if ($opponent_player_info['is_dummy'] == 0) { $grab_treasure_info = $this->get_cross("GrabTreasure")->get_grab_treasure($opponent_player_id); if ($grab_treasure_info) { if (!isset($grab_treasure_info['quality_piece_ids'][$quality]) || empty($grab_treasure_info['quality_piece_ids'][$quality])) { if ($battle_log_id > 0) { $log_data = $this->get_cross('GrabTreasureLog')->get_grab_treasure_log($player_id, $battle_log_id); if (!empty($log_data)) { $log_data['is_allow_grab'] = 0; $this->get_cross('GrabTreasureLog')->update_grab_treasure_info($player_id, $battle_log_id, $log_data); } } $this->throw_error('122801'); #碎片已被其它玩家抢光 } } } $player_data = $this->get_game('PlayerBase')->get_player_whole_attr($player_id); if (SERVER_ID == $opponent_player_info['server_id']) { $opponent_player_data = $this->get_game('PlayerBase')->get_player_whole_attr($opponent_player_id); } else { $param = array("action" => "PlayerInfo", "command" => "get_player_whole_attr", "player_id" => $opponent_player_id); $objApi = TenYear::getInstance('Com_Uzapi'); $objApi->setReqData($param); $ip = $this->get_cross('Base')->get_server_ip($opponent_player_info['server_id']); $objApi->setServerUrl($ip); $response = $objApi->sendRequest(); if (!empty($response['return'])) { $opponent_player_data = $response['return']; } else { $opponent_player_data = array(); } } SynPlayer::set_syn_data($player_data); $synPlayerData = SynPlayer::get_data(); SynPlayer::set_syn_data($opponent_player_data); $synTgtPlayerData = SynPlayer::get_data(); $data = array('ladder_id' => 0, 'role_id_0' => $player_data['player_id'], 'role_name_0' => $player_data['name'], 'career_type_0' => $player_data['career_type'], 'masks_0' => $synPlayerData['m'], 'values_0' => $synPlayerData['u'], 'role_id_1' => $opponent_player_data['player_id'], 'role_name_1' => $opponent_player_data['name'], 'career_type_1' => $opponent_player_data['career_type'], 'masks_1' => $synTgtPlayerData['m'], 'values_1' => $synTgtPlayerData['u']); # 获取唯一的战斗序列号 $battle_seq = $this->get_cross('GrabTreasure')->get_new_grab_treasure_battle_seq(); $data['ladder_id'] = $battle_seq; $this->start_trans(); $is_add_battle_cd = 1; #特权免CD if ($player_info['privilege_level'] > 0) { $left_cd = $this->get_game('VipSpecial')->get_left_time($player_id); if ($left_cd > 0) { $vip_info = Cache_VipLevelLimit::getInstance()->get_limit_info_unrelated_to_vip_level(10080); if (!empty($vip_info)) { if ($player_info['privilege_level'] >= $vip_info['vip_level']) { $is_add_battle_cd = 0; } } } } if ($is_add_battle_cd) { $re = $this->get_data('GrabTreasure')->add_battle_cd($player_id, $this->grab_treasure_battle_cd_time); $this->write_check($re, 5010726); } # 更新挑战次数 $re = $this->get_data('PlayerDailyTime')->add_used_time($player_id, 'grab_treasure_battle_times', 1); $this->write_check($re, 5010731); #对手挑战中 if ($opponent_player_info['is_dummy'] == 0) { $re = $this->get_cross("GrabTreasure")->add_battle_lock($opponent_player_id); $this->write_check($re, 5010765); } $update_data["battle_need_piece_id"] = $need_pieces_id; $update_data["battle_piece_quality"] = $quality; $update_data["battle_log_id"] = $battle_log_id; $re = $this->get_cross('GrabTreasure')->update_grab_treasure($player_id, $update_data); $this->write_check($re, 5010787); $this->commit(); $battle_id_info = array('player_id' => $player_id, 'opponent_player_id' => $opponent_player_id); $this->get_data("GrabTreasure")->add_battle_id_info($battle_seq, $battle_id_info); #一旦掠夺其他玩家的保护,会取消自己的保护时间 $this->get_cross("GrabTreasure")->clear_safe_remain_cd($player_id); # 推送C++战斗双方属性信息 Protocol::input($player_id, 7, 4, 540, $data); unset($data['masks_0'], $data['values_0'], $data['masks_1'], $data['values_1']); $data_json = json_encode($data); Com_Log::debug_write('xgame.grab_treasure', "{$player_id}\t" . "grab_treasure_battle\t" . "{$data_json}\t"); $out = array('result' => 1); #夺宝N次添加引导任务 $this->get_game('TaskTrigger')->async_trigger_guide_task($player_id, 35, 1); $this->get_game('DailyBoon')->async_trigger_daily_boon_task($player_id, 3016, 1); return $out; }
public function buff_attr($player_id, $part_update = true) { $data = $this->get_data('PlayerBuffData')->get_buff_data($player_id); $buff_data = array(); if ($data) { $buff_sid = array(); // $time = time(); foreach ($data as $val) { // if(($val['save_time']+$val['duration_total']/1000) > $time){ $buff_sid[] = $val['buff_sid']; // } } if ($buff_sid) { $buff_data = Cache_SkillBuff::getInstance()->get_buff_data($buff_sid); } } $buff_attr = array(); $buff_attr_per = array(); $buff_exp_addition = array(); if (!empty($buff_data)) { foreach ($buff_data as $val) { $attr_key = $this->get_attr_by_buff_type($val['param1']); if ($val['buff_type'] == 'mod_fight_attr') { $buff_attr[$attr_key] += $val['param2']; } if ($val['buff_type'] == 'mod_fight_attr_%') { $buff_attr_per[$attr_key] += $val['param2']; } if ($val['buff_type'] == 'mod_exp_%') { $buff_exp_addition['exp'] += $val['param1']; } } // Com_Log::write("buff_attr".$player_id,"buff_attr".var_export($buff_attr,true)); // Com_Log::write("buff_attr".$player_id,"buff_attr_per".var_export($buff_attr_per,true)); } $result = $this->get_data('PlayerDetail')->update_player_detail($player_id, array('buff_attr' => $buff_attr, 'buff_attr_per' => $buff_attr_per, 'buff_exp_addition' => $buff_exp_addition)); if (!$part_update) { $objPlayer = $this->get_data('Player'); $player_info = $objPlayer->get_player_info($player_id); $objFpowerCalc = $this->get_game('FpowerCalc'); $objFpowerCalc->set_player_info($player_info); $player_fpower = $objFpowerCalc->calc_player_fpower($player_id); $player_info['fpower'] = $player_fpower['fpower']; $update_fpower['buff_fpower'] = $player_fpower['buff_fpower']; $update_fpower['fpower'] = $player_info['fpower'] + $player_info['sq_fpower'] + $player_info['skill_fpower'] + $player_info['equip_fpower']; $sum_fpower = $update_fpower['fpower'] + $player_info['hero_fpower'] + $player_info['fairy_fpower'] + $player_info['wing_fpower'] + $update_fpower['buff_fpower']; $update_fpower['sum_fpower'] = $sum_fpower; $objPlayer->update_player_info($player_id, $update_fpower); $syn_item['buff_fpower'] = $update_fpower['buff_fpower']; SynPlayer::set_syn_data($syn_item); $data = SynPlayer::get_data(); Protocol::input($player_id, 7, 4, 417, array(0 => $data['m'], 1 => $data['u'])); } if ($result && $part_update) { Protocol_Player::p2c_part_update($player_id, array('attr' => '')); } }
/** * C++获取技能接口 405 进副本 * @param $player_id */ public function role_skill_list_req($player_id) { $player_info = $this->get_data('Player')->get_player_info($player_id, array('level', 'career_type')); $arr_player_detail = $this->get_data('PlayerDetail')->get_player_detail($player_id, array('skill_info', 'skill_rune_info', 'skill_starmap_info', 'train_info')); $skill_infos = $this->skill_list($player_id, $player_info, $arr_player_detail); $syndata['skill_infos'] = $skill_infos['skill_infos']; $syndata['fairy_info'] = $skill_infos['fairy_info']; SynPlayer::set_syn_data($syndata); $synData = SynPlayer::get_data(); return array(0, $synData['m'], $synData['u']); }
/** * C++请求某玩家信息 * @param $player_id * @param $serial_no * @return mixed */ public function query_role_info_ack($player_id, $serial_no, $min_level, $max_level, $func_type, $dungeon_type, $batch_index, $batch_count) { // Com_Log::write('xgame.playerbase', "$player_id\t$serial_no\t$min_level\t$max_level\t$func_type"); if (empty($player_id)) { # 生成一个robot # 按等级段从player表中随机匹配一个玩家,以该玩家属性生成的mask为准 $player_id = $this->get_data('Player')->get_rand_player_by_level_segment($min_level, $max_level); if (empty($player_id)) { return false; } # 御风说的,427没有符合等级段的玩家,不返回下行 # 获取一个去重后的随机昵称,并替换真实玩家昵称 $robot_name = $this->get_data('PlayerName')->get_unused_rand_nickname(); // Com_Log::write('xgame.playerbase', "player_id:$player_id\trobot_name:$robot_name"); # 获取一个新的player_id,替换掉真实玩家player_id,单服唯一,没有做更细致的$serial_no唯一 $robot_id = $this->get_data('Player')->get_new_player_id_for_robot(); if (!empty($func_type)) { $return_player_id = $player_id; } else { $return_player_id = $robot_id; } } else { # do nothing $return_player_id = $player_id; } $player_data = $this->get_player_whole_attr($player_id); # 替换掩码中的name和player_id $player_data['player_id'] = $return_player_id; $player_data['name'] = $robot_name ? $robot_name : $player_data['name']; # 属性折扣处理 if (!empty($func_type)) { $player_data['atk_min'] = ceil($player_data['atk_min'] * (1 - 0.2)); $player_data['atk_max'] = ceil($player_data['atk_max'] * (1 - 0.2)); $player_data['arm'] = ceil($player_data['arm'] * (1 - 0.2)); $player_data['crit_chance'] = ceil($player_data['crit_chance'] * (1 - 0.2)); $player_data['damage_dodge'] = ceil($player_data['damage_dodge'] * (1 - 0.2)); $player_data['hp'] = ceil($player_data['hp'] * (1 - 0.2)); } SynPlayer::set_syn_data($player_data); $synPlayerData = SynPlayer::get_data(); $out_427 = array('player_id' => $return_player_id, 'player_name' => $robot_name ? $robot_name : $player_data['name'], 'career_type' => $player_data['career_type'], 'serialno' => $serial_no, 'masks' => $synPlayerData['m'], 'values' => $synPlayerData['u'], 'func_type' => $func_type, 'dungeon_type' => intval($dungeon_type), 'batch_index' => intval($batch_index), 'batch_count' => intval($batch_count)); # 记录行为 // Com_Log::write('xgame.playerbase', // "{$player_id}\t". // "query_role_info_ack\t". // "{$out_427['player_id']}\t". // "{$out_427['player_name']}\t". // "{$out_427['career_type']}\t". // "{$out_427['serialno']}\t". // "{$out_427['func_type']}\t" // ); /** $data = $this->playerInfo($player_id, $player_id); $out_427 = array( 'player_id' => $robot_id ? $robot_id : $player_id, 'player_name' => $robot_name? $robot_name: $data['player_name'], 'career_type' => $data['career_type'], 'serialno' => $serial_no, 'masks' => $data['makes'], 'values' => $data['values'], ); **/ return $out_427; }
public function Sync_Union_create_msg($union_id) { $union_id = intval($union_id); $data = $this->get_data('UnionInfo')->get_union_info($union_id); if (!empty($data)) { #会长信息 $pdata = $this->get_game('PlayerBase')->get_player_init_info($data['create_player_id']); if (empty($pdata)) { $data['err_code'] = 1; return $data; } #获取掩码数据 SynPlayer::set_syn_data($pdata); $synData = SynPlayer::get_data(); $temp = array(); $temp['guild_id'] = $union_id; $temp['president_masks'] = $synData['m']; #会长角色属性掩码 $temp['president_values'] = $synData['u']; #会长角色属性数据 Protocol::input(0, 7, 4, 482, $temp); #更新缓存 $this->Sync_Union_msg($union_id, -1, 2, 0, false, false); } }
/** * 心跳同步 更新session expires * * @return unknown */ public function heart_sync($player_id) { $player_info = $this->get_data('Player')->get_player_info($player_id, array('silver', 'crystal', 'fame_level', 'career_type', 'gold', 'player_id', 'user_account', 'reg_time', 'ad_Info', 'level', 'vip', 'privilege_level', 'session_id', 'adult_flag', 'login_time', 'heart_time')); if (empty($player_info)) { return false; } $sessID = $player_info['session_id']; if (empty($sessID)) { return false; } $objSession = TenYear::getInstance('session'); $objSession->set_expire($sessID); $this->online_time($player_id, $player_info); //计算在线时长 if (OPERATOR_ID == 82) { $objT = $this->get_game('Tencent'); $seesion_info = $objT->get_param($player_id); $objT->isLogin(); } $data = $this->get_game('PlayerFunc')->red_icon($player_id, $player_info); Protocol::input($player_id, 8, 70, 7002, array(0 => $data, 1 => 1)); $time = date('H:i'); if ($time < '00:20') { $log_data = array('player_id' => $player_info["player_id"], 'channel' => 1, 'client_ip' => Com_System::get_client_ip(), 'game_client_ip' => Com_System::get_client_ip(), 'reg_time' => $player_info['reg_time'], 'ad_info' => $player_info['ad_Info'], 'player_level' => $player_info['level'], 'vip_level' => $player_info['vip'], 'vip_special_level' => $player_info['privilege_level']); Log_Common::getInstance()->add_log($log_data, 'day'); if ($player_info['ad_Info']) { Com_System::send_request(array('user_account' => $player_info['user_account']), 'login'); } } if ($time >= '05:05' && $time <= '05:15') { Com_Log::write("heart_sync." . $player_id, "start"); $syn_item['count_boss_oakland'] = 0; $syn_item['count_monsters_oakland'] = 0; $syn_item['count_chest_oakland'] = 0; SynPlayer::set_syn_data($syn_item); $data = SynPlayer::get_data(); Protocol::input($player_id, 7, 4, 417, array(0 => $data['m'], 1 => $data['u'])); } if ($player_info['level'] > 9) { $data = $this->get_game('Quit')->get_close_info($player_id); Protocol::input($player_id, 8, 7, 792, $data); $data = $this->get_game('Strengthen')->get_guide_list($player_id); Protocol::input($player_id, 8, 18, 1808, $data); } return true; }
public function update_player_vip($player_id, $level) { if ($level < 0 || $level > 10) { echo "等级错误"; return; } $objPlayer = TenYear::getInstance('Data_Player'); $objPlayer->update_player_info($player_id, array('vip' => $level)); SynPlayer::set_syn_data(array('vip' => $level)); $data = SynPlayer::get_data(); Protocol::input($player_id, 7, 4, 417, array(0 => $data['m'], 1 => $data['u'])); $out = TenYear::getInstance('Game_PlayerBag')->get_vip_bag_storage_num($player_id); Protocol::input($player_id, 8, 8, 844, $out); Protocol::out(); echo "添加成功"; }
/** * 1202: 获取天梯挑战双方战斗信息 * @note 如果用$tgt_player_id[对手ID] + $mon_offset[怪物位置偏移量] + $reward_buff_offset[额外奖励buff位置偏移量]作为挑战参数,则三者的参数验证比较复杂 * @param $opponent_seq 对手列表的唯一对手序号,方便参数验证 * @return bool */ public function challenge_battle($player_id, $opponent_seq) { # 参数合法性校验 $latest_opponent_list = $this->get_data('Challenge')->get_player_latest_opponent_list($player_id); if (empty($latest_opponent_list) || empty($latest_opponent_list[$opponent_seq])) { $this->throw_error('120110'); # 天梯挑战参数不合法 } # 当天天梯剩余可用挑战次数验证 $challenge_battle_num = $this->get_data('PlayerDailyTime')->get_player_used_time($player_id, 'challenge_battle_num'); $challenge_battle_buy_num = $this->get_data('PlayerDailyTime')->get_player_used_time($player_id, 'challenge_battle_buy_num'); if (empty($challenge_battle_num)) { $challenge_battle_num = 0; } if (empty($challenge_battle_buy_num)) { $challenge_battle_buy_num = 0; } $current_challenge_avail_battle_num = $challenge_battle_buy_num * 5 + $this->challenge_battle_stint - $challenge_battle_num; if ($current_challenge_avail_battle_num <= 0) { $this->throw_error('120112'); # 天梯剩余可用挑战次数不足 } # 战前排位优先 $tgt_rank = $latest_opponent_list[$opponent_seq]['rank']; $tgt_player_id = $latest_opponent_list[$opponent_seq]['player_id']; $mon_offset = $latest_opponent_list[$opponent_seq]['mon_offset']; $reward_buff_type = $latest_opponent_list[$opponent_seq]['reward_buff_type']; $reward_buff_offset = $latest_opponent_list[$opponent_seq]['reward_buff_offset']; # NOTE: 因为怪物的sort_weight = 2 * mon_offset - 1;故而mon_offset临近的两个怪物中间一定会有一个玩家存在; # 例如mon_offset=[6,7]的怪物,其sort_weight为[11,13],则中间值sort_weight=12的一定是rank=6的实际玩家,故而向后取序号一定可以取到玩家 $dummy_player_id = $mon_offset ? $latest_opponent_list[$opponent_seq - 1]['player_id'] : 0; # 挑战怪物时,需要取怪物后一位排名玩家属性 $player_rank_info = $this->get_data('Challenge')->get_player_challenge_rank_info($player_id); # 选择挑战对手时,本人的最新排名信息 if ($player_rank_info['challenge_status'] == 1 || $player_rank_info['challenge_status'] == 2) { # --------------------------------------------------------------------- # 验证对手列表是否过于陈旧(第一位) # --------------------------------------------------------------------- /** # 获取最新的天梯对手玩家列表 list($opponent_list, $opponent_player_ids, $hold_monster_info) = $this->get_opponent_list($player_rank_info); # 对对手列表添加额外奖励buff信息 $opponent_list = $this->challenge_reward_buff_handle($opponent_list, $player_id, $player_rank_info['challenge_status']); # 获取简化的对手列表 $simplified_oppo_list = $this->get_simplified_opponent_list($opponent_list); $is_diff = $this->diff_oppo_list($simplified_oppo_list, $latest_opponent_list); if (!empty($is_diff)) { $latest_challenge_list = $this->get_challenge_list($player_id); Protocol::input($this->_authuser['player_id'],3,12,1201,$latest_challenge_list); $this->throw_error('120115'); # 天梯列表过于陈旧,刷新后请重新选择对手 } **/ # --------------------------------------------------------------------- # 非怪物时,验证对手排位变化,若发生变化,则变更对手为该排位上的最新对手(第二位),由于上一步的确保,此步骤其实是多余的 # --------------------------------------------------------------------- if (empty($mon_offset)) { $tgt_player_rank_info = $this->get_data('Challenge')->get_player_challenge_rank_info($tgt_player_id); if ($tgt_player_rank_info['rank'] != $tgt_rank) { $tgt_player_rank_info = $this->get_data('Challenge')->get_player_challenge_rank_info_by_rank($tgt_rank); $tgt_player_id = $tgt_player_rank_info['player_id']; #$this->throw_error('120113'); # 对手排位已改变,请更新对手列表后再挑战 } } # --------------------------------------------------------------------- # 验证对手是否已经在天梯挑战过程中(第三位) # --------------------------------------------------------------------- if (empty($mon_offset)) { if (!empty($tgt_player_rank_info['is_in_battle']) && $this->current_time < $tgt_player_rank_info['in_battle_time'] + $this->challenge_battle_vtime) { $this->throw_error('120114'); # 对手正在天梯战斗中,请稍后再战或更换对手 } } else { $monster_info = $this->get_data('Challenge')->get_challenge_monster_info($mon_offset); if (!empty($monster_info['is_in_battle']) && $this->current_time < $monster_info['in_battle_time'] + $this->challenge_battle_vtime) { $this->throw_error('120114'); # 对手正在天梯战斗中,请稍后再战或更换对手 } } } # 是否允许挑战校验,检测是否战斗CD超过规定值 $cd_acc_lock = $this->get_data('Challenge')->get_cd_acc_lock($player_id); # 获取天梯挑战CD时间累计锁状态 $remain_cd = $this->get_data('Challenge')->get_challenge_remain_cd($player_id); if (!empty($cd_acc_lock)) { # CD时间累计锁打开,不再允许CD累计 if ($remain_cd > 0) { $this->throw_error('120135'); # 天梯挑战冷却中[上次超过上限后CD尚未清零,CD累计锁尚未关闭] } } else { # CD时间累计锁关闭,允许CD累计 if ($remain_cd >= $this->challenge_battle_cd_stint) { $this->throw_error('120105'); # 天梯挑战冷却中,可花费钻石清除[CD累计值超过上限] } } # 是否允许挑战校验,检测是否在上一场战斗CD中,本人 $last_battle_log = $this->get_data('Challenge')->get_challenge_battle_log_by_player_id($player_id); if ($last_battle_log['battle_status'] == 0 && $this->current_time < $last_battle_log['reg_time'] + $this->challenge_battle_vtime) { $this->throw_error('120101'); # 天梯战斗CD中 } # 验证mon_offset是否合法 if (!empty($mon_offset)) { $monster_info = $this->get_data('Challenge')->get_challenge_monster_info($mon_offset); if (empty($monster_info)) { $this->throw_error('120109'); # 天梯挑战怪物不存在或已被击杀 } } $player_data = $this->get_player_whole_attr($player_id); $player_info = $this->get_data('Player')->get_player_info($player_id); # 连败时的战力加成处理 if ($player_info['challenge_cont_lose'] > 0) { $ability_add_info = Cache_Ladder::getInstance()->get_ability_add_info($player_info['challenge_cont_lose']); if (empty($ability_add_info)) { $this->throw_error('120106'); # 没有连胜或连败的加成配置信息 } $player_data['sum_fpower'] = $player_data['sum_fpower'] * (1 + intval($ability_add_info['ability_add'] / 100)); } if ($mon_offset) { # 玩家挑战NPC $dummy_player_data = $this->get_player_whole_attr($dummy_player_id); # 虚拟玩家属性 #Com_Log::debug_write('xgame.challenge', "$player_id challenge $tgt_player_id " . json_encode($dummy_player_data)); # 属性折扣处理 $this->battle_attr_addition_handle($player_data); SynPlayer::set_syn_data($player_data); $synPlayerData = SynPlayer::get_data(); SynPlayer::set_syn_data($dummy_player_data); $synTgtPlayerData = SynPlayer::get_data(); $data = array('ladder_id' => 0, 'role_id_0' => $player_data['player_id'], 'role_name_0' => $player_data['name'], 'career_type_0' => $player_data['career_type'], 'masks_0' => $synPlayerData['m'], 'values_0' => $synPlayerData['u'], 'role_id_1' => $dummy_player_data['player_id'], 'role_name_1' => $dummy_player_data['name'], 'career_type_1' => $dummy_player_data['career_type'], 'masks_1' => $synTgtPlayerData['m'], 'values_1' => $synTgtPlayerData['u'], 'monster_npc_sid' => $tgt_player_id, 'extra_buff_id0' => 0, 'extra_buff_id1' => 0); } else { # 玩家挑战玩家 $tgt_player_data = $this->get_player_whole_attr($tgt_player_id); #Com_Log::debug_write('xgame.challenge', "$player_id challenge $tgt_player_id " . json_encode($tgt_player_data)); #Com_Log::debug_write('xgame.challenge', "$player_id challenge $tgt_player_id skill_infos_tgt " . json_encode($tgt_player_data['skill_infos'])); # 属性折扣处理 $this->battle_attr_discount_handle($player_data, $tgt_player_data); SynPlayer::set_syn_data($player_data); $synPlayerData = SynPlayer::get_data(); SynPlayer::set_syn_data($tgt_player_data); $synTgtPlayerData = SynPlayer::get_data(); $data = array('ladder_id' => 0, 'role_id_0' => $player_data['player_id'], 'role_name_0' => $player_data['name'], 'career_type_0' => $player_data['career_type'], 'masks_0' => $synPlayerData['m'], 'values_0' => $synPlayerData['u'], 'role_id_1' => $tgt_player_data['player_id'], 'role_name_1' => $tgt_player_data['name'], 'career_type_1' => $tgt_player_data['career_type'], 'masks_1' => $synTgtPlayerData['m'], 'values_1' => $synTgtPlayerData['u'], 'monster_npc_sid' => 0, 'extra_buff_id0' => 0, 'extra_buff_id1' => 0); } # 获取挑战额外加成BUFF可用加成次数 $second_last_login_time = !empty($player_info['second_last_login_time']) ? $player_info['second_last_login_time'] : $player_info['login_time']; $extra_buff_avail_num = $this->get_challenge_battle_extra_buff_avail_num($player_id, $second_last_login_time); # 赋值额外加成buff并消耗1次使用次数 if ($extra_buff_avail_num > 0) { $data['extra_buff_id0'] = $this->extra_buff_id_self; $extra_buff_avail_num -= 1; $extra_buff_avail_num = max($extra_buff_avail_num, $this->extra_buff_avail_num_stint); $re = $this->get_data('Challenge')->set_player_extra_buff_avail_num($player_id, $extra_buff_avail_num); $this->write_check($re, 3010491); } # 第一次天梯挑战则加一个额外buff if (empty($player_rank_info['in_battle_time'])) { $data['extra_buff_id0'] = $this->extra_buff_id_self; $data['extra_buff_id1'] = $this->extra_buff_id_opponent; } # 获取唯一的战斗序列号 $battle_seq = $this->get_data('Challenge')->get_new_challenge_battle_seq($player_id); $data['ladder_id'] = $battle_seq; $this->start_trans(); # 增加天梯挑战cd时间,只有当vip等级小于某个值时才有挑战CD $vip_limit_type = Cache_VipLevelLimit::getInstance()->get_limit_info_func_id(10013); $vip_limit_info = Cache_VipLevelLimit::getInstance()->get_limit_info_unrelated_to_vip_level(10013); if (!empty($vip_limit_type) && !empty($vip_limit_info)) { # 有vip限制 if ($vip_limit_type['fun_type'] == 1) { # vip限制 if ($player_info['vip'] < $vip_limit_info['vip_level']) { $re = $this->get_data('Challenge')->add_challenge_battle_cd($player_id, $this->challenge_battle_cd_time); $this->write_check($re, 3010512); } } elseif ($vip_limit_type['fun_type'] == 2) { # 特权限制 $left_time = $this->get_game('VipSpecial')->get_left_time($player_id); if ($player_info['privilege_level'] < $vip_limit_info['vip_level'] || $left_time == 0) { $re = $this->get_data('Challenge')->add_challenge_battle_cd($player_id, $this->challenge_battle_cd_time); $this->write_check($re, 3010512); } } } else { # 无vip限制 $re = $this->get_data('Challenge')->add_challenge_battle_cd($player_id, $this->challenge_battle_cd_time); $this->write_check($re, 3010516); } # 更新天梯挑战次数 $re = $this->get_data('PlayerDailyTime')->add_used_time($player_id, 'challenge_battle_num', 1); $this->write_check($re, 3010521); # 记录挑战日志,注意要以两种方式记录,以battle_seq为key和以player_id为key两种,后面那种允许覆盖,仅记录玩家最后一次挑战信息 $battle_log = array('battle_seq' => $battle_seq, 'player_id' => $player_id, 'tgt_player_id' => $tgt_player_id, 'battle_status' => 0, 'reg_time' => $this->current_time, 'mon_offset' => $mon_offset, 'battle_result' => 0, 'reward_buff_type' => $reward_buff_type, 'reward_buff_offset' => $reward_buff_offset); $re = $this->get_data('Challenge')->update_challenge_battle_log($battle_log); $this->write_check($re, 3010536); # 更新战斗状态 if ($player_rank_info['challenge_status'] == 1 || $player_rank_info['challenge_status'] == 2) { # 真实天梯对手才需要更新 $player_rank_info['is_in_battle'] = 1; $player_rank_info['in_battle_time'] = $this->current_time; $re = $this->get_data('Challenge')->update_challenge_rank_info($player_rank_info); $this->write_check($re, 3010543); if (empty($mon_offset)) { $tgt_player_rank_info['is_in_battle'] = 1; $tgt_player_rank_info['in_battle_time'] = $this->current_time; $re = $this->get_data('Challenge')->update_challenge_rank_info($tgt_player_rank_info); $this->write_check($re, 3010548); } else { $monster_info['is_in_battle'] = 1; $monster_info['in_battle_time'] = $this->current_time; $re = $this->get_data('Challenge')->update_challenge_monster_info($monster_info); $this->write_check($re, 3010553); } } $this->commit(); //找回资源埋点 $this->get_game('GetBackCurrency')->add_function_day_times($player_id, 5); # 蛋疼的次数同步埋点 $this->get_game('PlayerFunc')->sync_func_tips($player_id, 1040); # 推送C++战斗双方属性信息 Protocol::input($player_id, 7, 4, 428, $data); # 每日活跃任务埋点 $this->get_game('DailyBoon')->async_trigger_daily_boon_task($player_id, 3002, 1, 1); # 记录行为 unset($data['masks_0'], $data['values_0'], $data['masks_1'], $data['values_1']); $data_json = json_encode($data); Com_Log::write('xgame.challenge', "{$player_id}\t" . "challenge_battle\t" . "{$data_json}\t"); $out = array('result' => 1); return $out; }
/** * 战斗开始 * @param $player_id 角色id * @param $opp_player_id 对手 * @param $star 星数 * @return array */ public function fight_begin($player_id, $opp_player_id, $star) { $opp_player_id = intval($opp_player_id); if (!in_array($star, array(1, 2, 3))) { //参数错误 $this->throw_error(10107, 6010124); } $left_num = $this->get_left_times($player_id); if ($left_num <= 0) { //次数用完 $this->throw_error(17888, 6010124); } //玩家不存在 $player_data = $this->get_game('PlayerBase')->get_player_whole_attr($player_id); if (!$player_data) { $this->throw_error(70110, 6010125); } $opponent_player_data = $this->get_game('PlayerBase')->get_player_whole_attr($opp_player_id); if (!$opponent_player_data) { $this->throw_error(70110, 6010126); } $union_id = $player_data['union_id']; $opp_union_id = $opponent_player_data['union_id']; if (!$union_id || !$opp_union_id) { $this->throw_error(171101, 6010134); } $ntime = $time = time(); $time = $this->get_data('UnionGrabDomain')->get_revise_time($time); $day = date('Ymd', $time); $grab_domain_conf = Cache_UnionGrabDomain::getInstance()->get_base_conf(); if ($ntime > strtotime($grab_domain_conf['end_time']) || $ntime < strtotime($grab_domain_conf['start_time'])) { $this->throw_error(70204, 6010160); } //公会排名低 $grab_domain_info = $this->get_data('UnionGrabDomain')->get_domain_info($day); if (!$grab_domain_info || !in_array($union_id, $grab_domain_info['group_union']) || !in_array($opp_union_id, $grab_domain_info['group_union'])) { $this->throw_error(6010127); } $grab_opp_union_info = $this->get_data('UnionGrabDomain')->get_union_info($day, $opp_union_id); if (1 != $grab_opp_union_info['status']) { //战斗标记未开启 $this->throw_error(6010132); } if ($union_id != $grab_opp_union_info['opp_union_id']) { //不是敌方公会 $this->throw_error(6010137); } if (!in_array($opp_player_id, $grab_opp_union_info['manor_info'])) { //领地不存在 $this->throw_error(6010138); } $grab_opp_manor_info = $this->get_data('UnionGrabDomain')->get_manor_info($day, $opp_player_id); if (isset($grab_opp_manor_info) && $grab_opp_manor_info['is_fight']) { if ($ntime - $grab_opp_manor_info['fight_time'] > 300) { //处理C++异常 $player_info = $this->get_data('UnionGrabDomain')->get_player_info($day, $grab_opp_manor_info['fight_player_id']); if ($player_info) { if ($player_id == $grab_opp_manor_info['fight_player_id']) { $attack_fpower = $player_data['sum_fpower']; } else { $attack_fpower = $this->get_data('Player')->get_player_info($grab_opp_manor_info['fight_player_id'], 'sum_fpower'); } $defender_fpower = $opponent_player_data['sum_fpower']; if ($attack_fpower >= $defender_fpower) { $winner_role_id = $grab_opp_manor_info['fight_player_id']; $loser_role_id = $opp_player_id; } else { $winner_role_id = $opp_player_id; $loser_role_id = ${$grab_opp_manor_info}['fight_player_id']; } $battle_id = $player_info['battle_id']; $this->game_over($battle_id, $winner_role_id, $loser_role_id, false); $grab_opp_manor_info = $this->get_data('UnionGrabDomain')->get_manor_info($day, $opp_player_id); } } else { $this->throw_error(6010128); //有盟友正在攻打该领地 } } if (isset($grab_opp_manor_info) && $grab_opp_manor_info['miss_star'] >= 3) { $this->throw_error(6010129); //该领地已被我方占领 } if (isset($grab_opp_manor_info) && $grab_opp_manor_info['miss_star'] >= $star) { $this->throw_error(6010130); //此选择更高级别挑战 } $update = array('is_fight' => 1, 'fight_player_id' => $player_id, 'fight_time' => $ntime); $buff_id = 0; if (1 == $star) { $buff_id = 10601; } elseif (3 == $star) { $buff_id = 10602; } SynPlayer::set_syn_data($player_data); $synPlayerData = SynPlayer::get_data(); SynPlayer::set_syn_data($opponent_player_data); $synTgtPlayerData = SynPlayer::get_data(); $data = array('guild_war_id' => 0, 'role_id_0' => $player_data['player_id'], 'role_name_0' => $player_data['name'], 'career_type_0' => $player_data['career_type'], 'masks_0' => $synPlayerData['m'], 'values_0' => $synPlayerData['u'], 'role_id_1' => $opponent_player_data['player_id'], 'role_name_1' => $opponent_player_data['name'], 'career_type_1' => $opponent_player_data['career_type'], 'masks_1' => $synTgtPlayerData['m'], 'values_1' => $synTgtPlayerData['u'], 'extra_buff_id0' => 0, 'extra_buff_id1' => $buff_id); # 获取唯一的战斗序列号 $battle_seq = $this->get_data('UnionGrabDomain')->get_new_battle_seq(); $data['guild_war_id'] = $battle_seq; $this->start_trans(); $re = $this->get_data('UnionGrabDomain')->set_player_info($day, $player_id, array('battle_id' => $battle_seq, 'battle_star' => $star)); $this->write_check($re, 6010133); $re = $this->get_data('UnionGrabDomain')->set_battle_info($battle_seq, array('battle_id' => $battle_seq, 'attack_player_id' => $player_id, 'defender_player_id' => $opp_player_id, 'battle_star' => $star, 'status' => 0)); $this->write_check($re, 6010161); $re = $this->get_data('UnionGrabDomain')->set_manor_info($day, $opp_player_id, $update); $this->write_check($re, 6010125); $re = $this->get_data('PlayerDailyTime')->add_used_time($player_id, 'union_grab_domain_use_times'); //增加挑战次数 $this->write_check($re, 6010131); $this->commit(); # 推送C++战斗双方属性信息 Protocol::input($player_id, 7, 4, 542, $data); $ret = array('res' => 1); return $ret; }
public function sync($data) { if (empty($data)) { return; } $data = json_decode($data, true); if (!isset($data['player_id'])) { return; } $player_id = $data['player_id']; $arr_update = $data['arr_update']; $gateway = $data['gateway']; //测试环境 推送到不同的gateway // echo $gateway."\n"; SynPlayer::init($player_id); SynPlayer::set_player($player_id); if (isset($arr_update['load']) && $arr_update['load'] == 1) { #登陆的时候加载下数据 SynPlayer::init_syn_data(null); SynPlayer::set_syn_data($arr_update['init_data']); return; } ######################################################## $objPlayerBase = $this->get_game('PlayerBase'); $objFpowerCalc = $this->get_game('FpowerCalc'); $objPlayer = $this->get_data('Player'); $objDetail = $this->get_data('PlayerDetail'); $objPlayerSkill = $this->get_game('PlayerSkill'); $objPlayerAchieve = $this->get_game('PlayerAchieve'); $objFairy = $this->get_data('Fairy'); $objHero = $this->get_game('Hero'); $objPlayerHero = $this->get_data('PlayerHero'); $objPlayerWing = $this->get_game('PlayerWing'); ######################################################## $player_detail = null; $playerInfo = null; if (isset($arr_update['player_data'])) { $player_detail = $arr_update['player_data']['player_detail']; $playerInfo = $arr_update['player_data']['player']; if (isset($arr_update['player_data']['player_detail']) && empty($player_detail)) { $player_detail = $objDetail->get_player_detail($player_id, Protocol_Player::get_player_attr_detail_key()); } if (isset($arr_update['player_data']['player']) && empty($playerInfo)) { $playerInfo = $objPlayer->get_player_info($player_id); } // Com_Log::write("sync.".$player_id,"player_data".var_export($arr_update['player_data'],true)); } //Com_Log::write("sync.".$player_id,"player_detail".var_export($player_detail,true)); //Com_Log::write("sync.".$player_id,"playerInfo".var_export($playerInfo,true)); $cur_data = SynPlayer::get_uval(); // Com_Log::write('potion_hot_cnt_'.$player_id,var_export($cur_data,true)); if (empty($cur_data)) { SynPlayer::init_syn_data(null); $init_data = $objPlayerBase->get_player_init_info($player_id); SynPlayer::set_syn_data($init_data); $cur_data = SynPlayer::get_uval(); if (isset($arr_update['potion_dh_cnt'])) { $arr_update['potion_dh_cnt'] = 0; } #初次同步 如果有这些同步就置为0 if (isset($arr_update['potion_hot_cnt'])) { $arr_update['potion_hot_cnt'] = 0; } if (isset($arr_update['mp_potion_cnt'])) { $arr_update['mp_potion_cnt'] = 0; } } $syn_item = array(); $player_info = array(); if (isset($arr_update['attr']) || isset($arr_update['fairy_info']) || isset($arr_update['hero_info'])) { //更新人物属性 // Com_Log::write('sync_player',"############################[start]##################################"); // Com_Log::write('sync_player',"cur_data:".var_export($cur_data,true)); $player_info = $this->get_player_info($player_id, $playerInfo, $player_detail); $attr = Cache_AttrConfig::getInstance()->get_attr(); // Com_Log::write('sync_player',"attr:".var_export($attr,true)); $attr_mag = array(); $level = $cur_data[36]; // Com_Log::write("sync_level.".$player_id,"level:{$level}"); foreach ($attr as $key) { $cur_val = $cur_data[SynPlayer::get_attr_inde($key)]; $now_val = intval($player_info[$key]); // Com_Log::write('sync_player.'.$player_id,"key:{$key} cur_val:{$cur_val} now_val:{$now_val}"); // echo "key:{$key} cur_val:{$cur_val} now_val:{$now_val}\n"; if ($cur_val != $now_val) { $diff_val = $now_val - $cur_val; if ($level <= 20 && $diff_val < 0) { // continue; } else { if ($diff_val < 0) { $diff_val = $diff_val * -1; $color = "FC0100"; $symbol = "-"; } else { $color = "66FD34"; $symbol = "+"; } if ($key != 'atk_max') { $param = array(array('rep_type' => 6, 'rep_val' => $key), array('rep_type' => 7, 'rep_val' => $symbol, 'rep_color' => $color), array('rep_type' => 7, 'rep_val' => $diff_val, 'rep_color' => $color)); $attr_mag[] = Language_Message::make_message('10116', $param); } } } $syn_item[$key] = $now_val; // Com_Log::write('sync_player',"############################[end]##################################"); } if (!empty($attr_mag)) { if (isset($arr_update['exp'])) { $msg_out = array(0 => $attr_mag, 1 => 2000); } else { $msg_out = array(0 => $attr_mag, 1 => 0); } Protocol::input($player_id, 8, 7, 742, $msg_out); } } $update_fpower = array(); if (isset($arr_update['wing']) || isset($arr_update['dower_info']) || isset($arr_update['hero_info']) || isset($arr_update['attr']) || isset($arr_update['fairy_info']) || isset($arr_update['skill_infos'])) { if (empty($player_info)) { $player_info = $this->get_player_info($player_id, $playerInfo, $player_detail); } Com_Log::write("player_fpower." . $player_id, "############################[start]#####################################"); Com_Log::write("player_fpower." . $player_id, "player_info:" . var_export($player_info, true)); Com_Log::write("player_fpower." . $player_id, "player_detail:" . var_export($player_detail, true)); // Com_Log::write("sync_player_fpower.".$player_id,"player_info:".var_export($player_info,true)); // Com_Log::write("sync_player_fpower.".$player_id,"player_detail:".var_export($player_detail,true)); $objFpowerCalc->set_player_info($player_info); $objFpowerCalc->set_player_detail($player_detail); $player_fpower = $this->get_game('FpowerCalc')->calc_player_fpower($data['player_id']); $player_info['fpower'] = $update_fpower['fpower'] = $player_fpower['fpower']; $update_fpower['buff_fpower'] = $syn_item['buff_fpower'] = $player_fpower['buff_fpower']; if (isset($arr_update['attr'])) { $update_fpower['equip_fpower'] = $objFpowerCalc->calc_equip_fpower($player_id); $player_info['equip_fpower'] = $syn_item['equip_fpower'] = $update_fpower['equip_fpower']; $update_fpower['sq_fpower'] = $objFpowerCalc->calc_sq_fpower($player_id); $player_info['sq_fpower'] = $syn_item['sq_fpower'] = $update_fpower['sq_fpower']; } if (isset($arr_update['fairy_info'])) { $update_fpower['fairy_fpower'] = $objFpowerCalc->calc_fairy_fpower($player_id); $player_info['fairy_fpower'] = $syn_item['fairy_fpower'] = $update_fpower['fairy_fpower']; } if (isset($arr_update['hero_info'])) { $update_fpower['hero_fpower'] = $objFpowerCalc->calc_hero_fpower($player_id); $player_info['hero_fpower'] = $syn_item['hero_fpower'] = $update_fpower['hero_fpower']; } if (isset($arr_update['skill_infos']) || isset($arr_update['dower_info'])) { $update_fpower['skill_fpower'] = $objFpowerCalc->calc_skill_fpower($player_id); $player_info['skill_fpower'] = $syn_item['skill_fpower'] = $update_fpower['skill_fpower']; } if (isset($arr_update['wing'])) { $update_fpower['wing_fpower'] = $objFpowerCalc->calc_wing_fpower($player_id); $player_info['wing_fpower'] = $syn_item['wing_fpower'] = $update_fpower['wing_fpower']; } if ($update_fpower) { $update_fpower['fpower'] = $player_info['fpower'] + $player_info['sq_fpower'] + $player_info['skill_fpower'] + $player_info['equip_fpower']; Com_Log::write("player_fpower." . $player_id, "fpower:{$player_info['fpower']} sq_fpower:{$player_info['sq_fpower']} skill_fpower:{$player_info['skill_fpower']} equip_fpower:{$player_info['equip_fpower']}"); $sum_fpower = $update_fpower['fpower'] + $player_info['hero_fpower'] + $player_info['fairy_fpower'] + $player_info['wing_fpower'] + $update_fpower['buff_fpower']; Com_Log::write("player_fpower." . $player_id, "hero_fpower:{$player_info['hero_fpower']} fairy_fpower:{$player_info['fairy_fpower']} wing_fpower:{$player_info['wing_fpower']} buff_fpower:{$update_fpower['buff_fpower']}"); $update_fpower['sum_fpower'] = $sum_fpower; if ($sum_fpower > $player_info['max_sum_fpower']) { $update_fpower['max_sum_fpower'] = $sum_fpower; } $yesterday_max_sum_fpower = $this->get_data("PlayerDailyTime")->get_player_used_time($player_id, 'yesterday_max_sum_fpower'); if (intval($yesterday_max_sum_fpower) == 0) { $grab_treasure_info = $this->get_cross("GrabTreasure")->get_grab_treasure($player_id); if (!empty($grab_treasure_info)) { $yesterday_max_sum_fpower = intval($player_info['max_sum_fpower']) ? $player_info['max_sum_fpower'] : $player_info['sum_fpower']; $this->get_data("PlayerDailyTime")->set_used_time($player_id, 'yesterday_max_sum_fpower', $yesterday_max_sum_fpower); } } $objPlayer->update_player_info($player_id, $update_fpower); $syn_item['fpower'] = $update_fpower['fpower']; $syn_item['sum_fpower'] = $sum_fpower; Com_Log::write("player_fpower." . $player_id, "sum_fpower:{$sum_fpower} fpower:{$update_fpower['fpower']}"); $this->get_data("Player")->set_player_sum_fpower($player_id, $sum_fpower); if ($player_info['level'] > 20) { if (!isset($player_info['union_id'])) { $playerInfo = $objPlayer->get_player_info($player_id); } $this->get_data("UnionInfo")->set_union_player_sum_fpower($player_info['union_id'], $player_id, $sum_fpower); } $objPlayerAchieve->async_trigger_achieve_target($player_id, 1, $sum_fpower, 2, $player_info['level']); } $objFpowerCalc->clear_static(); unset($arr_update['attr']); Com_Log::write("player_fpower." . $player_id, "############################[end]#####################################"); } if (isset($arr_update['equip_model']) || isset($arr_update['fashion_fit'])) { if (empty($arr_update['equip_model'])) { $arr_update['equip_model'] = $this->get_equip_views($player_id); } if (!isset($player_detail['fashion_fit']) || !isset($player_detail['player_settings'])) { $player_detail = $objDetail->get_player_detail($player_id, array('fashion_fit', 'player_settings')); } $fashion_fit = $player_detail['fashion_fit']; $meditation_flag = isset($player_detail['player_settings'][34]) ? $player_detail['player_settings'][34] : 0; if ($meditation_flag == 0) { if ($fashion_fit) { $fashions = Cache_Fashion::getInstance()->get_fashion(array_values($fashion_fit)); if ($fashions) { if (isset($fashion_fit[1])) { $arr_update['equip_model'][3] = $fashions[$fashion_fit[1]]['equip_view']; } if (isset($fashion_fit[2])) { $arr_update['equip_model'][0] = $fashions[$fashion_fit[2]]['equip_view']; } } } } $syn_item['equip'] = $arr_update['equip_model']; unset($arr_update['equip_model']); } if (isset($arr_update['meditation'])) { if (!isset($player_detail['player_settings'])) { $player_detail = $objDetail->get_player_detail($player_id, array('player_settings')); } $player_settings = $player_detail['player_settings']; if (isset($player_settings[37]) && $player_settings[37] == 1) { $syn_item['meditation_status'] = 1; } elseif (isset($player_settings[38]) && $player_settings[38] == 1) { $syn_item['meditation_status'] = 2; } else { $syn_item['meditation_status'] = 0; } } # 冥想功能开启状态同步 if (isset($arr_update['meditation_open_status'])) { if (empty($arr_update['meditation_open_status'])) { $player_detail = $objDetail->get_player_detail($player_id, array('func_open')); } else { $player_detail = $arr_update['meditation_open_status']; } if (isset($player_detail['func_open']['44'])) { $syn_item['meditation_open_status'] = 1; } else { $syn_item['meditation_open_status'] = 0; } } if (isset($arr_update['equip_swallow'])) { $syn_item['equip_swallow'] = $arr_update['equip_swallow']; unset($arr_update['equip_swallow']); } if (isset($arr_update['equip_skill'])) { $syn_item['equip_skill'] = $arr_update['equip_skill']; unset($arr_update['equip_skill']); } // $log_skill = false; if (isset($arr_update['skill_infos'])) { //Com_Log::write("skill_infos.".$player_id,"player_info:".var_export($arr_update,true)); //Com_Log::write("skill_infos.".$player_id,"player_info:".var_export($playerInfo,true)); //Com_Log::write("skill_infos.".$player_id,"player_deatail:".var_export($player_detail,true)); $skill_infos = $objPlayerSkill->skill_list($player_id, $playerInfo, $player_detail); // Com_Log::write('sync_skill_infos.'.$player_id,var_export($skill_infos['skill_infos'],true)); $syn_item['skill_infos'] = $skill_infos['skill_infos']; // $log_skill = true; unset($arr_update['skill_infos']); } if (isset($arr_update['fairy_info'])) { $fairy_list = $objFairy->get_player_fairy_list($player_id); $syn_item['fairy_info'] = array(); if (!empty($fairy_list)) { foreach ($fairy_list as $keys => $val) { foreach ($val['combination_list'] as $value) { //获取有镶嵌的属性ID if ($value['state'] > 1) { $val['triggers'][] = $value['state']; } } $syn_item['fairy_info'][] = $val; } } unset($arr_update['fairy_info']); } if (isset($arr_update['hero_info'])) { $hero_list = $this->get_data('PlayerHero')->get_fight_hero($player_id); if ($hero_list) { list($hero_id1, $hero_code1) = each($hero_list); if ($hero_id1) { $hero_info = $this->get_game('Hero')->get_player_hero_attr($player_id, $hero_id1); $syn_item['hero_info'] = $hero_info; $syn_item['hero_code'] = $hero_code1; $syn_item['hero_state'] = 1; $syn_item['hero_level'] = $hero_info['hero_level']; $syn_item['hero_fit_level'] = $hero_info['fit']; } else { $syn_item['hero_code'] = 0; $syn_item['hero_state'] = 0; $syn_item['hero_info'] = array(); $syn_item['hero_fit_level'] = 0; } list($hero_id2, $hero_code2) = each($hero_list); if ($hero_id2) { $after_hero_info = $this->get_game('Hero')->get_player_hero_attr($player_id, $hero_id2); $syn_item['hero2_info'] = $after_hero_info; $syn_item['hero2_code'] = $hero_code2; $syn_item['hero2_state'] = 1; $syn_item['hero2_level'] = $after_hero_info['hero_level']; $syn_item['hero2_fit_level'] = $after_hero_info['fit']; } else { $syn_item['hero2_code'] = 0; $syn_item['hero2_state'] = 0; $syn_item['hero2_info'] = array(); $syn_item['hero2_fit_level'] = 0; } } else { $syn_item['hero_code'] = 0; $syn_item['hero_state'] = 0; $syn_item['hero_info'] = array(); $syn_item['hero_fit_level'] = 0; $syn_item['hero2_code'] = 0; $syn_item['hero2_state'] = 0; $syn_item['hero2_info'] = array(); $syn_item['hero2_fit_level'] = 0; } unset($arr_update['hero_info']); } if (isset($arr_update['dower_info'])) { if (!isset($player_detail['dower_info'])) { $player_detail = $objDetail->get_player_detail($player_id, array('dower_info')); } $syn_item['dower_info'] = $player_detail['dower_info']; unset($arr_update['dower_info']); } if (isset($arr_update['hook_settings'])) { if (empty($arr_update['hook_settings'])) { $player_detail = $objDetail->get_player_detail($player_id, array('hook_settings')); } else { $player_detail = $arr_update['hook_settings']; } $syn_item['hook_settings'] = $player_detail['hook_settings']; unset($arr_update['hook_settings']); } if (isset($arr_update['wing'])) { if (!isset($player_detail['equip_wing']) || !isset($player_detail['wing_info'])) { $player_detail = $objDetail->get_player_detail($player_id, array('equip_wing', 'wing_info')); } if ($player_detail['equip_wing'] && isset($player_detail['wing_info'][$player_detail['equip_wing']])) { $wing_table_task = $objPlayerWing->get_cache_table_data('player_wing_table', array('id' => $player_detail['wing_info'][$player_detail['equip_wing']]['id'], 'level' => $player_detail['wing_info'][$player_detail['equip_wing']]['lvl'])); $syn_item['wing'] = $wing_table_task[0]['avatar']; $syn_item['wing_skill_id'] = intval($player_detail['wing_info'][$player_detail['equip_wing']]['skill_id'][0]); $syn_item['wing_skill_id2'] = intval($player_detail['wing_info'][$player_detail['equip_wing']]['skill_id'][1]); $syn_item['wing_skill_id3'] = intval($player_detail['wing_info'][$player_detail['equip_wing']]['skill_id'][2]); } else { $syn_item['wing'] = ''; $syn_item['wing_skill_id'] = 0; $syn_item['wing_skill_id2'] = 0; $syn_item['wing_skill_id3'] = 0; } unset($arr_update['wing']); } ##################[同步当前任务]##################################### if (isset($arr_update['city_escort_map_sid'])) { $syn_item['city_escort_map_sid'] = $arr_update['city_escort_map_sid']; unset($arr_update['city_escort_map_sid']); } if (isset($arr_update['city_escort_target_x'])) { $syn_item['city_escort_target_x'] = $arr_update['city_escort_target_x']; unset($arr_update['city_escort_target_x']); } if (isset($arr_update['city_escort_target_y'])) { $syn_item['city_escort_target_y'] = $arr_update['city_escort_target_y']; unset($arr_update['city_escort_target_y']); } if (isset($arr_update['city_escort_npc_sid'])) { $syn_item['city_escort_npc_sid'] = $arr_update['city_escort_npc_sid']; unset($arr_update['city_escort_npc_sid']); } if (isset($arr_update['task_id'])) { $syn_item['task_id'] = $arr_update['task_id']; unset($arr_update['task_id']); } if (isset($arr_update['task_step'])) { $syn_item['task_step'] = $arr_update['task_step']; unset($arr_update['task_step']); } if (isset($arr_update['task_start_status'])) { $syn_item['task_start_status'] = $arr_update['task_start_status']; unset($arr_update['task_start_status']); } ##################[同步当前任务]####################################### #########################[竞技场同步]################################## if (isset($arr_update['dw'])) { $syn_item['dw'] = $arr_update['dw']; unset($arr_update['dw']); } if (isset($arr_update['dw_lv'])) { $syn_item['dw_lv'] = $arr_update['dw_lv']; unset($arr_update['dw_lv']); } if (isset($arr_update['score'])) { $syn_item['score'] = $arr_update['score']; unset($arr_update['score']); } if (isset($arr_update['dw_star'])) { $syn_item['dw_star'] = $arr_update['dw_star']; unset($arr_update['dw_star']); } #########################[竞技场同步]################################## if (isset($arr_update['potion_dh_cnt'])) { #修改直接回血药剂数量 $cur_data = SynPlayer::get_uval(); $cur_val = intval($cur_data[SynPlayer::POTION_DH_CNT]); $syn_item['potion_dh_cnt'] = $cur_val + intval($arr_update['potion_dh_cnt']); unset($arr_update['potion_dh_cnt']); } if (isset($arr_update['potion_hot_cnt'])) { #修改缓慢回血药剂数量 $cur_data = SynPlayer::get_uval(); $cur_val = intval($cur_data[SynPlayer::POTION_HOT_CNT]); $syn_item['potion_hot_cnt'] = $cur_val + intval($arr_update['potion_hot_cnt']); unset($arr_update['potion_hot_cnt']); } if (isset($arr_update['mp_potion_cnt'])) { #修改回蓝药剂数量 $cur_data = SynPlayer::get_uval(); $cur_val = intval($cur_data[SynPlayer::MP_POTION_CNT]); $syn_item['mp_potion_cnt'] = $cur_val + intval($arr_update['mp_potion_cnt']); unset($arr_update['mp_potion_cnt']); } if (isset($arr_update['light_fairy_name'])) { #光女神名字 $syn_item['light_fairy_name'] = $arr_update['light_fairy_name']; // Com_Log::write('light_fairy_name_'.$player_id,$arr_update['light_fairy_name']); unset($arr_update['light_fairy_name']); } if (isset($arr_update['dark_fairy_name'])) { #按女神名字 $syn_item['dark_fairy_name'] = $arr_update['dark_fairy_name']; // Com_Log::write('dark_fairy_name'.$player_id,$arr_update['dark_fairy_name']); unset($arr_update['dark_fairy_name']); } if (isset($arr_update['athena_remaining_count'])) { #守护女神次数 $syn_item['athena_remaining_count'] = $arr_update['athena_remaining_count']; unset($arr_update['athena_remaining_count']); } if (isset($arr_update['worldboss_remaining_count'])) { #世界boss次数 $syn_item['worldboss_remaining_count'] = $arr_update['worldboss_remaining_count']; unset($arr_update['worldboss_remaining_count']); } if (isset($arr_update['had_on_swings'])) { #已开启翅膀 $syn_item['had_on_swings'] = $arr_update['had_on_swings']; unset($arr_update['had_on_swings']); } if (isset($arr_update['trial_of_god_remaining_cnt'])) { #神之试炼当前剩余次数 $syn_item['trial_of_god_remaining_cnt'] = $arr_update['trial_of_god_remaining_cnt']; unset($arr_update['trial_of_god_remaining_cnt']); } if (isset($arr_update['is_hidden_vip'])) { #vip显示状态 $syn_item['is_hidden_vip'] = $arr_update['is_hidden_vip']; unset($arr_update['is_hidden_vip']); } if (isset($arr_update['mineral_remaining_count'])) { #抢矿剩余次数 $syn_item['mineral_remaining_count'] = $arr_update['mineral_remaining_count']; unset($arr_update['mineral_remaining_count']); } if (isset($arr_update['privilege_left_time'])) { #vip特权剩余时间 $syn_item['privilege_left_time'] = $arr_update['privilege_left_time']; unset($arr_update['privilege_left_time']); } if (isset($arr_update['kf_3vs3_remaining_count'])) { #跨服切磋次数 $syn_item['kf_3vs3_remaining_count'] = $arr_update['kf_3vs3_remaining_count']; unset($arr_update['kf_3vs3_remaining_count']); } //毁灭奥克兰次数 if (isset($arr_update['count_boss_oakland'])) { $syn_item['count_boss_oakland'] = $arr_update['count_boss_oakland']; unset($arr_update['count_boss_oakland']); } if (isset($arr_update['count_boss_oakland'])) { $syn_item['count_boss_oakland'] = $arr_update['count_boss_oakland']; unset($arr_update['count_boss_oakland']); } if (isset($arr_update['count_chest_oakland'])) { $syn_item['count_chest_oakland'] = $arr_update['count_chest_oakland']; unset($arr_update['count_chest_oakland']); } if (!empty($arr_update)) { // Com_Log::write("sync_publish.".$player_id,var_export($arr_update,true)); #Com_Log::write('nut','---1--'.json_encode($arr_update)); foreach ($arr_update as $key => $val) { $syn_item[$key] = $val; #先临时这样写 #Com_Log::write('nut','---3--'.json_encode($arr_update)); $currency_key = Cache_Currency::get_currency_key(); if (empty($val) && !in_array($key, $currency_key)) { if (!isset($player_info[$key])) { $player_info = $this->get_player_info($player_id); } $syn_item[$key] = $player_info[$key]; } else { $syn_item[$key] = $val; } if ($key == 'silver') { if ($player_id == 1895663) { Com_Log::write('xgame.p2c_part_update_tmp', json_encode($syn_item)); } $objPlayerAchieve->async_trigger_achieve_target($player_id, 23, $syn_item[$key], 2, $player_info['level']); //出发成就 } if ($key == 'gold') { $objPlayerAchieve->async_trigger_achieve_target($player_id, 25, $syn_item[$key], 4, $player_info['level']); } } } #Com_Log::debug_write("sync.".$player_id, "arr_update".json_encode($arr_update)); #Com_Log::debug_write("sync.".$player_id, "player_info".json_encode($player_info)); unset($objPlayerBase, $objFpowerCalc, $objPlayer, $objDetail, $objPlayerSkill, $objPlayerAchieve, $objFairy, $objHero, $objPlayerHero, $objPlayerWing); SynPlayer::set_syn_data($syn_item); $data = SynPlayer::get_data(); // if(isset($data['u'][225])){ // Com_Log::write('silver_'.$player_id,"silver:{$data['u'][225]}"); // } // if($log_skill){ // Com_Log::write('sync_skill_infos.'.$player_id,var_export($data['m'],true)); // Com_Log::write('sync_skill_infos.'.$player_id,var_export($data['u'],true)); // } Protocol::input($player_id, 7, 4, 417, array(0 => $data['m'], 1 => $data['u'])); Protocol::out($gateway); }
/** * C++推送过来的对手 转发给你前端 * @param $player_id * @param $server_id */ public function get_enemy($error_code, $query_id, $entity_id, $m_player_id, $dummy) { $out = array('error_code' => 0, 'query_id' => intval($query_id), 'entity_id' => $entity_id, 'role_id' => $m_player_id, 'role_name' => '', 'career_type' => 0, 'masks' => array(), 'values' => array(), 'dummy' => $dummy, 'cancel_cost' => '', 'rank' => 0, 'levels' => ''); Com_Log::write("get_enemy." . $m_player_id, "m_player_id:{$m_player_id}"); if ($error_code > 0) { #匹配对手失败 Protocol::input($m_player_id, 8, 12, 1220, array('result' => 0)); #让前端播放动画 发给前端 停止动画 Protocol_Msg::msg($m_player_id, 12013); $out['error_code'] = 1; return $out; } $player_info = $this->get_game('PlayerBase')->get_player_init_info($m_player_id); Com_Log::write("get_enemy." . $m_player_id, "player_info:" . var_export($player_info, true)); if (empty($player_info)) { //$player_info['level'] < 30 Protocol::input($m_player_id, 8, 12, 1220, array('result' => 0)); #让前端播放动画 发给前端 停止动画 Protocol_Msg::msg($m_player_id, 12015); $out['error_code'] = 1; return $out; } $out['role_name'] = $player_info['name']; $out['career_type'] = $player_info['career_type']; SynPlayer::set_syn_data($player_info); $synData = SynPlayer::get_data(); $out['masks'] = $synData['m']; $out['values'] = $synData['u']; $my_arena_info = $this->get_data('KFArena')->get_kf_arena_info($m_player_id); Com_Log::write("get_enemy." . $m_player_id, "my_arena_info:" . var_export($my_arena_info, true)); $kf_arena_conf = Cache_CrossArenaConf::getInstance()->get_conf(array('currency_cost_type', 'change_player_cost')); $change_player_cost = intval($kf_arena_conf['change_player_cost']['val']); $out['cancel_cost'] = $kf_arena_conf['currency_cost_type']['val'] . ":{$change_player_cost}"; if (!empty($my_arena_info)) { $out['rank'] = intval($my_arena_info['rank']); $out['levels'] = intval($my_arena_info['dw']) . ":" . intval($my_arena_info['dw_lv']) . ":" . intval($my_arena_info['dw_star']); } else { $out['rank'] = 0; $out['levels'] = "1:1:0"; } return $out; }