Пример #1
0
 public function prop_use_s2p($player_id, $item_sid, $item_unique_id, $count, $role_id)
 {
     //返回的数据结构
     $out = array('item_sid' => $item_sid, 'role_id' => $role_id, 'item_unique_id' => $item_unique_id, 'count' => $count, 'error_code' => 0, 'cooldown_msec' => 0);
     if ($item_sid == 0 && $item_unique_id == 'hot' || $item_sid == 0 && $item_unique_id == 'dh' || $item_sid == 0 && $item_unique_id == 'mp') {
         # 0缓慢回血药剂 或者  1直接回血药剂
         $res = $this->prop_use_by_drug($player_id, $item_unique_id);
         $out['error_code'] = intval($res['error_code']);
         $out['cooldown_msec'] = intval($res['cooldown_msec']);
         if (isset($res['item_sid'])) {
             $item_sid = $out['item_sid'] = $res['item_sid'];
         }
     } elseif ($item_sid > 0 && $item_unique_id == 'horn') {
         $res = $this->prop_use_by_prop_id($player_id, $item_sid, $count);
         $out['error_code'] = intval($res['error_code']);
         $out['cooldown_msec'] = intval($res['cooldown_msec']);
     } else {
         $res = $this->prop_use_by_ppid($player_id, $item_unique_id, $count);
         $out['error_code'] = intval($res['error_code']);
         $out['cooldown_msec'] = intval($res['cooldown_msec']);
     }
     if (!empty($this->_prop_log)) {
         Protocol_Prop::prop_806($player_id, $this->_prop_log);
     }
     $this->get_game('TaskTrigger')->async_trigger_task($player_id, 6, $item_sid, $count);
     //道具激活称号
     $this->get_game('PlayerAchieve')->prop_activate_title($player_id, $item_sid);
     return $out;
 }
Пример #2
0
 /**
  * @Purpose:
  * 批量删除英雄
  * @param $player_id 玩家ID
  * @param $hero_list 英雄列表(包括英雄ID,英雄品质)
  * @param $player_info 玩家信息
  */
 private function del_hero_list($player_id, $hero_list, $player_info)
 {
     if (Com_Array::is_good_arr($hero_list)) {
         $obj_player_hero_data = $this->get_data('PlayerHero');
         $obj_player_prop_data = $this->get_data('PlayerProp');
         $obj_player_bag_game = $this->get_game('PlayerBag');
         $time = time();
         foreach ($hero_list as $hero_id => $quality) {
             //获取英雄数据
             $hero_data = $obj_player_hero_data->get_player_hero_info($player_id, $hero_id);
             $hero_data['rune_hole_list'] = Com_FmtData::cus_json_decode($hero_data['rune_hole_list']);
             if ($hero_data['rune_hole_list']) {
                 foreach ($hero_data['rune_hole_list'] as $val) {
                     //如果英雄有镶嵌的符文,则卸下符文
                     if ($val['state'] == 2) {
                         $rune_data = $obj_player_prop_data->get_player_prop_detail($player_id, $val['id']);
                         if ($rune_data) {
                             $empty_pos = $this->get_game('Prop')->get_empty_pos($player_id, 1);
                             if ($empty_pos === false) {
                                 $this->throw_error('80001');
                                 //包裹已满
                             }
                             $obj_player_bag_game->prop_set_position($rune_data, $this->bag_pos, $empty_pos[0]);
                             //创建更变数据
                             $rune_data['item_position'] = $this->bag_pos;
                             $rune_data['grid'] = $empty_pos[0];
                             $rtn_data[] = $rune_data;
                             Protocol_Prop::prop_806($player_id, $rtn_data);
                         }
                     }
                 }
             }
             //删除英雄
             $hero_del_res = $obj_player_hero_data->delete_player_hero($player_id, $hero_id, $quality);
             if (!$hero_del_res) {
                 $this->throw_error('10104');
             }
             $this->get_data('RankList')->del_hero_from_rank($hero_id);
             //更新英雄培养数据
             #$this->update_hero_culture_data($player_id, 0, $hero_data['hero_code']);
             #更新日志
             $log_data = array('player_id' => $player_id, 'channel' => 18, 'server_id' => SERVER_ID, 'operator_id' => OPERATOR_ID, 'player_level' => $player_info['level'], 'vip_level' => $player_info['vip'], 'vip_special_level' => $player_info['privilege_level'], 'type' => 5, 'cmd_id' => 512, 'item_id' => $hero_id, 'item_name' => $hero_data['name'], 'item_quality' => $quality, 'item_level' => $hero_data['level'], 'item_num' => 1, 'add_time' => $time);
             Log_Common::getInstance()->add_log($log_data);
         }
     }
 }
Пример #3
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;
 }
Пример #4
0
 /**
  * 出售道具
  * @param $player_id
  * @param $player_prop_id
  * @return array
  */
 public function sell_item($player_id, $player_prop_id, $sell_price, $sell_num)
 {
     $prop = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $player_prop_id);
     if (empty($prop) || $sell_num <= 0 || $sell_num > $prop['item_num']) {
         $this->throw_error('80913');
         //道具不存在
     }
     if (intval($prop['bind_flag']) == 0) {
         $this->throw_error('71613');
         //道具已经绑定不能出售
     }
     $prop_config = Cache_Prop::getInstance()->get_prop_info($prop['prop_id']);
     if ($sell_price < $prop_config['reference_price'] / 2) {
         $this->throw_error('71605');
         //出售价格出错
     }
     if ($sell_price > $prop_config['reference_price'] * 1.5) {
         $this->throw_error('71612');
         //出售价格出错
     }
     $max_sell_num = $this->get_data('Auction')->get_player_max_sell_num($player_id);
     if ($max_sell_num >= $this->_max_sell_num) {
         $this->throw_error('71607');
         //拍卖道具已经达到上限
     }
     $player_info = $this->get_data('Player')->get_player_info($player_id, array('name', 'level', 'vip', 'silver', 'privilege_level'));
     $has_silver = $player_info['silver'];
     $need_silver = ceil($sell_price * $sell_num * 150);
     if ($need_silver > $has_silver) {
         $this->throw_error('10113');
         //金币不足
     }
     $this->get_data('Player')->check_player_resource($player_id, $player_info, "-", 'silver', $need_silver);
     $add_data['player_id'] = $player_id;
     $add_data['player_name'] = $player_info['name'];
     $add_data['quality'] = $prop['quality'];
     $add_data['type'] = $prop['type'];
     $add_data['sub_type'] = $prop['sub_type'];
     $sell_prop = $prop;
     $sell_prop['item_num'] = $sell_num;
     $add_data['prop_info'] = json_encode($sell_prop);
     $add_data['sell_price'] = $sell_price * $sell_num;
     $add_data['server_id'] = SERVER_ID;
     $add_data['server_name'] = SHOW_TITLE;
     $this->start_trans();
     $result = $this->get_data('Auction')->add_auction($add_data);
     $auction_id = 0;
     if ($result) {
         $auction_id = $result;
         $player_info['cmd_id'] = 773;
         $result = $this->get_data('PlayerProp')->update_prop_num($player_id, $prop, $sell_num, "-", $player_info);
     }
     if ($result) {
         $result = $this->get_data('Player')->update_player_resource($player_id, $player_info, 773);
     }
     if ($result) {
         $this->commit();
         $prop['item_num'] = $prop['item_num'] - $sell_num;
         Protocol_Prop::prop_806($player_id, array(0 => $prop));
         //出售日志
         Log_Trade::getInstance()->add_trade_log($player_id, $player_info['level'], $player_info['vip'], $player_info['privilege_level'], 1, $prop['prop_id'], $prop_config['name'], $prop['quality'], $sell_num, $sell_num, $prop['level'], $prop, 3, $need_silver);
         #引导任务
         $this->get_game('TaskTrigger')->async_trigger_guide_task($player_id, 23, 1);
         $prop = array('auction_id' => $auction_id, 'prop' => Struct_Prop::get_prop_struct($sell_prop), 'time' => $this->_past_due, 'sell_price' => $add_data['sell_price'] / $sell_num);
         return array('result' => 1, 'prop' => $prop);
     }
     return array('result' => 0, 'prop' => array());
 }
Пример #5
0
 public function active_dower($player_id, $dower_id)
 {
     $this->get_game('PlayerFunc')->get_func_is_open($player_id, $this->func_id_dower);
     $this->param_check_numeric(array($player_id, $dower_id));
     $player_info = $this->get_data('Player')->get_player_info($player_id, array('career_type', 'level', 'vip', 'privilege_level', 'crystal'));
     # 更新等级和修改时间
     $active_dower_list = $this->get_data('PlayerDower')->get_player_dower($player_id);
     $before_level = isset($active_dower_list[$dower_id]) ? $active_dower_list[$dower_id]['dower_lv'] : 0;
     if (isset($active_dower_list[$dower_id])) {
         $active_dower_list[$dower_id]['dower_lv'] += 1;
         $active_dower_list[$dower_id]['mod_time'] = $this->current_time;
     } else {
         $active_dower_list[$dower_id] = array('dower_id' => $dower_id, 'dower_lv' => 1, 'player_id' => $player_id, 'mod_time' => $this->current_time);
     }
     # 获取天赋配置信息
     $dower_info = Cache_Dower::getInstance()->get_dower_info($dower_id, $active_dower_list[$dower_id]['dower_lv'], 1);
     if ($player_info['level'] < $dower_info['unlock']) {
         $this->throw_error('80605');
         # 玩家等级不足
     }
     $this->start_trans();
     # 消耗魔晶
     if (!empty($dower_info['cost_crystal'])) {
         $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', 'crystal', $dower_info['cost_crystal'], 1);
         $re = $this->get_data('Player')->update_player_resource($player_id, $player_info, '613');
         $this->write_check($re, 3010895);
     }
     # 消耗材料
     if (!empty($dower_info['item_id']) && !empty($dower_info['item_num'])) {
         # deduct_prop_by_prop_id方法中有判断道具是否足够,故外层不判断
         $arr_logs_consume = array();
         $log_param = array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'privilege_level' => $player_info['privilege_level'], 'cmd_id' => 613);
         $re = $this->get_game('Prop')->deduct_prop_by_prop_id($player_id, $dower_info['item_id'], $dower_info['item_num'], $arr_logs_consume, 0, $log_param);
         $this->write_check($re, 3010904);
     }
     # 更新玩家已激活天赋信息
     $re = $this->get_data('PlayerDower')->update_player_dower($player_id, $active_dower_list[$dower_id]);
     $this->write_check($re, 3010909);
     # 获取玩家已经启用的天赋信息
     $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';
     $player_detail = $this->get_data('PlayerDetail')->get_player_detail($player_id, $get_field);
     $player_detail['dower_info'][$dower_id] = array('slot_idx' => 0, 'dower_id' => $dower_id, 'dower_lv' => $active_dower_list[$dower_id]['dower_lv']);
     $re = $this->get_data('PlayerDetail')->update_player_detail($player_id, array('dower_info' => $player_detail['dower_info']));
     $this->write_check($re, 3010915);
     $this->commit();
     #引导任务
     #if (empty($before_level)) { # 激活才触发,升级不触发
     $this->get_game('TaskTrigger')->async_trigger_guide_task($player_id, 13, 1);
     # 升级也算
     #}
     # --------------------------------------------------------------------
     # 806同步道具变更
     # --------------------------------------------------------------------
     $ndata = array();
     if (!empty($arr_logs_consume)) {
         foreach ($arr_logs_consume as $k => $v) {
             # 消耗的道具
             $ndata[] = $v;
         }
     }
     Protocol_Prop::prop_806($player_id, $ndata);
     # --------------------------------------------------------------------
     # 脏数据同步
     # --------------------------------------------------------------------
     //同步人物属性
     $arr_part_update['dower_info'] = '';
     $arr_part_update['player_data'] = array('player_detail' => $player_detail, 'player' => array('career_type' => $player_info['career_type'], 'level' => $player_info['level']));
     Protocol_Player::p2c_part_update($player_id, $arr_part_update);
     $out_613 = array('dower_id' => $dower_id, 'dower_lv' => $active_dower_list[$dower_id]['dower_lv']);
     # 成就相关埋点
     $this->handle_dower_refer_achieve($player_id);
     # 旧的仍然保留
     $achieve_val = "1:" . $active_dower_list[$dower_id]['dower_lv'] . ":" . $dower_id;
     $this->get_game('PlayerAchieve')->async_trigger_achieve_target($player_id, 48, $achieve_val, 4);
     # --------------------------------------------------------------------
     # 游戏日志记录
     # --------------------------------------------------------------------
     $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, 'dower_id' => $dower_id, 'dower_name' => $dower_info['name'], 'before_level' => $before_level, 'after_level' => $active_dower_list[$dower_id]['dower_lv']);
     Log_Skill::getInstance()->add_log($log_info, 'dower');
     return $out_613;
 }
Пример #6
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;
     }
 }
Пример #7
0
 private function _train_handle($flag, $player_id, $cost_item_id, $cost_item_num, $player_item_num, $cost_silver_num, $cost_gold_num, &$player_info, &$fairy_info, $auto_buy, $improve_flag)
 {
     $this->start_trans();
     # 成功
     if ($flag) {
         $fairy_info['train_level'] += 1;
         #最新的强化信息
         $newTrainConfigs = $this->get_cache_table_data('fairy_train_table', array("lvl" => $fairy_info['train_level']));
         $train_attr = $fairy_info['train_attr'];
         if (!empty($newTrainConfigs[0]['attribute_add'])) {
             $add_attr = explode("|", $newTrainConfigs[0]['attribute_add']);
             foreach ($add_attr as $val) {
                 $attr = explode(":", $val);
                 if (!empty($attr)) {
                     $train_attr[$attr[0]] += $attr[1];
                 }
             }
         }
         $fairy_info['train_attr'] = json_encode($train_attr);
         #组装更新字段
         $update_data['train_level'] = $fairy_info['train_level'];
         $update_data['train_attr'] = $fairy_info['train_attr'];
         # 强化信息更新
         if (!empty($update_data)) {
             $affectedRows = $this->get_data('Fairy')->update_player_fairy($fairy_info['fairy_id'], $update_data);
             if (!$affectedRows) {
                 $this->throw_error('10104');
             }
         }
         $fairy_fight = $this->calc_fight($fairy_info);
         #更新玩家表精灵战斗力
         if ($fairy_info['state'] == 1 && $fairy_fight > 0) {
             $update_player_res = $this->get_data('Player')->update_player_info($player_id, array('fairy_fpower' => $fairy_fight));
             if (!$update_player_res) {
                 $this->throw_error('10104');
             }
         }
         #同步更新玩家表精灵属性redis,SQL数据
         $update_player_detail_res = $this->update_player_detail_fairy_attr($player_id, $fairy_info['type'], $fairy_info, $train_attr);
         if (!$update_player_detail_res) {
             $this->throw_error('10104');
         }
         if ($fairy_fight > 0) {
             $this->get_data('RankList')->update_fairy_rank($fairy_info['fairy_id'], $fairy_fight);
         }
     }
     # 玩家金币更新
     if ($cost_silver_num > 0) {
         $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', 'silver', $cost_silver_num, 1, 1);
         $re = $this->get_data('Player')->update_player_resource($player_id, $player_info, '536');
         $this->write_check($re);
     }
     # 提高成功率,玩家钻石更新
     if ($cost_gold_num > 0) {
         $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', 'gold', $cost_gold_num, 1, 0);
         $re = $this->get_data('Player')->update_player_resource($player_id, $player_info, '536');
         $this->write_check($re);
     }
     # 消耗女神之泪和钻石【勾选自动购买时当所需女神之泪不足时需要消耗钻石】
     $cost_num = $cost_item_num;
     $cost_currency_type = 0;
     $cost_currency_value = 0;
     $price = 0;
     if ($auto_buy) {
         if ($player_item_num < $cost_item_num) {
             $cost_num = $player_item_num;
             # 获取正确的女神之泪的单价
             $item_info = $this->get_game('Shop')->shortcut_purchase_interface($cost_item_id, 1);
             if (empty($item_info['item_price'])) {
                 $this->throw_error('80318');
                 # 商城强化宝石没有配置价格
             }
             # 策划价格配置多项时,选其中一项
             foreach ($item_info['item_price'] as $cur_type => $cur_val) {
                 $price = $cur_val;
                 $cost_currency_type = $cur_type;
                 $cost_currency_value = intval($cur_val * ($cost_item_num - $player_item_num));
             }
         }
     }
     # 将玩家包裹里的道具消耗完毕
     if ($cost_num > 0) {
         $log_param = array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'privilege_level' => $player_info['privilege_level'], 'cmd_id' => 536);
         $arr_logs_item = array();
         $re = $this->get_game('Prop')->deduct_prop_by_prop_id($player_id, $cost_item_id, $cost_num, $arr_logs_item, 0, $log_param);
         $this->write_check($re);
     }
     # 消耗虚拟货币
     $arr_consume = array();
     if ($cost_currency_value > 0) {
         if (in_array($cost_currency_type, array(2, 4))) {
             $ticket = 0;
             $gold = $cost_currency_value;
             if ($player_info['ticket'] > 0) {
                 if ($player_info['ticket'] >= $cost_currency_value) {
                     $ticket = $cost_currency_value;
                     $gold = 0;
                 } else {
                     $ticket = $player_info['ticket'];
                     $gold = $cost_currency_value - $player_info['ticket'];
                 }
             }
             $arr_consume = array('price' => $price, 'gold' => $gold, 'ticket' => $ticket, 'count' => $cost_item_num - $player_item_num);
         }
         $cost_currency_key = Cache_Currency::getInstance()->get_key($cost_currency_type);
         $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $cost_currency_key, $cost_currency_value, 1, 1);
         $re = $this->get_data('Player')->update_player_resource($player_id, $player_info, '536', array(), $arr_consume);
         $this->write_check($re);
     }
     #强化失败,返还一半的金币消耗
     //		if(!$flag){
     //			$call_back_silver = floor($cost_silver_num/2);
     //			if($call_back_silver>0){
     //				$reward_info[] = array('type' => 'silver', 'item_id' => 3, 'item_num' => $call_back_silver);
     //				$result = $this->get_game('Reward')->send_reward($player_id, $reward_info, array('cmd_id'=>'5361'), 1);
     //				if($result !== true){
     //					$this->throw_error('10104');
     //				}
     //			}
     //		}
     $this->commit();
     # 若有购买缺少材料,记录虚假商城购买日志
     if ($cost_currency_value > 0) {
         $this->get_game('Shop')->add_dummy_shop_log($player_id, $player_info, $cost_item_id, intval($cost_item_num - $player_item_num), $cost_currency_type, $cost_currency_value, 536);
     }
     if (!$flag) {
         $this->get_game('Reward')->add_reward_log(false);
     }
     # 粘806 + 通知道具变更信息
     $ndata = array();
     if (!empty($arr_logs_item)) {
         foreach ($arr_logs_item as $k => $v) {
             # 消耗的女神之泪
             $ndata[] = $v;
         }
     }
     Protocol_Prop::prop_806($player_id, $ndata);
     return true;
 }
Пример #8
0
 /**
  * 一键出售道具
  * @param $player_id
  * @return array
  * @throws Exception]
  */
 public function batch_sell_prop($player_id)
 {
     $sell_id = array();
     $objPlayerPropData = $this->get_data('PlayerProp');
     $prop_list = $objPlayerPropData->get_player_prop_by_item_position($player_id);
     //冲从包裹取出道具
     if ($prop_list) {
         $props = array();
         foreach ($prop_list as $prop) {
             $props[] = $prop['prop_id'];
         }
         $prop_configs = Cache_Prop::getInstance()->get_prop_info($props);
         foreach ($prop_list as $key => $prop) {
             if ($prop_configs[$prop['prop_id']]['type'] == 3 && $prop_configs[$prop['prop_id']]['sub_type'] == 21 && $prop_configs[$prop['prop_id']]['quality'] <= 4) {
                 $sell_id[$prop['player_prop_id']] = $prop;
             } elseif ($prop_configs[$prop['prop_id']]['type'] == 1 && $prop_configs[$prop['prop_id']]['sub_type'] <= 12 && $prop_configs[$prop['prop_id']]['quality'] <= 2) {
                 $sell_id[$prop['player_prop_id']] = $prop;
             }
         }
     }
     if ($sell_id) {
         $get_silver = 0;
         foreach ($sell_id as $prop) {
             if ($prop_configs[$prop['prop_id']]['sale_price'] > 0) {
                 $get_silver += $prop_configs[$prop['prop_id']]['sale_price'] * $prop['item_num'];
             }
         }
         if ($get_silver) {
             $player_info = $this->get_data('Player')->get_player_info($player_id, array('level', 'vip', 'silver', 'privilege_level'));
             $this->get_data('Player')->check_player_resource($player_id, $player_info, "+", 'silver', $get_silver);
             $result = true;
             $objPlayerPropData->start_watch($player_id);
             $this->start_trans();
             $log_param = array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'cmd_id' => 804);
             foreach ($sell_id as $player_prop_id => $val) {
                 $result = $objPlayerPropData->update_prop_num($player_id, $val, $val['item_num'], "-", $log_param);
                 $sell_id[$player_prop_id] = 0;
                 if (!$result) {
                     $this->throw_error(80003, '10180062601');
                 }
             }
             if ($result) {
                 $result = $this->get_data('Player')->update_player_resource($player_id, $player_info, 804);
             }
             if ($result) {
                 Com_AdCache::set_pipe(false);
                 $this->commit();
                 $out['result'] = 1;
                 $out['item'] = array('pos' => 1, 'index' => array());
                 $asyData = array();
                 foreach ($sell_id as $arr_prop_detail) {
                     $out['item']['index'][] = $arr_prop_detail['grid'];
                 }
                 $out['silver'] = Cache_Currency::getInstance()->get_index('silver') . ":" . $get_silver;
                 Protocol_Prop::prop_806($player_id, $sell_id);
                 return $out;
             }
         }
     }
     return array('result' => 1, array());
 }
Пример #9
0
 public function enhanced_refine($player_id, $player_prop_id, $refine_attr_seq, $add_success_rate)
 {
     #$this->get_game('PlayerFunc')->get_func_is_open($player_id, $this->func_id_enhanced_refine);
     $this->param_check_numeric(array($player_id, $refine_attr_seq));
     $player_info = $this->get_data('Player')->get_player_info($player_id, Com_Util::get_player_fields(array('currency', 'level', 'vip', 'privilege_level')));
     $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_850 = array('player_prop_id' => $player_prop_id, 'result' => 0);
     # 洗练属性检查
     if (empty($player_equip_info['refine_info'])) {
         $this->throw_error('81008');
         # 洗练属性为空,不能精炼
     }
     # 获取洗练属性key
     /**
     		foreach ($player_equip_info['refine_info']['attr_info'] as $attr_seq => $attr_info) {
     			if ($attr_info['attr_seq'] == $refine_attr_seq) {
     				$en_refine_attr_key = $attr_info['attr_key'];
     				break;
     			}
     		}
     		**/
     if (!isset($player_equip_info['refine_info']['attr_info'][$refine_attr_seq])) {
         $this->throw_error('81009');
         # 精炼属性异常,选择的精炼属性不存在
     }
     $refine_info = $player_equip_info['refine_info'];
     $refine_attr = $player_equip_info['refine_attr'];
     $en_refine_attr_value_current_lv = $refine_info['attr_info'][$refine_attr_seq]['en_refine_success_num'] * ceil($refine_info['attr_info'][$refine_attr_seq]['attr_limit'] / $refine_info['attr_info'][$refine_attr_seq]['attr_section']);
     if ($refine_info['attr_info'][$refine_attr_seq]['en_refine_lv'] >= $player_equip_info['level'] && $en_refine_attr_value_current_lv >= $refine_info['attr_info'][$refine_attr_seq]['attr_limit']) {
         $this->throw_error('81010');
         # 精炼属性已满
     }
     # 计算成功率 + 货币消耗
     $refine_info_mod = $this->get_en_refine_success_rate_and_cost_currency($refine_info);
     list($cost_currency_type, $cost_currency_value) = explode(":", $refine_info_mod['attr_info'][$refine_attr_seq]['en_refine_cost_currency']);
     if ($add_success_rate) {
         $refine_info_mod['en_refine_success_rate'] += $this->add_success_rate;
     }
     $before_refine_attr = isset($player_equip_info['refine_attr']) ? $player_equip_info['refine_attr'] : array();
     $before_refine_info = isset($player_equip_info['refine_info']) ? $player_equip_info['refine_info'] : array();
     # 更新洗练属性 + 消耗货币
     $this->start_trans();
     $success_flag = false;
     if (Com_Random::probability($refine_info_mod['attr_info'][$refine_attr_seq]['en_refine_success_rate'], 10000)) {
         if ($refine_info_mod['attr_info'][$refine_attr_seq]['attr_section']) {
             $delta = ceil($refine_info_mod['attr_info'][$refine_attr_seq]['attr_limit'] / $refine_info_mod['attr_info'][$refine_attr_seq]['attr_section']);
         } else {
             $delta = 0;
         }
         $refine_info['attr_info'][$refine_attr_seq]['en_refine_attr_value'] += $delta;
         if ($refine_info['attr_info'][$refine_attr_seq]['en_refine_attr_value'] > $refine_info['attr_info'][$refine_attr_seq]['attr_stint']) {
             $refine_info['attr_info'][$refine_attr_seq]['en_refine_attr_value'] = $refine_info['attr_info'][$refine_attr_seq]['attr_stint'];
         }
         $refine_info['attr_info'][$refine_attr_seq]['en_refine_success_num'] += 1;
         $refine_info['attr_info'][$refine_attr_seq]['en_refine_failed_cont'] = 0;
         $refine_info['attr_info'][$refine_attr_seq]['attr_value'] = $refine_info['attr_info'][$refine_attr_seq]['refine_attr_value'] + $refine_info['attr_info'][$refine_attr_seq]['en_refine_attr_value'];
         # 升级
         $en_refine_lv_stint = $this->get_en_refine_lv_stint($player_equip_info['level']);
         $en_refine_attr_value_current_lv = $refine_info['attr_info'][$refine_attr_seq]['en_refine_success_num'] * ceil($refine_info['attr_info'][$refine_attr_seq]['attr_limit'] / $refine_info['attr_info'][$refine_attr_seq]['attr_section']);
         if ($refine_info['attr_info'][$refine_attr_seq]['en_refine_lv'] < $en_refine_lv_stint && $en_refine_attr_value_current_lv >= $refine_info['attr_info'][$refine_attr_seq]['attr_limit']) {
             # 获取精练属性基础值
             $attr_value_info_en_refine_old = Cache_Refine::getInstance()->get_attr_value_info($refine_info['attr_info'][$refine_attr_seq]['en_refine_lv']);
             $refine_info['attr_info'][$refine_attr_seq]['en_refine_lv'] += $this->en_refine_lv_delta;
             $attr_value_info_en_refine = Cache_Refine::getInstance()->get_attr_value_info($refine_info['attr_info'][$refine_attr_seq]['en_refine_lv']);
             if (empty($attr_value_info_en_refine)) {
                 $this->throw_error('81011');
                 # 获取洗练属性值配置失败
             }
             $attr_key = $refine_info['attr_info'][$refine_attr_seq]['attr_key'];
             $attr_ratio = $refine_info['attr_info'][$refine_attr_seq]['attr_ratio'];
             $refine_info['attr_info'][$refine_attr_seq]['attr_limit'] = ceil(($attr_value_info_en_refine[$attr_key] - $attr_value_info_en_refine_old[$attr_key]) * ($attr_ratio / 10000));
             $en_refine_conf = Cache_Refine::getInstance()->get_equip_enhanced_refine_base_info($refine_info['attr_info'][$refine_attr_seq]['en_refine_lv']);
             $refine_info['attr_info'][$refine_attr_seq]['attr_section'] = $en_refine_conf['section'];
             $refine_info['attr_info'][$refine_attr_seq]['en_refine_success_num'] = 0;
         }
         $refine_attr[$refine_attr_seq] = array($refine_info['attr_info'][$refine_attr_seq]['attr_key'] => $refine_info['attr_info'][$refine_attr_seq]['attr_value']);
         $out_850['result'] = 1;
         $success_flag = true;
     } else {
         $refine_info['attr_info'][$refine_attr_seq]['en_refine_failed_cont'] += 1;
         # 连续失败精炼次数
     }
     $cost_currency_key = Cache_Currency::getInstance()->get_key($cost_currency_type);
     $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $cost_currency_key, $cost_currency_value, 1, 1);
     if ($add_success_rate) {
         $cost_currency_key_other = Cache_Currency::getInstance()->get_key($this->add_success_rate_cost_cur_type);
         $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $cost_currency_key_other, $this->add_success_rate_cost_cur_value, 1, 0);
     }
     $re = $this->get_data('Player')->update_player_resource($player_id, $player_info, '850');
     $this->write_check($re, 3010132);
     $update_field = array('refine_attr' => $refine_attr, 'refine_info' => $refine_info);
     $re = $this->get_data('PlayerProp')->update_player_prop($player_equip_info, $update_field);
     $this->write_check($re, 3010414);
     $this->commit();
     # 提示购买成功消息
     if ($success_flag) {
         $message = array('texts' => array(array('code' => 81014, 'content' => array(), 'params' => array(array(array('txt' => '', 'type' => 6, 'value' => $refine_info['attr_info'][$refine_attr_seq]['attr_key'], 'param' => '')), array(array('txt' => '', 'type' => 7, 'value' => $refine_info['attr_info'][$refine_attr_seq]['attr_value'] - $before_refine_info['attr_info'][$refine_attr_seq]['attr_value'], 'param' => ''))))), 'delay' => 0);
     } else {
         $message = array('texts' => array(array('code' => 81015, 'content' => array(), 'params' => array())), 'delay' => 0);
     }
     Protocol::input($player_id, 3, 7, 742, $message);
     # --------------------------------------------------------------------
     # 游戏日志记录
     # --------------------------------------------------------------------
     $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_id, 'item_id_master' => $player_equip_info['prop_id'], 'item_type' => $player_equip_info['type'], 'item_sub_type' => $player_equip_info['sub_type'], 'item_quality' => $player_equip_info['quality'], 'item_level' => $player_equip_info['level'], 'item_star_level' => $player_equip_info['star_level'], 'item_position' => $player_equip_info['item_position'], 'action_type' => 2, 'before_refine_attr' => $before_refine_attr, 'after_refine_attr' => $player_equip_info['refine_attr'], 'before_refine_info' => $before_refine_info, 'after_refine_info' => $player_equip_info['refine_info']);
     Log_Forge::getInstance()->add_log($log_info, 'refine');
     # 刷新玩家属性
     if ($player_equip_info['item_position'] == 3) {
         $this->get_game('EquipAttr')->equip_attr($player_id);
     }
     # 粘806 + 通知道具变更信息
     $player_equip_info['refine_attr'] = $update_field['refine_attr'];
     $player_equip_info['refine_info'] = $update_field['refine_info'];
     $ndata = array($player_equip_info);
     Protocol_Prop::prop_806($player_id, $ndata);
     $out_849 = $this->get_enhanced_refine_info($player_id, $player_prop_id, $refine_attr_seq);
     Protocol::input($player_id, 3, 8, 849, $out_849);
     return $out_850;
 }
Пример #10
0
 public function 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'));
     # 828展示协议返回数据,828协议需要写死传回已配置的所有吞噬属性,即便当前道具尚未有激活任意项吞噬属性,也需要用初始值填充
     $out_828 = array('player_ppid' => $player_prop_id, 'swallow_ppids' => $swallow_equips, 'swallow_list' => 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);
     if (empty($player_prop_info)) {
         $this->throw_error('80013');
         //玩家没有该装备!
     }
     # 获取允许吞噬的装备子类型列表
     list($allow_swallow_sub_type, $allow_swallow_id) = $this->get_swallow_restriction_info($player_prop_info['sub_type']);
     # 828展示协议返回数据,828协议需要写死传回已配置的所有吞噬属性,即便当前道具尚未有激活任意项吞噬属性,也需要用初始值填充
     $distinct_swallow_list = Cache_Forge::getInstance()->get_distinct_swallow_list();
     foreach ($distinct_swallow_list as $swallow_info) {
         if (!empty($allow_swallow_id) && !in_array($swallow_info['swallow_id'], $allow_swallow_id)) {
             continue;
         }
         $out_828['swallow_list'][$swallow_info['swallow_id']] = array('swallow_id' => $swallow_info['swallow_id'], 'swallow_lv' => 0, 'swallow_exp' => 0);
     }
     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_828['swallow_ppids'] = "";
             return $out_828;
         }
     }
     # 计算吞噬属性最大等级
     $swallow_lv_max = $this->get_swallow_lv_max($player_prop_info['level']);
     $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['swallow_info']) ? array() : $player_prop_info['swallow_info'];
     $player_prop_id_slave = "";
     $item_id_slave = "";
     $onekey_prop_list = array();
     # 保存允许一键吞噬的装备ID列表
     $full_level_flag = false;
     # 是否满级,一键吞噬区分报错信息用
     foreach ($swallow_equips as $pprop_id) {
         if (!empty($type)) {
             # 实际吞噬
             if (!empty($allow_swallow_sub_type) && !in_array($player_prop_details[$pprop_id]['sub_type'], $allow_swallow_sub_type)) {
                 $this->throw_error('80036');
                 # 被吞噬装备包含不允许吞噬的非法装备类型
             }
             if ($player_prop_details[$pprop_id]['quality'] >= 4) {
                 # 品质>=4的装备不允许被吞噬,秋水确定于20150811
                 $this->throw_error('80036');
                 # 被吞噬装备包含不允许吞噬的非法装备类型
             }
             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 (!empty($player_prop_details[$pprop_id]['inlay_gems'])) {
                 $this->throw_error('80041');
                 # 被吞噬装备镶嵌有宝石
             }
             if (!empty($player_prop_details[$pprop_id]['star_map_id'])) {
                 $this->throw_error('80042');
                 # 被吞噬装备镶嵌有觉醒石
             }
             $item_swallow_info = Cache_Forge::getInstance()->get_swallow_map_config($player_prop_details[$pprop_id]['sub_type'], $player_prop_details[$pprop_id]['quality']);
             if (empty($item_swallow_info)) {
                 $this->throw_error('80025');
                 # 该装备子类型没有配置对应的吞噬属性信息!
             }
             if (empty($item_swallow_info['swallow_id'])) {
                 $this->throw_error('80026');
                 # 获取吞噬属性类型失败
             }
             $exp_revise_info = Cache_Forge::getInstance()->get_swallow_exp_revise_config($player_prop_details[$pprop_id]['star_level']);
             if (empty($exp_revise_info) || empty($exp_revise_info['revise_ratio'])) {
                 $this->throw_error('80044');
                 # 获取吞噬经验修正配置失败
             }
         } else {
             # 非实际吞噬
             if (!empty($onekey)) {
                 # 一键勾选
                 if (!empty($allow_swallow_sub_type) && !in_array($player_prop_details[$pprop_id]['sub_type'], $allow_swallow_sub_type)) {
                     continue;
                 }
                 if ($player_prop_details[$pprop_id]['quality'] >= 4) {
                     # 品质>=4的装备不允许被吞噬,秋水确定于20150811
                     continue;
                 }
                 if (empty($player_prop_details[$pprop_id])) {
                     continue;
                 }
                 if (Com_Util::is_first_charge_item($player_prop_details[$pprop_id]['prop_id'])) {
                     continue;
                 }
                 if (!empty($player_prop_details[$pprop_id]['inlay_gems'])) {
                     continue;
                 }
                 if (!empty($player_prop_details[$pprop_id]['star_map_id'])) {
                     continue;
                 }
                 $item_swallow_info = Cache_Forge::getInstance()->get_swallow_map_config($player_prop_details[$pprop_id]['sub_type'], $player_prop_details[$pprop_id]['quality']);
                 if (empty($item_swallow_info) || empty($item_swallow_info['swallow_id'])) {
                     continue;
                 }
                 $exp_revise_info = Cache_Forge::getInstance()->get_swallow_exp_revise_config($player_prop_details[$pprop_id]['star_level']);
                 if (empty($exp_revise_info) || empty($exp_revise_info['revise_ratio'])) {
                     continue;
                 }
             } else {
                 # 单项勾选,单次勾选获取吞噬信息需要弹提示属性满的消息,但不能阻断程序执行,只能跳出循环
                 if (!empty($allow_swallow_sub_type) && !in_array($player_prop_details[$pprop_id]['sub_type'], $allow_swallow_sub_type)) {
                     $message = array('texts' => array(array('code' => 80036, 'content' => array(), 'params' => array())), 'delay' => 0);
                     Protocol::input($player_id, 3, 7, 742, $message);
                     # 被吞噬装备包含不允许吞噬的非法装备类型
                     break;
                 }
                 if ($player_prop_details[$pprop_id]['quality'] >= 4) {
                     # 品质>=4的装备不允许被吞噬,秋水确定于20150811
                     $message = array('texts' => array(array('code' => 80036, 'content' => array(), 'params' => array())), 'delay' => 0);
                     Protocol::input($player_id, 3, 7, 742, $message);
                     # 被吞噬装备包含不允许吞噬的非法装备类型
                     break;
                 }
                 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 (!empty($player_prop_details[$pprop_id]['inlay_gems'])) {
                     $message = array('texts' => array(array('code' => 80041, 'content' => array(), 'params' => array())), 'delay' => 0);
                     Protocol::input($player_id, 3, 7, 742, $message);
                     # 被吞噬装备镶嵌有宝石
                     break;
                 }
                 if (!empty($player_prop_details[$pprop_id]['star_map_id'])) {
                     $message = array('texts' => array(array('code' => 80042, 'content' => array(), 'params' => array())), 'delay' => 0);
                     Protocol::input($player_id, 3, 7, 742, $message);
                     # 被吞噬装备镶嵌有觉醒石
                     break;
                 }
                 $item_swallow_info = Cache_Forge::getInstance()->get_swallow_map_config($player_prop_details[$pprop_id]['sub_type'], $player_prop_details[$pprop_id]['quality']);
                 if (empty($item_swallow_info)) {
                     $message = array('texts' => array(array('code' => 80025, 'content' => array(), 'params' => array())), 'delay' => 0);
                     Protocol::input($player_id, 3, 7, 742, $message);
                     # 该装备子类型没有配置对应的吞噬属性信息!
                     break;
                 }
                 if (empty($item_swallow_info['swallow_id'])) {
                     $message = array('texts' => array(array('code' => 80026, 'content' => array(), 'params' => array())), 'delay' => 0);
                     Protocol::input($player_id, 3, 7, 742, $message);
                     # 获取吞噬属性类型失败
                     break;
                 }
                 $exp_revise_info = Cache_Forge::getInstance()->get_swallow_exp_revise_config($player_prop_details[$pprop_id]['star_level']);
                 if (empty($exp_revise_info) || empty($exp_revise_info['revise_ratio'])) {
                     $message = array('texts' => array(array('code' => 80044, 'content' => array(), 'params' => array())), 'delay' => 0);
                     Protocol::input($player_id, 3, 7, 742, $message);
                     # 获取吞噬经验修正配置失败
                     break;
                 }
             }
         }
         # 计算增加的吞噬属性ID
         $add_swallow_id = $item_swallow_info['swallow_id'];
         # 使用配置数据判断满经验,是为了当策划修改最大吞噬等级算法时,能忽略旧装备中保存的吞噬属性信息最大等级与最大经验两项,提高向前兼容性,Forwards Compatibility
         # 获取吞噬配置信息,一键勾选吞噬是不能报这个错
         $swallow_config = Cache_Forge::getInstance()->get_swallow_config($add_swallow_id, $swallow_lv_max);
         if (isset($player_prop_info['swallow_info'][$add_swallow_id]['swallow_exp']) && $player_prop_info['swallow_info'][$add_swallow_id]['swallow_exp'] >= $swallow_config['swallow_exp'] - 1) {
             if (!empty($type)) {
                 # 实际吞噬
                 $this->throw_error('80021');
                 # 该装备的该项吞噬属性已满!
             } else {
                 $full_level_flag = true;
                 if (empty($onekey)) {
                     # 单次勾选获取吞噬信息需要弹提示属性满的消息,但不能阻断程序执行,只能跳出循环
                     $message = array('texts' => array(array('code' => 80021, 'content' => array(), 'params' => array())), 'delay' => 0);
                     Protocol::input($player_id, 3, 7, 742, $message);
                     break;
                 } else {
                     # 一键勾选获取吞噬信息不弹提示属性满的消息
                     continue;
                 }
             }
         }
         $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']];
         $add_swallow_exp = ceil($add_swallow_exp * $exp_revise_info['revise_ratio'] / 10000);
         if (isset($player_prop_info['swallow_info'][$add_swallow_id])) {
             $player_prop_info['swallow_info'][$add_swallow_id]['swallow_exp'] += $add_swallow_exp;
         } else {
             $player_prop_info['swallow_info'][$add_swallow_id] = array('swallow_id' => $add_swallow_id, 'swallow_lv' => 0, 'swallow_exp' => $add_swallow_exp);
         }
         # 最大经验值保护
         if ($player_prop_info['swallow_info'][$add_swallow_id]['swallow_exp'] >= $swallow_config['swallow_exp'] - 1) {
             $player_prop_info['swallow_info'][$add_swallow_id]['swallow_exp'] = $swallow_config['swallow_exp'] - 1;
         }
     }
     #var_export($player_prop_info);
     # 根据吞噬属性的exp,刷新吞噬属性的lv
     if (!empty($player_prop_info['swallow_info'])) {
         foreach ($player_prop_info['swallow_info'] as $sid => $sinfo) {
             $swallow_config = Cache_Forge::getInstance()->get_swallow_config_by_exp($sinfo['swallow_id'], $sinfo['swallow_exp']);
             if (!empty($swallow_config)) {
                 $player_prop_info['swallow_info'][$sid]['swallow_lv'] = $swallow_config['swallow_lv'];
                 #$player_prop_info['swallow_info'][$sid]['swallow_param'] = $swallow_config['swallow_param']; # 不缓存任何配置数据,提高策划修改配置表时的兼容性
             }
             $out_828['swallow_list'][$sid] = array('swallow_id' => $sid, 'swallow_lv' => $player_prop_info['swallow_info'][$sid]['swallow_lv'], 'swallow_exp' => $player_prop_info['swallow_info'][$sid]['swallow_exp']);
         }
         $player_prop_info['swallow_version'] = 2;
         # 新功能版本号,用来区分新旧装备,一遍向下兼容接口有条件刷新
     }
     if (empty($type)) {
         # 修正被吞噬的装备列表,去除吞噬属性达到上限及之后的其它装备
         $out_828['swallow_ppids'] = empty($onekey_prop_list) ? "" : implode(":", $onekey_prop_list);
         if (empty($out_828['swallow_ppids']) && !empty($onekey)) {
             # 没有能被吞噬的装备
             $code = $full_level_flag ? 80021 : 80043;
             $message = array('texts' => array(array('code' => $code, 'content' => array(), 'params' => array())), 'delay' => 0);
             Protocol::input($player_id, 3, 7, 742, $message);
             # 没有可以被吞噬的装备[装备镶嵌有觉醒石,宝石,装备为首充装备,装备获取不到吞噬配置]
         }
         return $out_828;
     }
     $out_829 = 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('swallow_info' => $player_prop_info['swallow_info']));
     $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' => 829));
         $this->write_check($re, 3010182);
     }
     $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_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['swallow_info'], 'swallow_id_1' => 0, 'before_swallow_level_1' => 0, 'after_swallow_level_1' => 0, 'swallow_id_2' => 0, 'before_swallow_level_2' => 0, 'after_swallow_level_2' => 0, 'swallow_id_3' => 0, 'before_swallow_level_3' => 0, 'after_swallow_level_3' => 0, 'swallow_id_4' => 0, 'before_swallow_level_4' => 0, 'after_swallow_level_4' => 0);
     if (!empty($before_swallow_info)) {
         foreach ($before_swallow_info as $sid => $sinfo) {
             $log_info["swallow_id_{$sid}"] = $sid;
             $log_info["before_swallow_level_{$sid}"] = $sinfo['swallow_lv'];
         }
     }
     foreach ($player_prop_info['swallow_info'] as $sid => $sinfo) {
         $log_info["swallow_id_{$sid}"] = $sid;
         $log_info["after_swallow_level_{$sid}"] = $sinfo['swallow_lv'];
     }
     Log_Forge::getInstance()->add_log($log_info, 'swallow');
     # 刷新玩家属性
     if ($player_prop_info['item_position'] == 3) {
         $this->get_game('EquipAttr')->equip_attr($player_id);
     }
     # 通知道具变更806
     $ndata = array();
     $ndata[] = $player_prop_info;
     foreach ($player_prop_details as $key => &$val) {
         $val['item_num'] -= 1;
         $out_829[1]['grid_list'][] = $val['grid'];
         $ndata[] = $val;
     }
     Protocol_Prop::prop_806($player_id, $ndata);
     # 刷装备814[锻造面板]与827[可吞噬道具列表]
     $equips = $this->get_data('PlayerProp')->get_player_prop_by_item_position($player_id, 1);
     Com_Array::multisort($equips, array('quality' => 'desc', 'level' => 'desc'));
     $emp = array();
     $fmp = array();
     if (!empty($equips)) {
         foreach ($equips as $k => $v) {
             if ($v['type'] == 1) {
                 $emp[] = $v['grid'];
             }
         }
         # 过滤不允许该装备吞噬的装备
         $equips = $this->filter_unvalid_props($player_prop_info, $equips);
         foreach ($equips as $k => $v) {
             $fmp[] = $v['grid'];
         }
     }
     $equip_list = array('item_position' => 1, 'grid_list' => $emp);
     $allow_swallow = array(0 => $player_prop_id, 1 => array('item_position' => 1, 'grid_list' => $fmp));
     Protocol::input($player_id, 3, 8, 829, $out_829);
     Protocol::input($player_id, 3, 8, 814, array($equip_list));
     Protocol::input($player_id, 3, 8, 827, $allow_swallow);
     # 记录行为
     Com_Log::write('xgame.forge_swallow', "{$player_id}\t" . "swallow\t" . "{$type}\t" . "{$player_prop_id}\t" . implode(",", $swallow_equips));
     # 日常任务埋点
     $this->get_game('TaskTrigger')->async_trigger_task($player_id, 108, 108, 1);
     # 每日活跃任务埋点
     $this->get_game('DailyBoon')->async_trigger_daily_boon_task($player_id, 2001, 1, 1);
     return $out_829;
 }
Пример #11
0
 /**
  * @Purpose:
  * 翅膀装备传承
  * @Param $player_id 玩家ID
  * @Param $inherit_equip_pid 传承装备ID
  * @Param $be_inherit_equip_pid 继承装备ID
  */
 public function wing_equip_inherit($player_id, $inherit_equip_pid, $be_inherit_equip_pid)
 {
     $player_id = intval($player_id);
     $inherit_equip_pid = strval($inherit_equip_pid);
     $be_inherit_equip_pid = strval($be_inherit_equip_pid);
     $player_info = $this->get_data('Player')->get_player_info($player_id, Com_Util::get_player_fields(array('currency', 'career_type', 'level', 'vip', 'privilege_level')));
     if (empty($player_info)) {
         $this->throw_error('20002');
         //没有玩家信息!
     }
     $player_prop_list = $this->get_data('PlayerProp')->get_player_prop_detail_multi($player_id, array($inherit_equip_pid, $be_inherit_equip_pid));
     $inherit_equip_info = $player_prop_list[$inherit_equip_pid];
     $be_inherit_equip_info = $player_prop_list[$be_inherit_equip_pid];
     if (empty($inherit_equip_info) || empty($be_inherit_equip_info)) {
         $this->throw_error('80013');
     } else {
         if ($inherit_equip_info['sub_type'] == 7 || $be_inherit_equip_info['sub_type'] == 7) {
             $this->throw_error('10110');
             #数据错误
         }
     }
     $player_detail = $this->get_data('PlayerDetail')->get_player_detail($player_id, Protocol_Player::get_player_attr_detail_key());
     if (empty($player_detail['wing_info'][$inherit_equip_info['vocation_limit']]) || empty($player_detail['wing_info'][$be_inherit_equip_info['vocation_limit']])) {
         $this->throw_error('10110');
         #数据错误
     }
     $inherit_table = Cache_WingEquipment::getInstance()->get_wing_equip_inherit_info(array('item_level' => $be_inherit_equip_info['level']));
     if (empty($inherit_table)) {
         $this->throw_error('10109');
         #配置表读取错误
     } else {
         if (empty($inherit_table['expend_prop'])) {
             $this->throw_error('150022');
             #wing_equip_inherit配置表的expend_prop字段配置错误
         }
     }
     $prop_list = $this->format_table_field($inherit_table['expend_prop']);
     if (!Com_Array::is_good_arr($prop_list)) {
         $this->throw_error('150022');
         #wing_equip_inherit配置表的expend_prop字段配置错误
     }
     #道具检测
     $arr_consume = array();
     foreach ($prop_list as $id => $num) {
         if (empty($id) || empty($num)) {
             $this->throw_error('150022');
             #wing_equip_inherit配置表的expend_prop字段配置错误
         }
         $cost_currency_key = Cache_Currency::getInstance()->get_key($id);
         if ($cost_currency_key == 'prop') {
             #传承装备和继承装备等级不同时,才需要消耗道具
             if ($inherit_equip_info['level'] != $be_inherit_equip_info['level']) {
                 $this->get_game('Prop')->check_player_prop($player_id, $player_info, $id, $num, $arr_consume);
             }
         } else {
             if (empty($cost_currency_key)) {
                 $this->throw_error('150022');
                 #wing_equip_inherit配置表的expend_prop字段配置错误
             }
             $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $cost_currency_key, $num, 1, $id);
         }
     }
     #如果是已装备的,传承前先清楚原来的装备属性
     if ($inherit_equip_info['item_position'] == $this->wing_pos) {
         $wing_attr = $player_detail['wing_info'][$inherit_equip_info['vocation_limit']];
         $wing_attr['equipment'][$inherit_equip_info['sub_type']] = array();
         $arr_remove_prop_detail = $inherit_equip_info;
         Struct_Prop::get_item_additions($arr_remove_prop_detail);
         $wing_attr['fight'] -= $arr_remove_prop_detail['fpower'];
         $wing_attr['fight'] = $wing_attr['fight'] > 0 ? $wing_attr['fight'] : 0;
         $wing_attr['equipment_fight'] -= $arr_remove_prop_detail['fpower'];
         $wing_attr['equipment_fight'] = $wing_attr['equipment_fight'] > 0 ? $wing_attr['equipment_fight'] : 0;
         $player_detail['wing_info'][$inherit_equip_info['vocation_limit']] = $wing_attr;
     }
     if ($be_inherit_equip_info['item_position'] == $this->wing_pos) {
         $be_wing_attr = $player_detail['wing_info'][$be_inherit_equip_info['vocation_limit']];
         $be_wing_attr['equipment'][$be_inherit_equip_info['sub_type']] = array();
         $arr_remove_prop_detail = $be_inherit_equip_info;
         Struct_Prop::get_item_additions($arr_remove_prop_detail);
         $be_wing_attr['fight'] -= $arr_remove_prop_detail['fpower'];
         $be_wing_attr['fight'] = $be_wing_attr['fight'] > 0 ? $be_wing_attr['fight'] : 0;
         $be_wing_attr['equipment_fight'] -= $arr_remove_prop_detail['fpower'];
         $be_wing_attr['equipment_fight'] = $be_wing_attr['equipment_fight'] > 0 ? $be_wing_attr['equipment_fight'] : 0;
         $player_detail['wing_info'][$be_inherit_equip_info['vocation_limit']] = $be_wing_attr;
     }
     #传承
     $update_equip_list = $this->get_inherit_wing_equip($inherit_equip_info, $be_inherit_equip_info);
     $is_update_wing = false;
     $is_update_be_wing = false;
     #如果是已装备的,重新计算翅膀战斗力
     if ($inherit_equip_info['item_position'] == $this->wing_pos) {
         $wing_attr = $player_detail['wing_info'][$inherit_equip_info['vocation_limit']];
         $wing_attr['equipment'][$inherit_equip_info['sub_type']] = $inherit_equip_info;
         $wing_attr['equip_attr'] = $this->get_wing_equip_attr($wing_attr['equipment']);
         $arr_prop_detail = $inherit_equip_info;
         Struct_Prop::get_item_additions($arr_prop_detail);
         $wing_attr['fight'] += $arr_prop_detail['fpower'];
         $wing_attr['equipment_fight'] += $arr_prop_detail['fpower'];
         $player_detail['wing_info'][$inherit_equip_info['vocation_limit']] = $wing_attr;
         $is_update_wing = true;
     }
     if ($be_inherit_equip_info['item_position'] == $this->wing_pos) {
         $be_wing_attr = $player_detail['wing_info'][$be_inherit_equip_info['vocation_limit']];
         $be_wing_attr['equipment'][$be_inherit_equip_info['sub_type']] = $be_inherit_equip_info;
         $be_wing_attr['equip_attr'] = $this->get_wing_equip_attr($be_wing_attr['equipment']);
         $arr_prop_detail = $be_inherit_equip_info;
         Struct_Prop::get_item_additions($arr_prop_detail);
         $be_wing_attr['fight'] += $arr_prop_detail['fpower'];
         $be_wing_attr['equipment_fight'] += $arr_prop_detail['fpower'];
         $player_detail['wing_info'][$be_inherit_equip_info['vocation_limit']] = $be_wing_attr;
         $is_update_be_wing = true;
     }
     $this->start_trans();
     #更新道具属性
     if (!empty($update_equip_list[$inherit_equip_pid])) {
         $update_res = $this->get_data('PlayerProp')->update_player_prop($inherit_equip_info, $update_equip_list[$inherit_equip_pid]);
         if (!$update_res) {
             $this->throw_error('10104');
         }
     }
     if (!empty($update_equip_list[$be_inherit_equip_pid])) {
         $update_res = $this->get_data('PlayerProp')->update_player_prop($be_inherit_equip_info, $update_equip_list[$be_inherit_equip_pid]);
         if (!$update_res) {
             $this->throw_error('10104');
         }
     }
     #更新翅膀战斗力
     if ($is_update_wing || $is_update_be_wing) {
         $update_res = $this->get_data('PlayerDetail')->update_player_detail($player_id, array('wing_info' => $player_detail['wing_info']));
         if (!$update_res) {
             $this->throw_error('10104');
         }
     }
     foreach ($prop_list as $id => $num) {
         if (empty($id) || empty($num)) {
             $this->throw_error('150022');
             #wing_equip_inherit配置表的expend_prop字段配置错误
         }
         $cost_currency_key = Cache_Currency::getInstance()->get_key($id);
         if ($cost_currency_key == 'prop') {
             #传承装备和继承装备等级不同时,才需要消耗道具
             if ($inherit_equip_info['level'] != $be_inherit_equip_info['level']) {
                 $this->get_game('Prop')->dedcut_player_prop($player_id, $player_info, 1512);
             }
         } else {
             if (empty($cost_currency_key)) {
                 $this->throw_error('150022');
                 #wing_equip_inherit配置表的expend_prop字段配置错误
             }
             #扣货币
             $deduct_res = $this->get_data('Player')->update_player_resource($player_id, $player_info, 1512, array(), $arr_consume);
             if (!$deduct_res) {
                 $this->throw_error('10104');
             }
         }
     }
     if ($is_update_wing && $player_detail['wing_info'][$inherit_equip_info['vocation_limit']]['fight'] > 0) {
         $wing_fight = $player_detail['wing_info'][$inherit_equip_info['vocation_limit']]['fight'];
         $this->get_data('RankList')->update_wing_rank($player_id, $inherit_equip_info['vocation_limit'], $wing_fight);
     }
     if ($is_update_be_wing && $player_detail['wing_info'][$be_inherit_equip_info['vocation_limit']]['fight'] > 0) {
         $wing_fight = $player_detail['wing_info'][$be_inherit_equip_info['vocation_limit']]['fight'];
         $this->get_data('RankList')->update_wing_rank($player_id, $be_inherit_equip_info['vocation_limit'], $wing_fight);
     }
     $this->commit();
     $ndata = array();
     if (!$is_update_wing) {
         $ndata[] = $inherit_equip_info;
     }
     if (!$is_update_be_wing) {
         $ndata[] = $be_inherit_equip_info;
     }
     if (!empty($ndata)) {
         #806通知前端道具属性变更
         Protocol_Prop::prop_806($player_id, $ndata);
     }
     if ($is_update_wing || $is_update_be_wing) {
         #同步翅膀属性
         $str = $this->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']))));
     }
     $rtn_data = array('inherit_equip_info' => empty($inherit_equip_info) ? array() : Struct_Prop::get_prop_struct($inherit_equip_info), 'be_inherit_equip_info' => empty($be_inherit_equip_info) ? array() : Struct_Prop::get_prop_struct($be_inherit_equip_info));
     return $rtn_data;
 }
Пример #12
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);
 }
Пример #13
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']));
 }
Пример #14
0
 protected function equip_intensify_handle($flag, $player_id, $player_gems, $player_info, $player_equip_info, $intensify_config, $auto_buy, $bless_item_id)
 {
     if ($flag) {
         # 成功
         $player_equip_info['intensive_lose_times'] = 0;
         $player_equip_info['intensive_level'] += 1;
         $player_equip_info['intensive_desc'] = Game_EquipIntensifier::get_latest_intensive_desc($player_equip_info, $intensify_config);
         if ($player_equip_info['star_map_id']) {
             # 获取最新星图状态desc
             $player_equip_info['star_map_desc'] = $this->get_game('EquipStarMap')->get_latest_starmap_desc($player_equip_info);
         }
     } else {
         # 失败
         $player_equip_info['intensive_lose_times'] += 1;
     }
     $this->start_trans();
     # 玩家银两更新
     $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', 'silver', $intensify_config['silver_num'], 1, 1);
     # 强化特效信息更新
     $equip_view = $player_equip_info['equip_view'];
     if ($equip_view[0]) {
         $weapon_effect = Cache_WeaponEffect::getInstance()->get_weapon_effect($equip_view[0], $player_equip_info['intensive_level']);
         if ($weapon_effect && $weapon_effect['effect_id']) {
             $equip_view[2] = $weapon_effect['effect_id'];
         }
     }
     $equip_update_field = array('intensive_lose_times' => $player_equip_info['intensive_lose_times'], 'intensive_level' => $player_equip_info['intensive_level'], 'intensive_desc' => $player_equip_info['intensive_desc'], 'star_map_desc' => $player_equip_info['star_map_desc'], 'equip_view' => $equip_view);
     $re = $this->get_data('PlayerProp')->update_player_prop($player_equip_info, $equip_update_field);
     $this->write_check($re, 3010414);
     $log_param = array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'privilege_level' => $player_info['privilege_level'], 'cmd_id' => 816);
     # 消耗祝福石
     if (!empty($bless_item_id)) {
         $arr_logs_bless_item = array();
         $re = $this->get_game('Prop')->deduct_prop_by_prop_id($player_id, $bless_item_id, 1, $arr_logs_bless_item, 0, $log_param);
         $this->write_check($re, 3010422);
     }
     # 消耗强化宝石和钻石【勾选自动购买时当所需强化宝石不足时需要消耗钻石】
     $gem_cost_num = $intensify_config['item_num'];
     $cost_currency_type = 0;
     $cost_currency_value = 0;
     $price = 0;
     if ($auto_buy) {
         if ($player_gems < $intensify_config['item_num']) {
             $gem_cost_num = $player_gems;
             # 获取正确的强化宝石的单价
             $intensify_gem_info = $this->get_game('Shop')->shortcut_purchase_interface($intensify_config['item_id'], 1);
             if (empty($intensify_gem_info['item_price'])) {
                 $this->throw_error('80318');
                 # 商城强化宝石没有配置价格
             }
             # 策划价格配置多项时,选其中一项
             list($cur_type, $cur_val) = each($intensify_gem_info['item_price']);
             $price = $cur_val;
             $cost_currency_type = $cur_type;
             $cost_currency_value = intval($cur_val * ($intensify_config['item_num'] - $player_gems));
         }
     }
     if ($gem_cost_num > 0) {
         $arr_logs_gem = array();
         $re = $this->get_game('Prop')->deduct_prop_by_prop_id($player_id, $intensify_config['item_id'], $gem_cost_num, $arr_logs_gem, 0, $log_param);
         $this->write_check($re, 3010449);
     }
     # 消耗虚拟货币
     if ($cost_currency_value > 0) {
         $cost_currency_key = Cache_Currency::getInstance()->get_key($cost_currency_type);
         $arr_consume = Com_Util::get_consume_info_for_data_center($player_info, $cost_currency_key, $cost_currency_value, intval($intensify_config['item_num'] - $player_gems));
         $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $cost_currency_key, $cost_currency_value, 1, $cost_currency_type);
     }
     $re = $this->get_data('Player')->update_player_resource($player_id, $player_info, '816', array(), $arr_consume);
     $this->write_check($re, 3010476);
     $this->commit();
     # 若有购买缺少材料,记录虚假商城购买日志
     if ($cost_currency_value > 0) {
         $this->get_game('Shop')->add_dummy_shop_log($player_id, $player_info, $intensify_config['item_id'], intval($intensify_config['item_num'] - $player_gems), $cost_currency_type, $cost_currency_value, 816);
     }
     # 刷新玩家属性
     if ($player_equip_info['item_position'] == 3) {
         $this->get_game('EquipAttr')->equip_attr($player_id);
     }
     # 粘806 + 通知道具变更信息
     $ndata = array();
     $ndata[] = $player_equip_info;
     if (!empty($arr_logs_gem) && is_array($arr_logs_gem)) {
         foreach ($arr_logs_gem as $k => $v) {
             # 消耗的宝石
             $ndata[] = $v;
         }
     }
     if (!empty($arr_logs_bless_item)) {
         # 消耗的祝福石,祝福石只消耗1个
         $ndata[] = $arr_logs_bless_item[0];
     }
     Protocol_Prop::prop_806($player_id, $ndata);
     # 通知玩家信息变更[必须放在commit之后]
     return $player_equip_info['intensive_desc'];
 }
Пример #15
0
 public function compose($player_id, $target_id, $comp_type, $comp_sub_type, $auto_buy, $onekey)
 {
     $this->get_game('PlayerFunc')->get_func_is_open($player_id, $this->func_id);
     # 参数校验,comp_sub_type允许为0
     $this->param_check_numeric(array($player_id, $target_id, $comp_type, $comp_sub_type), 0);
     $player_info = $this->get_data('Player')->get_player_info($player_id, Com_Util::get_player_fields(array('currency', 'player_id', 'level', 'vip', 'privilege_level')));
     # 一键合成不允许自动购买
     if ($onekey) {
         $auto_buy = 0;
     }
     # 获取具体合成信息
     $comp_info = Cache_ItemCompose::getInstance()->get_item_compose_info_by_target_id($target_id);
     if (empty($comp_info)) {
         $this->throw_error('90002');
         # 没有配置该道具的合成信息
     }
     $comp_type = $comp_info['comp_type'];
     $comp_sub_type = $comp_info['comp_sub_type'];
     /** 由于前端问题,传参此处可能报异常,反正这两个参数不实用,故忽略
     		if ($comp_info['comp_type'] != $comp_type || $comp_info['comp_sub_type'] != $comp_sub_type) {
     			$this->throw_error('90003'); # 合成参数异常
     		}
     		**/
     # 检查消耗情况
     $cost_material_info_hash = array();
     # 消耗材料信息哈希,为了方便一次性查找所有消耗材料的持有数
     for ($i = 1; $i <= 5; $i++) {
         if (!empty($comp_info['m' . $i . '_id']) && !empty($comp_info['m' . $i . '_amount'])) {
             $cost_material_info_hash[$comp_info['m' . $i . '_id']] = $comp_info['m' . $i . '_amount'];
         }
     }
     # --------------------------------------------------------------------
     # 计算可一键合成的产物数量
     # --------------------------------------------------------------------
     $onekey_num_list = array();
     # 每项材料可以满足合成条件几次
     if (!empty($cost_material_info_hash)) {
         $material_hold_nums = $this->get_game('Prop')->get_prop_num_by_prop_id($player_id, array_keys($cost_material_info_hash));
         foreach ($cost_material_info_hash as $m_id => $m_amount) {
             $onekey_num_list[$m_id] = intval($material_hold_nums[$m_id] / $m_amount);
         }
     }
     $onekey_num = min($onekey_num_list);
     # 木桶原理,能一键合成的产物数由最少材料项决定
     if ($onekey) {
         if (empty($onekey_num)) {
             $this->throw_error('90004');
             # 合成所需材料不足
         }
         $onekey_num = min($onekey_num, intval($player_info['silver'] / $comp_info['cost']));
         # 木桶原理,能一键合成的产物数还由玩家持有货币决定
         if (empty($onekey_num)) {
             $this->throw_error('10113');
             # 金币不足
         }
     } else {
         if (empty($onekey_num) && empty($auto_buy)) {
             $this->throw_error('90004');
             # 合成所需材料不足
         }
         $onekey_num = 1;
         # 非一键合成一次只允许合成一件
     }
     $this->start_trans();
     # 消耗虚拟货币
     $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', 'silver', $comp_info['cost'] * $onekey_num, 1, 1);
     # 消耗材料
     $arr_logs = array();
     $log_param = array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'privilege_level' => $player_info['privilege_level'], 'cmd_id' => 2202);
     foreach ($cost_material_info_hash as $m_id => $m_amount) {
         $hold_num = !empty($material_hold_nums[$m_id]) ? $material_hold_nums[$m_id] : 0;
         if (!empty($auto_buy) && $hold_num < $m_amount) {
             # 一定是单次合成
             # 获取正确的单价
             $price_info = $this->get_game('Shop')->shortcut_purchase_interface($m_id, 1);
             if (empty($price_info['item_price'])) {
                 $this->throw_error('130001');
                 # 商城没有出售该道具
             }
             # 策划价格配置多项时,选其中一项
             list($cur_idx, $cur_val) = each($price_info['item_price']);
             $price = $cur_val;
             $cost_currency_key = Cache_Currency::getInstance()->get_key($cur_idx);
             $cost_currency_value = intval($cur_val * ($m_amount - $hold_num));
             $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $cost_currency_key, $cost_currency_value, 1, $cur_idx);
             if ($hold_num > 0) {
                 # 该方法在道具不足时会报错,无需外层再判断是否道具足够
                 $re = $this->get_game('Prop')->deduct_prop_by_prop_id($player_id, $m_id, $material_hold_nums[$m_id], $arr_logs, 0, $log_param);
                 $this->write_check($re, 3010156);
             }
             # 若有购买缺少材料,记录虚假商城购买日志
             if ($cost_currency_value > 0) {
                 $this->get_game('Shop')->add_dummy_shop_log($player_id, $player_info, $m_id, intval($m_amount - $hold_num), $cur_idx, $cost_currency_value, 2202);
             }
         } else {
             # 可能单次,可能一键
             # 该方法在道具不足时会报错,无需外层再判断是否道具足够
             $re = $this->get_game('Prop')->deduct_prop_by_prop_id($player_id, $m_id, $m_amount * $onekey_num, $arr_logs, 0, $log_param);
             $this->write_check($re, 3010161);
         }
     }
     # TODO: 数据中心推送
     $re = $this->get_data('Player')->update_player_resource($player_id, $player_info, '2202');
     $this->write_check($re, 3010167);
     #---------------------------------------------------------------------
     # 按概率计算成功次数
     #---------------------------------------------------------------------
     $success_num = 0;
     for ($i = 1; $i <= $onekey_num; $i++) {
         if (Com_Random::probability($comp_info['succ_rate'], 10000)) {
             # 成功
             $success_num += 1;
         }
     }
     if ($success_num) {
         # 成功
         # 发送道具
         $reward[] = array('type' => 'prop', 'item_id' => $target_id, 'item_num' => $success_num);
         $re = $this->get_game('Reward')->send_reward($player_id, $reward, array('cmd_id' => 2202));
         #send_reward失败时,会返回各种失败情况的错误码
         $this->write_check_strict($re, 3010173);
     }
     # 记录合成日志
     $this->commit();
     # --------------------------------------------------------------------
     # 通知道具变更,粘包806
     # --------------------------------------------------------------------
     $this->get_game('Reward')->add_reward_log();
     # 调用add_reward_log,触发806协议通知道具变更,并记录道具获取日志
     if (!empty($arr_logs) && is_array($arr_logs)) {
         $ndata = array();
         foreach ($arr_logs as $key => $val) {
             $ndata[] = $val;
         }
         Protocol_Prop::prop_806($player_id, $ndata);
     }
     # --------------------------------------------------------------------
     # 刷新2201协议
     # --------------------------------------------------------------------
     $data_2201 = $this->get_compose_info($player_id, $comp_type, $comp_sub_type);
     Protocol::input($player_id, 3, 22, 2201, $data_2201);
     # 记录行为
     Com_Log::write('xgame.compose', "{$player_id}\t" . "{$target_id}\t" . "{$auto_buy}\t" . "{$onekey}\t" . "{$onekey_num}\t" . "{$success_num}\t");
     # 日常任务埋点,宝石合成才触发,考虑宝石种类可能包含多种,不方便使用$arr_logs[0]['type'] == 3 && $arr_logs[0]['sub_type'] == 6类似条件
     #if ($comp_type == $this->comp_type_for_gem) { # 改为任意合成都算
     $this->get_game('TaskTrigger')->async_trigger_task($player_id, 109, 109, $onekey_num);
     #}
     #引导任务
     $this->get_game('TaskTrigger')->async_trigger_guide_task($player_id, 12, $onekey_num);
     # --------------------------------------------------------------------
     # 公告
     # --------------------------------------------------------------------
     $replace_info = array(array('rep_type' => 0, 'rep_val' => $player_id), array('rep_type' => 1, 'rep_val' => 70), array('rep_type' => 2, 'rep_val' => $target_id));
     $prop_info = Cache_Prop::getInstance()->get_prop_info($target_id);
     $this->get_game('SystemNotice')->push_sys_notice($player_id, 70, 0, $replace_info, 0, $prop_info['need_broad_cast']);
     $out_2202 = array('result' => 1);
     return $out_2202;
 }
Пример #16
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;
 }
Пример #17
0
 /**
  * 以用户的道具id扣除道具
  * @param $player_id
  * @param $player_prop_id
  * @param $need_num
  * @param array $log_param
  * @param null $player_prop_info
  * @param int $send_806
  * @return bool
  */
 public function deduct_prop_by_ppid($player_id, $player_prop_id, $need_num, $log_param = array(), $player_prop_info = null, $send_806 = 1)
 {
     if (empty($player_prop_info)) {
         $player_prop_info = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $player_prop_id);
     }
     if ($player_prop_info['item_num'] < $need_num) {
         return false;
     }
     if ($player_prop_info['item_num'] == $need_num) {
         //道具数量小于扣除数量
         if (!$this->get_data('PlayerProp')->delete_player_prop($player_id, $player_prop_info, true, $log_param)) {
             return false;
         }
         $need_num -= $player_prop_info['item_num'];
         $player_prop_info['item_num'] = 0;
         $arr_logs[] = $player_prop_info;
     } else {
         //道具数量大于扣除数量 更新道具数量
         if (!$this->get_data('PlayerProp')->update_prop_num($player_id, $player_prop_info, $need_num, '-', $log_param)) {
             return false;
         }
         $player_prop_info['item_num'] -= $need_num;
         $arr_logs[] = $player_prop_info;
     }
     if ($send_806 == 1) {
         if ($this->is_trans()) {
             $this->set_redis_pre_action(null, array("Protocol_Prop", "prop_806"), array($player_id, $arr_logs));
         } else {
             Protocol_Prop::prop_806($player_id, $arr_logs);
         }
     }
     return true;
 }
Пример #18
0
 /**
  * 完成任务
  * @param $player_id
  * @param $task_id
  * @param $step_id
  * @param $arr_player_task 任务数据
  */
 public function finish_main_task($player_id, $task_id, $step_id)
 {
     $time_start = microtime(true);
     $arr_player_task = $this->get_data('PlayerTask')->get_task_info($player_id);
     if (empty($arr_player_task['main_val'][$task_id])) {
         $this->throw_error('10107');
         //参数错误
     }
     if ($arr_player_task['main_val'][$task_id]['task_status'] < 2) {
         $this->throw_error('10015');
         //任务还未完成
     }
     $player_info = $this->get_data('Player')->get_player_info($player_id, array('career_type', 'level', 'vip', 'privilege_level', 'union_id'));
     $out = array('old' => array(), 'new' => array());
     $current_num = intval($arr_player_task['current_num']);
     $task_config = Cache_TaskConfig::getInstance()->get_task_config($task_id);
     $cur_step_config = Cache_TaskStepConfig::getInstance()->get_task_step_config($task_id, $step_id);
     if (!empty($arr_player_task['main_val'][$task_id]['target'])) {
         foreach ($arr_player_task['main_val'][$task_id]['target'] as $target_id => $val) {
             $this->get_game('TaskTrigger')->clear_main_task_target_val($arr_player_task, $task_id, $target_id);
             #清理target_val
         }
     }
     #更新任务进度
     if ($arr_player_task['main_val'][$task_id]['task_steps'] == $arr_player_task['main_val'][$task_id]['step']) {
         $max_num = Cache_TaskConfig::getInstance()->get_chapter_task_num($task_config['chapter_id'], $task_config['chapter_part']);
         $finish_num = $this->get_chapter_task_finish_num($player_id, $task_config['chapter_id'], $task_config['chapter_part']);
         if ($max_num) {
             $jin_du = ceil($finish_num / $max_num * 100);
         } else {
             $jin_du = 0;
         }
         $arr_player_task['current_num'] = $jin_du;
     }
     if ($cur_step_config['dungeon_event_sid']) {
         Protocol::input($player_id, 7, 4, 471, $cur_step_config['dungeon_event_sid']);
     }
     //副本触发
     if ($cur_step_config['buff_id']) {
         Protocol::input($player_id, 7, 4, 496, array('status' => 0, 'buff_id' => $cur_step_config['buff_id']));
     }
     //buff结束
     $logs = array();
     $old_task_status = $arr_player_task['main_val'][$task_id]['task_status'] + 1;
     $out['old'] = array('task_id' => $task_id, 'step' => $step_id, 'task_status' => $old_task_status, 'task_data' => $this->format_target($arr_player_task['main_val'][$task_id]['target'], $cur_step_config['step_type']), 'index' => 1, 'cur_finish_num' => $current_num, 'task_seq' => 0, 'kill_npc_city_id' => 0, 'task_type' => 1, 'task_star' => 0);
     $logs[] = array('type' => 1, 'task_id' => $task_id, 'step' => $step_id, 'status' => $old_task_status);
     //        //统计对象清除   触发的时候已经删除 这地方先注释
     //        if(!empty($arr_player_task['main_val'][$task_id]['target'])){
     //            unset($arr_player_task['target_val'][$arr_player_task['main_val'][$task_id]['step_type']][$arr_player_task['main_val'][$task_id]['target']['target_id']][$task_config['task_type']][$task_id]);
     //        }
     $deduct_prop = array();
     //收集道具任务 扣除道具
     if ($arr_player_task['main_val'][$task_id]['step_type'] == 5) {
         //收集道具任务
         foreach ($arr_player_task['main_val'][$task_id]['target'] as $target) {
             $deduct_prop[$target['target_id']] = $target['target_num'];
         }
     }
     $out_12 = array();
     $dup_id2 = 0;
     $func_open_task_id = 0;
     #功能开启的任务id
     $reset_skill = false;
     $upgrade_async = true;
     if ($arr_player_task['main_val'][$task_id]['step'] >= $arr_player_task['main_val'][$task_id]['task_steps']) {
         //下一个任务
         $func_open_task_id = $task_id;
         $next_task_id = $arr_player_task['main_val'][$task_id]['next_task_id'];
         $next_task_config = Cache_TaskConfig::getInstance()->get_task_config($next_task_id);
         if ($task_id == 11071) {
             $reset_skill = true;
         }
         if (!empty($next_task_config)) {
             $step_config = Cache_TaskStepConfig::getInstance()->get_task_step_config($next_task_id, 1);
             //                Com_Log::log("================[step config]================","fb_task",1);
             //                Com_Log::log($step_config,"fb_task",1);
             $arr_target = $this->get_target_val($player_id, $step_config);
             //                Com_Log::log("================[target]================","fb_task",1);
             //                Com_Log::log($arr_target,"fb_task",1);
             if (!empty($arr_target)) {
                 foreach ($arr_target as $target) {
                     if (!empty($target)) {
                         $arr_player_task['target_val'][$step_config['step_type']][$target['target_id']][$next_task_config['task_type']][$next_task_id] = $target['target_num'];
                     }
                 }
             }
             if ($step_config['dup_id2']) {
                 $dup_id2 = $step_config['dup_id2'];
                 //                    Com_Log::write("fb_city.".$player_id,"main task_id:{$next_task_id} city:{$city_id}");
             }
             //                Com_Log::write("deal_main_task.".$player_id,"task_main  min_level:{$next_task_config['min_level']} level:{$next_task_config['level']}");
             //                Com_Log::write("task_targeter.".$player_id,"main min_level:{$next_task_config['min_level']} level:{$player_info['level']}");
             if ($next_task_config['min_level'] > $player_info['level']) {
                 $task_status = 0;
                 $upgrade_async = false;
             } else {
                 if ($step_config['step_type'] == 2) {
                     $task_status = 2;
                     //直接完成
                 } else {
                     $task_status = 1;
                 }
             }
             if ($step_config['buff_id']) {
                 Protocol::input($player_id, 7, 4, 496, array('status' => 1, 'buff_id' => $step_config['buff_id']));
             }
             //buff开始
             $arr_player_task['main_val'][$next_task_id] = array('task_id' => $next_task_id, 'task_steps' => $next_task_config['task_steps'], 'step' => 1, 'task_status' => $task_status, 'next_task_id' => $next_task_config['next_task_id'], 'step_type' => $step_config['step_type'], 'dungeon_event_sid' => $step_config['dungeon_event_sid'], 'buff_id' => $step_config['buff_id'], 'btn_dialog' => $step_config['btn_dialog'], 'target' => $arr_target);
             $arr_player_task['current_chapter'] = $next_task_config['chapter_id'];
             $arr_player_task['current_chapter_part'] = $next_task_config['chapter_part'];
             $finish_num = $this->get_chapter_task_finish_num($player_id, $next_task_config['chapter_id'], $next_task_config['chapter_part']);
             if ($finish_num <= 1) {
                 $arr_player_task['current_num'] = 0;
             }
             $out['new'] = array('task_id' => $next_task_id, 'step' => 1, 'task_status' => $task_status, 'task_data' => $this->format_target($arr_target, $step_config['step_type']), 'index' => 1, 'cur_finish_num' => $arr_player_task['current_num'], 'task_seq' => 0, 'kill_npc_city_id' => 0, 'task_type' => 1, 'task_star' => 0);
             $logs[] = array('type' => 1, 'task_id' => $next_task_id, 'step' => 1, 'status' => $task_status);
             ++$arr_player_task['main_finish_count_acc'];
             if ($step_config['step_type'] == 12) {
                 $out_12['city_escort_map_sid'] = $step_config['city_id'];
                 $out_12['city_escort_target_x'] = $step_config['pro_addr_x'];
                 $out_12['city_escort_target_y'] = $step_config['pro_addr_y'];
                 $pro_npc = explode("|", $step_config['pro_npc']);
                 $out_12['city_escort_npc_sid'] = $pro_npc[0];
             }
             ##新手引导
             //                Com_Log::write('guide_'.$player_id,"task_id:{$next_task_id} task_main:".$step_config['guide_type']);
             if (!empty($step_config['guide_type'])) {
                 $guides = explode("|", $step_config['guide_type']);
                 foreach ($guides as $guide) {
                     //                        Com_Log::write('guide_'.$player_id,"task_id:{$next_task_id} task_main_guide:".$guide);
                     Protocol_Guide::add($guide, 1);
                     //                        Com_Log::write('task_guide.'.$player_id,"task main next guide:{$guide} task_guide:{$step_config['task_guide']}");
                     if ($step_config['task_guide'] == 1) {
                         $this->do_guide_task($player_id, $guide, 1, $arr_player_task, $out);
                     }
                 }
             }
             if ($task_id != $next_task_id) {
                 #压力测试 接重复的任务 所以这地方不能unset
                 unset($arr_player_task['main_val'][$task_id]);
             }
         }
     } else {
         //下一步任务
         $next_step = $arr_player_task['main_val'][$task_id]['step'] + 1;
         $step_config = Cache_TaskStepConfig::getInstance()->get_task_step_config($task_id, $next_step);
         $arr_target = $this->get_target_val($player_id, $step_config);
         if (!empty($arr_target)) {
             foreach ($arr_target as $target) {
                 if (!empty($target)) {
                     $arr_player_task['target_val'][$step_config['step_type']][$target['target_id']][$task_config['task_type']][$task_id] = $target['target_num'];
                 }
             }
         }
         if ($step_config['dup_id2']) {
             $dup_id2 = $step_config['dup_id2'];
             //                Com_Log::write("fb_city.".$player_id,"main task_id:{$task_id} city:{$city_id}");
         }
         if ($step_config['step_type'] == 2) {
             $task_status = 2;
         } else {
             $task_status = 1;
         }
         if ($step_config['buff_id']) {
             Protocol::input($player_id, 7, 4, 496, array('status' => 1, 'buff_id' => $step_config['buff_id']));
         }
         //buff开始
         $arr_player_task['main_val'][$task_id]['step'] = $next_step;
         $arr_player_task['main_val'][$task_id]['task_status'] = $task_status;
         $arr_player_task['main_val'][$task_id]['step_type'] = $step_config['step_type'];
         $arr_player_task['main_val'][$task_id]['target'] = $arr_target;
         $arr_player_task['main_val'][$task_id]['dungeon_event_sid'] = $step_config['dungeon_event_sid'];
         $arr_player_task['main_val'][$task_id]['buff_id'] = $step_config['buff_id'];
         $arr_player_task['main_val'][$task_id]['btn_dialog'] = $step_config['btn_dialog'];
         $arr_player_task['current_chapter'] = $task_config['chapter_id'];
         $arr_player_task['current_chapter_part'] = $task_config['chapter_part'];
         $out['new'] = array('task_id' => $task_id, 'step' => $next_step, 'task_status' => $task_status, 'task_data' => $this->format_target($arr_target, $step_config['step_type']), 'index' => 1, 'cur_finish_num' => $arr_player_task['current_num'], 'task_seq' => 0, 'kill_npc_city_id' => 0, 'task_type' => 1, 'task_star' => 0);
         $logs[] = array('type' => 1, 'task_id' => $task_id, 'step' => $next_step, 'status' => $task_status);
         if ($step_config['step_type'] == 12) {
             $out_12['city_escort_map_sid'] = $step_config['city_id'];
             $out_12['city_escort_target_x'] = $step_config['pro_addr_x'];
             $out_12['city_escort_target_y'] = $step_config['pro_addr_y'];
             $pro_npc = explode("|", $step_config['pro_npc']);
             $out_12['city_escort_npc_sid'] = $pro_npc[0];
         }
         ##新手引导
         //            Com_Log::write('guide_'.$player_id,"task_id:{$task_id} task_main_next:".$step_config['guide_type']);
         if (!empty($step_config['guide_type'])) {
             $guides = explode("|", $step_config['guide_type']);
             foreach ($guides as $guide) {
                 //                    Com_Log::write('guide_'.$player_id,"task_id:{$task_id} task_main_next_guide:".$guide);
                 Protocol_Guide::add($guide, 1);
                 //                    Com_Log::write('task_guide.'.$player_id,"task main step guide:{$guide} task_guide:{$step_config['task_guide']}");
                 if ($step_config['task_guide'] == 1) {
                     $this->do_guide_task($player_id, $guide, 1, $arr_player_task, $out);
                 }
             }
         }
     }
     $career_type = $player_info['career_type'];
     $this->start_trans();
     $result = $this->get_data('PlayerTask')->set_task_info($player_id, $arr_player_task);
     //更新任务
     if ($result) {
         //领奖励
         $task_award_config = Cache_TaskAwardConfig::getInstance()->get_task_award_info($task_id, $step_id);
         if (!empty($task_award_config)) {
             $reward = array();
             if (!empty($task_award_config['prop_info'])) {
                 $prop_info = explode('|', $task_award_config['prop_info']);
                 foreach ($prop_info as $v) {
                     $prop = explode(':', $v);
                     if ($prop[0] > 100) {
                         $reward[] = array('type' => 'prop', 'item_id' => $prop[0], 'item_num' => $prop[1]);
                     } else {
                         $key = Cache_PropLoot::getInstance()->get_item_key($prop[0]);
                         if ($key != 'prop') {
                             $reward[] = array('type' => $key, 'item_id' => $prop[0], 'item_num' => $prop[1]);
                         }
                     }
                 }
             }
             $career_reward_key = "career_type_reward_{$career_type}";
             //                Com_Log::log("career_reward_key:".$career_reward_key,"task_award,log",1);
             if (isset($task_award_config[$career_reward_key]) && !empty($task_award_config[$career_reward_key])) {
                 $prop_info = explode('|', $task_award_config[$career_reward_key]);
                 foreach ($prop_info as $v) {
                     $prop = explode(':', $v);
                     if ($prop[0] > 100) {
                         $reward[] = array('type' => 'prop', 'item_id' => $prop[0], 'item_num' => $prop[1]);
                     } else {
                         $key = Cache_PropLoot::getInstance()->get_item_key($prop[0]);
                         if ($key != 'prop') {
                             $reward[] = array('type' => $key, 'item_id' => $prop[0], 'item_num' => $prop[1]);
                         }
                     }
                 }
             }
             //                Com_Log::log("prop:".var_export($reward,true),"task_award,log",1);
             if (!empty($reward)) {
                 $params = array('cmd_id' => '1002', 'func_id' => 1020, 'bind_flag' => 0, 'chapter' => $task_config['chapter_id'], 'map_id' => $cur_step_config['city_id']);
                 //                    Com_Log::log($params,"sysnotice.log",1);
                 //                    Com_Log::write("task_reward.".$player_id,"task_id:{$task_id} step:{$step_id} #".var_export($reward,true));
                 $result = $this->get_game('Reward')->send_reward($player_id, $reward, $params, 0);
                 if ($result !== true) {
                     if ($result == '80001') {
                         $result = "10018";
                     }
                     $this->throw_error($result);
                 }
             }
         }
     }
     if ($result && !empty($deduct_prop) && $cur_step_config['step_type'] != 11) {
         $arr_logs = array();
         foreach ($deduct_prop as $prop_id => $need_num) {
             $this->get_game('Prop')->deduct_prop_by_prop_id($player_id, $prop_id, $need_num, $arr_logs, 1, array('cmd_id' => 1010, 'level' => $player_info['level'], 'vip' => $player_info['vip'], 'privilege_level' => $player_info['privilege_level']));
         }
     }
     if ($result) {
         $this->commit();
         if (!empty($cur_step_config['unlock_skill_info'])) {
             $this->get_game('PlayerSkill')->flush_locked_skill($player_id, $player_info['career_type'], $cur_step_config['unlock_skill_info'], $player_info['level'], $arr_player_task['main_val'], $task_id, $step_id);
         }
         if ($dup_id2) {
             #开启副本
             //                Com_Log::write("fb_city.".$player_id,"main city:{$city_id}");
             $this->get_game('PlayerFB')->update_fb_chapter_data_interface($player_id, $dup_id2);
         }
         Protocol::input($player_id, 3, 10, 1002, array(0 => $out));
         //            Com_Log::write('task_1002.'.$player_id,"task_main_finish:".var_export($out,true));
         $this->get_game('Reward')->add_reward_log(false, 0, 1, $upgrade_async);
         if (isset($arr_logs) && !empty($arr_logs)) {
             Protocol_Prop::prop_806($player_id, $arr_logs);
         }
         $task_main_info = reset($arr_player_task['main_val']);
         $out_12['task_id'] = $task_main_info['task_id'];
         $out_12['task_step'] = $task_main_info['step'];
         if ($task_main_info['task_status'] == 1) {
             $out_12['task_start_status'] = 1;
         } else {
             $out_12['task_start_status'] = 0;
         }
         Protocol_Player::p2c_part_update($player_id, $out_12);
         #同步状态 分进程了 不能合下面skill_infos一起发了发了脏数据会乱
         //            Com_Log::write('out_12.'.$player_id,"trigger:".var_export($out_12,true));
         if ($reset_skill) {
             try {
                 $this->get_game('PlayerSkill')->default_set($player_id, $player_info);
                 Protocol_Player::p2c_part_update($player_id, array('skill_infos' => array()));
             } catch (Exception $e) {
                 //                    Com_Log::write("task_skill_reset","player_id:{$player_id} skill_def_set error");
             }
         }
         //            SynPlayer::set_syn_data($out_12);
         //            $data = SynPlayer::get_data();
         //            Protocol::input($player_id,7,4,417,array(0=>$data['m'],1=>$data['u']));
         if ($func_open_task_id) {
             $this->get_game('FuncOpen')->do_func_open($player_id, 1, $func_open_task_id);
             if ($func_open_task_id == 11071 || $func_open_task_id == 11045) {
                 $this->get_game('PlayerWing')->update_wing_activation_condition($player_id, 6, $func_open_task_id);
             }
             //                Com_Replication::asyn_call_func('PlayerTaskLog','data','add_player_task_log',array($player_id, $func_open_task_id)); #一步插入日志
         }
         # 公会成就处理
         $this->get_game('UnionAchieve')->async_trigger_union_achieve($player_id, 4, 1, 1, $player_info['union_id'] ? $player_info['union_id'] : 0);
         if ($logs) {
             Log_Task::getInstance()->add_multi_task_log($player_id, $player_info['level'], $player_info['vip'], $player_info['privilege_level'], $logs);
         }
         #推新手引导
         Protocol_Guide::out($player_id, $player_info);
     } else {
         $this->throw_error('10104');
     }
 }
Пример #19
0
 protected function add_prop_reward_log($func_id = 0)
 {
     //        Com_Log::log($this->arrPropLogs,"sysnotice.log",1);
     if (!empty($this->arrPropLogs)) {
         //            Com_Log::log($this->arrParams,"sysnotice.log",1);
         //            //同步到前端
         Protocol_Prop::prop_806($this->player_id, $this->arrPropLogs, $func_id);
         $arr_async = array();
         foreach ($this->arrPropLogs as $val) {
             if (isset($this->arrParams['func_id'])) {
                 $data['player_id'] = $this->player_id;
                 $data['func_id'] = $this->arrParams['func_id'];
                 $data['chapter'] = $this->arrParams['chapter'];
                 $data['map_id'] = $this->arrParams['map_id'];
                 $data['prop_id'] = $val['prop_id'];
                 $data['item_num'] = $val['item_num'];
                 $data['player_prop_id'] = $val['player_prop_id'];
                 $data['need_broad_cast'] = $val['need_broad_cast'];
                 $this->add_notice($data);
             }
             if (isset($val['overlay_num'])) {
                 $item_num = $val['overlay_num'];
             } else {
                 $item_num = $val['item_num'];
             }
             if ($val['type'] == 2 && $val['sub_type'] == 1) {
                 $arr_async['potion_hot_cnt'] += $item_num;
             }
             if ($val['type'] == 2 && $val['sub_type'] == 6) {
                 $arr_async['potion_dh_cnt'] += $item_num;
             }
             if ($val['type'] == 2 && $val['sub_type'] == 11) {
                 $arr_async['mp_potion_cnt'] += $item_num;
             }
             $this->_out_reward[$val['prop_id']] += $item_num;
             if (!isset($val['send_mail'])) {
                 #发邮件的不记录日志
                 Log_Common::getInstance()->add_prop_log($this->player_id, $this->arrParams['level'], $this->arrParams['vip'], $this->arrParams['privilege_level'], $this->arrParams['cmd_id'], 1, $val['player_prop_id'], $val['prop_id'], $val['type'], $val['name'], $val['quality'], $item_num, $val['level'], $val['item_num'] - $item_num, $val, $val['sub_type']);
             }
             Protocol_Reward::add($this->player_id, $val);
         }
         if ($arr_async) {
             Protocol_Player::p2c_part_update($this->player_id, $arr_async);
         }
     }
 }