Example #1
0
 /**
  * 道具变更下行协议
  * @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);
     }
 }
Example #2
0
 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));
 }
Example #3
0
 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;
     }
 }
Example #4
0
 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;
 }
Example #5
0
 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;
 }
Example #6
0
 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;
 }
Example #7
0
 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;
 }
Example #8
0
 /**
  * 获取成就某勋章任务列表
  *
  */
 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;
 }
Example #9
0
 /**
  * 重新计算下装备下属性 在穿脱 强化身上的装备
  * @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;
 }
Example #10
0
 /**
  * 获取玩家可合成碎片列表
  * @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;
 }
Example #11
0
 /**
  * 获取道具展示
  * @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));
 }
Example #12
0
 /**
  * 获取道具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);
 }
Example #13
0
 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);
 }
Example #14
0
 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;
 }
Example #15
0
 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;
 }
Example #16
0
 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;
 }
Example #17
0
 /**
  * @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);
 }
Example #18
0
 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']));
 }
Example #19
0
 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;
 }
Example #20
0
 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);
     }
 }
Example #21
0
 /**
  * 格式化奖励
  * @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;
 }
Example #22
0
 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);
 }
Example #23
0
 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;
     }
 }
Example #24
0
 /**
  * 格式化奖励
  * @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;
 }
Example #25
0
 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;
 }
Example #26
0
 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;
     }
 }
Example #27
0
 /**
  * @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;
 }
Example #28
0
 /**
  * 获取邮件详细信息
  * @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;
 }
Example #29
0
 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']);
 }
Example #30
0
 /**
  * 装备模块的战力
  * @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);
 }