Example #1
0
 public function finish_task($player_id, $task_id)
 {
     $task_info = $this->get_data('PlayerTask')->get_task_info($player_id, array('random_val', 'random_refresh_time'));
     $player_info = $this->get_data('Player')->get_player_info($player_id, array('level'));
     if (!isset($task_info['random_val'][$task_id]) && $task_info['random_val'][$task_id]['task_status'] < 2) {
         //            $this->throw_error('10107');//参数错误
         return;
     }
     $prop_info = $this->get_award($player_info['level'], $task_info['random_val'][$task_id]['quality'], $task_id);
     unset($task_info['random_val'][$task_id]);
     $this->start_trans();
     $result = true;
     if ($prop_info) {
         foreach ($prop_info as $v) {
             if ($v['id'] > 100) {
                 $reward[] = array('type' => 'prop', 'item_id' => $v['id'], 'item_num' => $v['num']);
             } else {
                 $key = Cache_PropLoot::getInstance()->get_item_key($v['id']);
                 if ($key != 'prop') {
                     $reward[] = array('type' => $key, 'item_id' => $v['id'], 'item_num' => $v['num']);
                 }
             }
         }
         $params = array('cmd_id' => '1023', 'bind_flag' => 0);
         $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) {
         $result = $this->get_data('PlayerTask')->set_task_info($player_id, array('random_val' => $task_info['random_val']));
     }
     if ($result) {
         $result = $this->get_data('PlayerTask')->set_random_task_count($player_id);
     }
     if ($result) {
         $this->commit();
         $this->get_game('Reward')->add_reward_log(true);
         //            Com_Log::write("get_task_random_list.".$player_id,var_export($task_info,true));
         return $this->get_task_random_list($player_id, $task_info, $player_info);
     } else {
         $this->rollback();
     }
     return array();
 }
Example #2
0
 /**
  * 完成引导任务
  * @param $player_id
  * @param $guide_id
  * @return array
  */
 public function finish_guide_task($player_id, $guide_id)
 {
     $arr_player_task = $this->get_data('PlayerTask')->get_task_info($player_id);
     if (empty($arr_player_task['guide_val'][$guide_id])) {
         $this->throw_error('10107');
         //参数错误
     }
     if ($arr_player_task['guide_val'][$guide_id]['task_status'] < 2) {
         $this->throw_error('10015');
         //任务还未完成
     }
     $result = true;
     $out_1002 = array();
     $index = 0;
     $this->start_trans();
     $task_guide_config = Cache_TaskGuide::getInstance()->get_task_guide($guide_id);
     if (empty($task_guide_config)) {
         $this->throw_error('10107');
         //参数错误
     }
     if ($task_guide_config['reward']) {
         $prop_info = explode('|', $task_guide_config['reward']);
         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]);
                 }
             }
         }
         $params = array('cmd_id' => '1018', 'bind_flag' => 0);
         $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) {
         $target = $this->format_guide_target($arr_player_task['guide_val'][$guide_id]['target']);
         $out_1002['old'] = array('task_id' => $guide_id, 'step' => 1, 'task_status' => 3, 'task_data' => $target, 'index' => ++$index, 'cur_finish_num' => 0, 'task_seq' => 0, 'kill_npc_city_id' => 0, 'task_type' => 4, 'task_star' => 0);
         unset($arr_player_task['guide_val'][$guide_id]);
         if (!empty($task_guide_config['next_guide_id'])) {
             $o = array();
             $next_guides = explode('|', $task_guide_config['next_guide_id']);
             foreach ($next_guides as $next_guide_id) {
                 $this->do_guide_task($player_id, $next_guide_id, 1, $arr_player_task, $o);
             }
         }
         $result = $this->get_data('PlayerTask')->set_task_info($player_id, array('guide_val' => $arr_player_task['guide_val'], 'guide_target_val' => $arr_player_task['guide_target_val']));
         //更新任务
     }
     if ($result) {
         $this->commit();
         $this->get_game('Reward')->add_reward_log(true);
         if (!empty($arr_player_task['main_val'])) {
             $current_num = intval($arr_player_task['current_num']);
             foreach ($arr_player_task['main_val'] as $key => $val) {
                 $target = $this->format_target($val['target'], $val['step_type']);
                 $out_1002[] = array('task_id' => $val['task_id'], 'step' => $val['step'], 'task_status' => $val['task_status'], 'task_data' => $target, 'index' => ++$index, 'cur_finish_num' => $current_num, 'task_seq' => 0, 'kill_npc_city_id' => 0, 'task_type' => 1, 'task_star' => 0);
             }
         }
         //支线任务的
         if (!empty($arr_player_task['daily_val'])) {
             foreach ($arr_player_task['daily_val'] as $key => $val) {
                 if ($val['task_status'] == 1 || $val['task_status'] == 2) {
                     if (empty($val['task_id'])) {
                         continue;
                     }
                     # 数据脏的时候可能没有任务ID,跳过,提高兼容
                     $target = $this->format_target($val['target'], $val['step_type']);
                     $out_1002[] = array('task_id' => $val['task_id'], 'step' => $val['step'], 'task_status' => $val['task_status'], 'task_data' => $target, 'index' => ++$index, 'cur_finish_num' => 0, 'task_seq' => $key, 'kill_npc_city_id' => $val['kill_npc_sid'], 'task_type' => 3, 'task_star' => $val['star']);
                 }
             }
         }
         if (!empty($arr_player_task['guide_val'])) {
             foreach ($arr_player_task['guide_val'] as $key => $val) {
                 if (empty($val['guide_id'])) {
                     continue;
                 }
                 $target = $this->format_guide_target($val['target']);
                 $out_1002[] = array('task_id' => $val['guide_id'], 'step' => 1, 'task_status' => $val['task_status'], 'task_data' => $target, 'index' => ++$index, 'cur_finish_num' => 0, 'task_seq' => 0, 'kill_npc_city_id' => 0, 'task_type' => 4, 'task_star' => 0);
             }
         }
         Protocol::input($player_id, 3, 10, 1002, array(0 => $out_1002));
         return array('result' => 1);
     }
     return array('result' => 0);
 }
Example #3
0
 /**
  * 购买特惠礼包
  * @param int player_id 玩家id
  * @param int gid 礼包id
  * @return array
  */
 public function gift_package_buy($player_id, $gid)
 {
     $player_id = intval($player_id);
     $gid = intval($gid);
     if (!$gid) {
         $this->throw_error(10107, 6010077);
     }
     //获取奖励配置
     if (!($set_gift_package = Cache_NewServerActivity::getInstance()->get_gift_package($gid))) {
         $this->throw_error(6010045, 6010052);
     }
     //是否已买过
     $activity_player = $this->get_data('NewServerActivity')->get_player_info($player_id, array('gift_info'));
     if (isset($activity_player['gift_info']) && is_array($activity_player['gift_info']) && in_array($gid, $activity_player['gift_info'])) {
         $this->throw_error(6010053);
     }
     if (!is_array($activity_player['gift_info'])) {
         $activity_player['gift_info'] = array();
     }
     $activity_player['gift_info'][] = $gid;
     $pinfo = $this->get_data('Player')->get_player_info($player_id, Com_Util::get_player_fields(array('currency', 'career_type')));
     $costs = explode(':', $set_gift_package['price']);
     $item_id = $costs[0];
     $cost_num = $costs[1];
     $item_key = Cache_PropLoot::getInstance()->get_item_key($item_id);
     $career_type = $pinfo['career_type'];
     $reward = array();
     $rewards = explode('|', $set_gift_package['item_info']);
     foreach ($rewards as $value) {
         $tmp = explode(':', $value);
         if (count($tmp) > 1) {
             if ($career_type && isset($tmp[2]) && $tmp[2] && $career_type != $tmp[2]) {
                 continue;
             }
             $reward[] = array('type' => Cache_Currency::getInstance()->get_key($tmp[0]), 'item_id' => $tmp[0], 'item_num' => $tmp[1]);
         } else {
             $this->throw_error(10222, 6010054);
         }
     }
     $up_arr = array('player_id' => $player_id, 'gift_info' => $activity_player['gift_info']);
     $arr_consume = Com_Util::get_consume_info_for_data_center($pinfo, $item_key, $cost_num, 1, $item_id);
     $this->get_data('Player')->check_player_resource($player_id, $pinfo, '-', $item_key, $cost_num, 1, $item_id);
     $this->start_trans();
     $re = $this->get_data('Player')->update_player_resource($player_id, $pinfo, 2313, array(), $arr_consume);
     $this->write_check($re, 6010055);
     $re = $this->get_data('NewServerActivity')->update_player_info($player_id, $up_arr);
     $this->write_check($re, 6010056);
     $re = $this->get_game('Reward')->send_reward($player_id, $reward, array('cmd_id' => 2313, 'bind_flag' => 0));
     $this->write_check_strict($re, 6010057);
     $this->commit();
     $this->get_game('Reward')->add_reward_log(true);
     $data = $this->get_gift_package_panel($player_id);
     Protocol::input($player_id, 8, 23, 2312, $data);
     return array('res' => 1);
 }
Example #4
0
 /**
  * 获取单次怪物奖励道具
  * @param $get_times 道具获取次数
  * @param $sweep_info 扫荡信息
  */
 private function get_monster_prop_list($get_times, $sweep_info)
 {
     #$fb_id = $sweep_info['fb_id'];
     #$fb_exp = $sweep_info['exp'];
     $prop_data['lap_list'] = $sweep_info['lap_list'];
     $prop_data['send_list'] = $sweep_info['send_list'];
     $prop_data['show_list'] = $sweep_info['show_list'];
     $record_list = $sweep_info['record_list'];
     $monster_info = $sweep_info['monster_info'];
     $monster_exp = $sweep_info['monster_exp'];
     if (Com_Array::is_good_arr($monster_info)) {
         #随机获取怪物掉落道具
         foreach ($monster_info as $key => $monster) {
             if ($get_times < 1) {
                 break;
             }
             $prop_data['record_list'] = array();
             $m_id = $monster[0];
             $m_exp = $monster[1];
             $m_loot = $monster[2];
             if (Com_Array::is_good_arr($m_loot)) {
                 foreach ($m_loot as $loot_id) {
                     #获取掉落库随随机道具
                     $prop_info = Cache_PropLoot::getInstance()->get_prop_loot($loot_id, $sweep_info['career_type']);
                     if (Com_Array::is_good_arr($prop_info)) {
                         #过滤30-200之间的道具
                         foreach ($prop_info as $keys => $prop) {
                             if ($prop['item_id'] > 30 && $prop['item_id'] < 200) {
                                 unset($prop_info[$keys]);
                             }
                         }
                     }
                     #道具整合
                     $prop_data = $this->prop_integration($prop_data['lap_list'], $prop_data['send_list'], $prop_data['show_list'], $prop_data['record_list'], $prop_info);
                 }
             }
             #道具记录整合
             $record_list = $this->prop_record_integration($record_list, $m_id, $m_exp, $prop_data['record_list'], $sweep_info['sweep_times'] + 1, 0);
             $monster_exp += $m_exp;
             unset($monster_info[$key]);
             $get_times--;
         }
     }
     $prop_data['record_list'] = $record_list;
     $prop_data['monster_info'] = $monster_info;
     $prop_data['monster_exp'] = $monster_exp;
     return $prop_data;
 }
Example #5
0
 public function get_event_reward($player_id, $event_id, $reward_id, $event_template)
 {
     $this->param_check_numeric(array($player_id, $event_id, $reward_id));
     # 加锁失败
     if (!Com_Lock::lock("lock|get_event_reward|player_id={$player_id}")) {
         $this->throw_error('170501');
         # 系统繁忙
     }
     $player_info = $this->get_data('Player')->get_player_info($player_id, Com_Util::get_player_fields(array('currency', 'level', 'vip', 'privilege_level', 'map_id')));
     if ($player_info['map_id'] == 2100) {
         $this->throw_error('12012');
         # 请在完成序章后领取
     }
     # 获取活动配置
     $event_info = $this->get_data('Event')->get_event_info($event_id);
     if (empty($event_info) || empty($event_info['event_reward_info'])) {
         $this->throw_error('12004');
         # 无效的活动,未找到活动配置信息
     }
     $reward_id_array = explode(':', $event_info['event_reward_info']);
     if (!in_array($reward_id, $reward_id_array)) {
         $this->throw_error('12006');
         # 无效的奖励,未找到活动奖励配置信息
     }
     # NOTE: 因为允许在活动结束后领奖,所以领奖时不用活动开启时间段[open_date_head,open_date_tail]做检测
     if ($event_info['reward_date_head'] > $this->current_time || $event_info['reward_date_tail'] < $this->current_time) {
         $this->throw_error('12005');
         # 未到或已超过活动奖励领取时间
     }
     # 获取奖励配置
     $reward_info = $this->get_data('Event')->get_reward_info($reward_id);
     if (empty($reward_info) || empty($reward_info['cond_func'])) {
         $this->throw_error('12006');
         # 无效的奖励,未找到活动奖励配置信息
     }
     if (!empty($reward_info['valid_date_head']) || !empty($reward_info['valid_date_tail'])) {
         if ($reward_info['valid_date_head'] > $this->current_time || $reward_info['valid_date_tail'] < $this->current_time) {
             $this->throw_error('12007');
             # 未到或已超过活动奖励有效时间
         }
     }
     /**
     		# --------------------------------------------------------------------
     		# 活动领奖周期内的领奖次数上限判断
     		# --------------------------------------------------------------------
     		if (!empty($event_info['event_reward_stint']) && !empty($event_info['event_reward_cycle'])) {
     			# 向上取整获取最大领奖期数
     			$max_cycle = ceil(($event_info['reward_date_tail'] - $event_info['reward_date_head']) / $event_info['event_reward_cycle']);
     			for($i = 1; $i <= $max_cycle; $i++) {
     				$cycle_head = $event_info['reward_date_head'] + $event_info['event_reward_cycle'] * ($i - 1); 	# 领奖周期首部时间
     				$cycle_tail = $event_info['reward_date_head'] + $event_info['event_reward_cycle'] * $i - 1;		# 领奖周期尾部时间,减一是为了相邻两个区间没有交集
     				if ($this->current_time < $cycle_head || $this->current_time > $cycle_tail) { # 当前时间不在该领奖周期内
     					continue; 
     				} else {
     					# 获取该周期内的领奖次数
     					list($reward_record, $reward_record_count) = $this->get_data('Event')->get_event_reward_record_part($player_id, $event_id, $cycle_head, $cycle_tail);
     					if ($reward_record_count >= $event_info['event_reward_stint']) {
     						$this->throw_error('12008'); # 已达到活动领奖周期内的领取次数上限
     					}
     					break;
     				}
     			}
     		}
     
     		# --------------------------------------------------------------------
     		# 奖励领奖周期内的领奖次数上限判断,NOTO:没有考虑循环奖励的领取上限不仅由reward_gain_stint决定,还由循环达成数loop_num决定
     		# --------------------------------------------------------------------
     		if (!empty($reward_info['reward_gain_stint']) && !empty($reward_info['reward_gain_cycle'])) {
     			# 向上取整获取最大领奖期数
     			$max_cycle = ceil(($event_info['reward_date_tail'] - $event_info['reward_date_head']) / $reward_info['reward_gain_cycle']);
     			for($i = 1; $i <= $max_cycle; $i++) {
     				$cycle_head = $event_info['reward_date_head'] + $reward_info['reward_gain_cycle'] * ($i - 1); 	# 领奖周期首部时间
     				$cycle_tail = $event_info['reward_date_head'] + $reward_info['reward_gain_cycle'] * $i - 1;		# 领奖周期尾部时间,减一是为了相邻两个区间没有交集
     				if ($this->current_time < $cycle_head || $this->current_time > $cycle_tail) { # 当前时间不在该领奖周期内
     					continue; 
     				} else {
     					# 获取该周期内的领奖次数
     					list($reward_record, $reward_record_count) = $this->get_data('Event')->exactly_get_event_reward_record_part($player_id, $event_id, $reward_id, $cycle_head, $cycle_tail);
     					if ($reward_record_count >= $reward_info['reward_gain_stint']) {
     						$this->throw_error('12009'); # 已达到奖励领奖周期内的领取次数上限
     					}
     					break;
     				}
     			}
     		}
     		**/
     # 进度计算
     $sys_params = array('event_id' => $event_info['event_id'], 'announce_date_head' => $event_info['announce_date_head'], 'announce_date_tail' => $event_info['announce_date_tail'], 'open_date_head' => $event_info['open_date_head'], 'open_date_tail' => $event_info['open_date_tail'], 'reward_id' => $reward_info['reward_id'], 'reward_type' => $reward_info['reward_type'], 'reward_billing_cycle' => $reward_info['reward_billing_cycle']);
     $ret = $this->call_cond_func($player_id, $reward_info['cond_func'], $reward_info['cond_func_relation'], $sys_params);
     # 剩余领奖次数计算
     list($real_remain_gain_num, $reward_remain_gain_num, $config_gain_stint) = $this->_cal_reward_remain_gain_num($player_id, $event_info, $reward_info, $ret);
     if (empty($real_remain_gain_num)) {
         $this->throw_error('12009');
         # 已达到奖励领奖周期内的领取次数上限
     }
     # --------------------------------------------------------------------
     # 奖励达成条件判断
     # --------------------------------------------------------------------
     # 进度计算
     $sys_params = array('event_id' => $event_info['event_id'], 'announce_date_head' => $event_info['announce_date_head'], 'announce_date_tail' => $event_info['announce_date_tail'], 'open_date_head' => $event_info['open_date_head'], 'open_date_tail' => $event_info['open_date_tail'], 'reward_id' => $reward_info['reward_id'], 'reward_type' => $reward_info['reward_type'], 'reward_billing_cycle' => $reward_info['reward_billing_cycle']);
     $ret = $this->call_cond_func($player_id, $reward_info['cond_func'], $reward_info['cond_func_relation'], $sys_params);
     if (empty($ret['status'])) {
         $this->throw_error('12010');
         # 未达到奖励的领取条件
     }
     # --------------------------------------------------------------------
     # 发奖 + 消耗道具 + 并刷新奖励信息
     # --------------------------------------------------------------------
     $this->start_trans();
     # 消耗道具
     if (!empty($reward_info['consume_info'])) {
         $consume_currency = false;
         $arr_logs_consume = array();
         $reward_item_info_arr = explode("|", $reward_info['consume_info']);
         $log_param = array('level' => $player_info['level'], 'vip' => $player_info['vip'], 'privilege_level' => $player_info['privilege_level'], 'cmd_id' => 2304);
         foreach ($reward_item_info_arr as $item_info) {
             list($item_id, $item_num) = explode(":", $item_info);
             $item_key = Cache_PropLoot::getInstance()->get_item_key($item_id);
             if ($item_key == 'prop') {
                 # 消耗道具
                 # deduct_prop_by_prop_id方法中有判断道具是否足够,故外层不判断
                 $re = $this->get_game('Prop')->deduct_prop_by_prop_id($player_id, $item_id, $item_num, $arr_logs_consume, 0, $log_param);
                 $this->write_check($re, 3010311);
             } else {
                 # 消耗资源
                 $arr_consume = Com_Util::get_consume_info_for_data_center($player_info, $item_key, $item_num);
                 $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $item_key, $item_num, 1, $item_id);
                 $consume_currency = true;
             }
         }
         if ($consume_currency) {
             $re = $this->get_data('Player')->update_player_resource($player_id, $player_info, '2304', array(), $arr_consume);
             $this->write_check($re, 3010332);
         }
     }
     # 奖励道具
     $reward = array();
     $reward_detail = array();
     if (!empty($reward_info['reward_info'])) {
         $reward_item_info_arr = explode("|", $reward_info['reward_info']);
         foreach ($reward_item_info_arr as $item_info) {
             list($item_id, $item_num, $item_tag) = explode(":", $item_info);
             $reward_detail[$item_id] = $item_num;
         }
     }
     $this->get_game('Reward')->gen_reward_array($reward_detail, $reward);
     $re = $this->get_game('Reward')->send_reward($player_id, $reward, array('cmd_id' => '2304', 'bind_flag' => 0));
     $this->write_check_strict($re, 3010347);
     # 记录奖励领取日志
     $re = $this->get_data('Event')->record_player_event_reward($player_id, $event_id, $reward_id, $this->current_time);
     $this->write_check($re, 3010351);
     $this->commit();
     # 蛋疼的次数同步埋点
     if ($event_template == 2) {
         # 充值回馈需要同步次数变更
         $this->get_game('PlayerFunc')->sync_func_tips($player_id, 1260);
     }
     # 粘806 + 通知道具变更信息
     $ndata = array();
     if (!empty($arr_logs_consume)) {
         foreach ($arr_logs_consume as $k => $v) {
             # 消耗的道具
             $ndata[] = $v;
         }
         Protocol_Prop::prop_806($player_id, $ndata);
     }
     # 该方法会自动推送843协议告知前端显示奖励信息,会调用prop_806协议通知道具变更,调用p2c_part_update通知人物信息变更
     $ret = $this->get_game('Reward')->add_reward_log(true);
     #-----------------------------------------------------------------
     # 重新获取奖励项列表
     #-----------------------------------------------------------------
     $event_reward_list = array();
     $special_reward_list = array();
     if (!empty($event_info['event_reward_info'])) {
         $reward_id_array = explode(':', $event_info['event_reward_info']);
         #echo "</br>===============".$event_info['event_id']."==================</br>";
         #var_export($reward_id_array);
         $reward_info = $this->get_data('Event')->multi_get_reward_info($reward_id_array);
         #var_export($reward_info);
         # 对奖励列表升序排序
         Com_Array::multisort($reward_info, array('reward_priority' => 'asc'));
         foreach ($reward_info as $reward) {
             #echo "</br>===============reward_id:".$reward['reward_id']."==================</br>";
             # 获取奖励的具体道具列表
             $reward_item_list = array();
             if (!empty($reward['reward_info'])) {
                 $reward_item_info_arr = explode("|", $reward['reward_info']);
                 foreach ($reward_item_info_arr as $item_info) {
                     list($item_id, $item_num, $item_tag) = explode(":", $item_info);
                     $item_config = Cache_Prop::getInstance()->get_prop_info($item_id);
                     $item_config['item_num'] = $item_num;
                     $item_struct = Struct_Prop::get_prop_struct($item_config);
                     $reward_item_list[$item_id] = $item_struct;
                     if ($item_tag == $this->reward_item_tag_for_special) {
                         $special_reward_list[$item_id] = $item_struct;
                     }
                 }
             }
             # 进度计算
             $sys_params = array('event_id' => $event_info['event_id'], 'announce_date_head' => $event_info['announce_date_head'], 'announce_date_tail' => $event_info['announce_date_tail'], 'open_date_head' => $event_info['open_date_head'], 'open_date_tail' => $event_info['open_date_tail'], 'reward_id' => $reward['reward_id'], 'reward_type' => $reward['reward_type'], 'reward_billing_cycle' => $reward['reward_billing_cycle']);
             $ret = $this->call_cond_func($player_id, $reward['cond_func'], $reward['cond_func_relation'], $sys_params);
             # 剩余领奖次数计算
             list($real_remain_gain_num, $reward_remain_gain_num, $config_gain_stint) = $this->_cal_reward_remain_gain_num($player_id, $event_info, $reward, $ret);
             # 领奖状态判定
             if ($event_info['reward_date_head'] > $this->current_time || $event_info['reward_date_tail'] < $this->current_time) {
                 $reward_status = 0;
                 # 未到或已超过活动奖励领取时间
             } elseif ((!empty($reward['valid_date_head']) || !empty($reward['valid_date_tail'])) && ($reward['valid_date_head'] > $this->current_time || $reward['valid_date_tail'] < $this->current_time)) {
                 $reward_status = 0;
                 # 未到或已超过活动奖励有效时间
             } elseif (empty($real_remain_gain_num)) {
                 # 用实际剩余领奖次数判断领奖状态
                 $reward_status = 0;
             } else {
                 $reward_status = $ret['status'];
             }
             # 可领奖总数计算
             if ($reward_status) {
                 $can_receive_reward_num += 1;
             }
             $event_reward_list[] = array('reward_id' => $reward['reward_id'], 'reward_cond' => $reward['cond_desc'], 'reward_item_list' => $reward_item_list, 'reward_progress_head' => $ret['progress_head'], 'reward_progress_tail' => $ret['progress_tail'], 'reward_remain_gain_num' => $reward_remain_gain_num, 'reward_status' => $reward_status, 'reward_type' => $reward['reward_type'], 'consume_info' => $reward['consume_info'], 'reward_gain_stint' => $config_gain_stint);
         }
     }
     $out_2304 = array('event_tag' => $event_info['event_tag'], 'event_id' => $event_id, 'event_reward_list' => $event_reward_list, 'event_template' => $event_template);
     # 记录行为
     Com_Log::write('xgame.event', "{$player_id}\t" . "get_event_reward\t" . "{$event_id}\t" . "{$reward_id}\t");
     return $out_2304;
 }
Example #6
0
 public function roles_attacker_of_resource_fight($out, $roles_attacker_of_resource_fight, $npc_add_exp)
 {
     return false;
     if (!Com_Array::is_good_arr($roles_attacker_of_resource_fight)) {
         return false;
     }
     //Com_Log::write('xgame.autoPveRoles',var_export($roles_attacker_of_resource_fight,true));
     $drop_reward = array();
     //保存杀怪奖励挂机副本用
     foreach ($roles_attacker_of_resource_fight as $player_id) {
         $playerDailyTimeInfo = $this->get_data("PlayerDailyTime")->get_player_used_time($player_id, array("auto_pve_12hour_left_time"));
         //if(intval($playerDailyTimeInfo["auto_pve_12hour_left_time"])>0){
         $player_info = $this->get_data('Player')->get_player_info($player_id, array("map_id", 'level', 'career_type'));
         $common_drop = Cache_ResourceFightPropLoot::getInstance()->get_resource_fight_prop_loot($player_info['level']);
         $arr_item = array();
         if ($common_drop > 0) {
             $item = Cache_PropLoot::getInstance()->get_prop_loot($common_drop, $player_info['career_type']);
             if ($item) {
                 $arr_item = array_merge($arr_item, $item);
             }
         }
         if ($arr_item) {
             foreach ($arr_item as $val) {
                 $drop_reward[$val['item_id']] = array('type' => Cache_FbLoot::getInstance()->get_item_key($val['item_id']), 'item_id' => $val['item_id'], 'item_num' => $val['item_num']);
             }
         }
         $this->get_game('AutoPve')->async_trigger_auto_pve($player_id, $npc_add_exp, $roles_attacker_of_resource_fight, $drop_reward);
         //}
         $out['loots'][] = array();
         $out['silver'][] = 0;
         $out['exp'][] = 0;
         $out['mojos'][] = 0;
     }
     return $out;
 }
Example #7
0
 public function finish_task_chain($player_id, $param)
 {
     $arr_player_task = $this->get_data('PlayerTask')->get_task_info($player_id, array('chain_val', 'target_val'));
     $chain_val = $arr_player_task['chain_val'];
     if (empty($chain_val) || $chain_val['task_status'] < 2) {
         //            $this->throw_error('10107','1012015011');//参数错误
         return;
     }
     $player_info = $this->get_data('Player')->get_player_info($player_id, array('name', 'career_type', 'level', 'exp', 'level_exp', 'silver', 'gold', 'ticket', 'chips', 'honor', 'kf_coin', 'vip', 'crystal', 'fame', 'fame_level', 'fame_level_exp', 'kf_score', 'privilege_level', 'bag_num', 'union_id', 'feather_unicorn', 'battle_score', 'kf_score'));
     $finish_num = $this->get_data('PlayerTask')->get_chain_task_count($player_id);
     $daily_finish_num = $this->get_data('PlayerTask')->get_chain_task_daily_count($player_id);
     //        $cur_step_config = Cache_TaskStepConfig::getInstance()->get_task_step_config($chain_val['task_id'],$chain_val['task_step']);
     if ($chain_val['buff_id']) {
         Protocol::input($player_id, 7, 4, 496, array('status' => 0, 'buff_id' => $chain_val['buff_id']));
     }
     //buff结束
     $this->start_trans();
     $prop_info = $this->get_reward($player_info['level'], $finish_num);
     $reward = array();
     if ($prop_info) {
         foreach ($prop_info as $key => $val) {
             if ($val['id'] > 100) {
                 $reward[] = array('type' => 'prop', 'item_id' => $val['id'], 'item_num' => $val['num']);
             } else {
                 $key = Cache_PropLoot::getInstance()->get_item_key($val['id']);
                 if ($key != 'prop') {
                     $reward[] = array('type' => $key, 'item_id' => $val['id'], 'item_num' => $val['num']);
                 }
             }
         }
     }
     if ($reward) {
         $params = $player_info;
         $params['cmd_id'] = 1026;
         $params['bind_flag'] = 0;
         $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 (!empty($chain_val['target'])) {
         foreach ($chain_val['target'] as $target_id => $val) {
             $this->get_game('TaskTrigger')->clear_chain_task_target_val($arr_player_task, $chain_val['task_id'], $chain_val['step_type'], $target_id);
             #清理target_val
         }
     }
     if ($finish_num <= $this->_max_task_num) {
         $task_id = $this->get_random_chain_task_id($player_info['level'], $finish_num);
         if (!empty($task_id)) {
             $arr_player_task = $this->get_init_chain_val($player_id, $task_id, 1, $arr_player_task);
         } else {
             $arr_player_task['chain_val'] = array();
         }
     } else {
         $arr_player_task['chain_val'] = array();
     }
     $result = $this->get_data('PlayerTask')->set_task_info($player_id, array('chain_val' => $arr_player_task['chain_val'], 'target_val' => $arr_player_task['target_val']));
     if ($result) {
         $result = $this->get_data('PlayerTask')->set_chain_task_count($player_id);
         $finish_num += 1;
     }
     if ($result) {
         $result = $this->get_data('PlayerTask')->set_chain_task_daily_count($player_id);
         $daily_finish_num += 1;
     }
     if ($result) {
         $this->commit();
         $this->get_game('Reward')->add_reward_log(true);
     } else {
         $this->rollback();
     }
     //        $finish_num = $finish_num > $this->_max_task_num ? $this->_max_task_num:$finish_num;
     return $this->get_chain_task_list($player_id, $arr_player_task, $player_info, $finish_num, $daily_finish_num);
 }
Example #8
0
 private function _check_player_prop_hold_info($player_id, $item_id, $min_cond, $max_cond)
 {
     $ret = array('status' => 0, 'progress_head' => 0, 'progress_tail' => 0);
     $item_key = Cache_PropLoot::getInstance()->get_item_key($item_id);
     if ($item_key == 'prop') {
         # 道具
         $item_hold_num = $this->get_game('Prop')->get_prop_num_by_prop_id($player_id, $item_id);
         # 没有时会返回NULL
         $ret = $this->_cal_progress(intval($item_hold_num), $min_cond);
     } else {
         # 虚拟货币
         if ($item_id == 20) {
             $player_info = $this->get_data('Player')->get_player_info($player_id, array('gold', 'ticket'));
             $ret = $this->_cal_progress($player_info['gold'] + $player_info['ticket'], $min_cond);
         } else {
             $player_info = $this->get_data('Player')->get_player_info($player_id, array($item_key));
             $ret = $this->_cal_progress($player_info[$item_key], $min_cond);
         }
     }
     return $ret;
 }
Example #9
0
 public function get_compensation_reward($player_id, $star = 2, $sid = null, $chapter_info = null, $c_list = null, $player_info = null)
 {
     if (is_null($chapter_info)) {
         $player_id = intval($player_id);
         $old_info = $this->get_data('PlayerPve')->get_player_fb_info($player_id);
         //玩家最后通关信息
         $chapter_info = json_decode($old_info['chapter_info'], true);
     }
     if (is_null($sid)) {
         $sid = 0;
         if (!empty($chapter_info)) {
             foreach ($chapter_info as $val) {
                 if ($val['sid'] > $sid) {
                     $sid = $val['sid'];
                 }
             }
         }
     }
     if (is_null($c_list)) {
         $c_list = Cache_PlayerPve::getInstance()->get_pev_sid($sid);
         //挑战副本信息
     }
     if ($sid) {
         #vip特权加成
         if (is_null($player_info)) {
             $player_info = $this->get_data('Player')->get_player_info($player_id, array('vip', 'player_id', 'gm', 'is_dummy', 'privilege_level', 'career_type'));
         }
         $vip_exp = 0;
         if ($player_info['privilege_level'] > 0) {
             $left_cd = $this->get_game('VipSpecial')->get_left_time($player_id);
             if ($left_cd > 0) {
                 $vip_set = Cache_VipLevelLimit::getInstance()->get_limit_info($player_info['privilege_level'], 10063);
                 if (!empty($vip_set)) {
                     $vip_exp = $vip_set['max_times'];
                 }
             }
         }
         $reward = array();
         $reward[] = array('type' => 'exp', 'item_id' => 1, 'item_num' => ($vip_exp / 10000 + 1) * $c_list[0]['exp']);
         $loot_id = array();
         if (2 == $star) {
             $loot_id = explode('|', $c_list[0]['loot_id_2']);
         } elseif (3 == $star) {
             $loot_id = explode('|', $c_list[0]['loot_id_3']);
         } elseif (1 == $star) {
             $loot_id = explode('|', $c_list[0]['loot_id']);
         }
         if (!empty($loot_id)) {
             foreach ($loot_id as $l_id) {
                 $loots = explode(':', $l_id);
                 if (count($loots) > 1) {
                     if ($loots[1] == 1) {
                         $temp = Cache_PropLoot::getInstance()->get_prop_loot($loots[0], $player_info['career_type']);
                     } else {
                         $temp = Cache_PropLoot::getInstance()->get_prop_loot($loots[0]);
                     }
                 } else {
                     $temp = Cache_PropLoot::getInstance()->get_prop_loot($loots[0]);
                 }
                 if (!empty($temp)) {
                     foreach ($temp as $v) {
                         $reward[] = $v;
                     }
                 }
             }
         }
         return $reward;
     } else {
         return array();
     }
 }
Example #10
0
 public function gen_reward_array($reward_detail, &$reward, $coeff = 1)
 {
     if (!empty($reward_detail)) {
         foreach ($reward_detail as $item_idx => $item_num) {
             $item_key = Cache_PropLoot::getInstance()->get_item_key($item_idx);
             $item_num = ceil($item_num * $coeff);
             if ($item_key == 'prop') {
                 $reward[] = array('type' => $item_key, 'item_id' => $item_idx, 'item_num' => $item_num);
             } else {
                 $reward[] = array('type' => $item_key, 'item_id' => $item_idx, 'item_num' => $item_num);
             }
         }
     }
 }
Example #11
0
 /**
  * 获取离线奖励
  * @param int player_id 玩家id
  * @param int type 领取类型 1,基本;2,两倍;3,三倍
  */
 public function get_reward($player_id, $type)
 {
     $player_id = intval($player_id);
     if (!in_array($type, array(1, 2, 3))) {
         //参数错误
         $this->throw_error(10107, 6010018);
     }
     $pinfo = $this->get_data('Player')->get_player_info($player_id, Com_Util::get_player_fields(array('currency', 'level', 'vip', 'last_offline_time', 'offline_reward_status')));
     if (2 == $pinfo['offline_reward_status']) {
         //已领取
         $this->throw_error(6010019);
     }
     if (!$pinfo['last_offline_time'] || 0 == $pinfo['offline_reward_status']) {
         //不可领
         $this->throw_error(6010020);
     }
     if ($pinfo['last_offline_time'] < $this->_reward_min_time) {
         $this->throw_error(6010020, 6010021);
     }
     $vip_set = Cache_VipLevelLimit::getInstance()->get_limit_info($pinfo['vip'], 10050);
     $vip_time = 1;
     if (!empty($vip_set)) {
         $vip_time = $vip_set['max_times'];
     }
     if (2 == $type && $vip_time < 2) {
         $this->throw_error(6010020);
     }
     if (3 == $type && $vip_time < 3) {
         $this->throw_error(6010020);
     }
     $offline_time = min($this->_reward_max_time, $pinfo['last_offline_time']);
     $ret = $this->get_exp($pinfo['level'], $offline_time);
     $exp = $ret['exp'];
     $cost = $ret['cost'];
     if (!$cost) {
         $this->throw_error(10222, 6010095);
     }
     $silver = $this->get_silver($offline_time);
     $reward[] = array('type' => Cache_Currency::getInstance()->get_key(1), 'item_id' => 1, 'item_num' => $exp * $type);
     $reward[] = array('type' => Cache_Currency::getInstance()->get_key(3), 'item_id' => 3, 'item_num' => $silver * $type);
     $this->start_trans();
     if (3 == $type) {
         $item_id = 20;
         $item_num = $cost;
         $item_key = Cache_PropLoot::getInstance()->get_item_key($item_id);
         $arr_consume = Com_Util::get_consume_info_for_data_center($pinfo, $item_key, $item_num, 1, $item_id);
         $this->get_data('Player')->check_player_resource($player_id, $pinfo, '-', $item_key, $item_num, 1, $item_id);
         $re = $this->get_data('Player')->update_player_resource($player_id, $pinfo, '2014', array(), $arr_consume);
         $this->write_check($re, 6010023);
     }
     $this->get_data('Player')->update_player_info($player_id, array('offline_reward_status' => 2));
     //更新状态
     $re = $this->get_game('Reward')->send_reward($player_id, $reward, array('cmd_id' => '2014', 'bind_flag' => 0));
     $this->write_check_strict($re, 6010024);
     $this->commit();
     $this->get_game('Reward')->add_reward_log(true);
     //修改数字
     $this->get_game('PlayerFunc')->sync_func_tips($player_id, 1130);
     return array('res' => 1, 'reward_list' => $reward);
 }