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); }