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(); }
/** * 完成引导任务 * @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); }
/** * 购买特惠礼包 * @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); }
/** * 获取单次怪物奖励道具 * @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; }
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; }
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; }
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); }
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; }
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(); } }
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); } } } }
/** * 获取离线奖励 * @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); }