예제 #1
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;
 }
예제 #2
0
파일: Hero.php 프로젝트: bluefan/phpsource
 /**
  * @Purpose:
  * 提升英雄成长值
  * @Param $player_id 
  * @Param $hero_id
  * @Param $state 0普通提升 1批量提升
  * @Param $auto 为1时表示道具不足时从上次自动购买道具
  */
 public function player_hero_grow_upgrade($player_id, $hero_id, $state, $auto = 0)
 {
     $player_id = intval($player_id);
     $hero_id = strval($hero_id);
     $obj_player_hero_data = $this->get_data('PlayerHero');
     $hero_data = $obj_player_hero_data->get_player_hero_info($player_id, $hero_id);
     if (empty($hero_data)) {
         $this->throw_error('10102');
         #英雄不存在
     }
     $hero_conf = Cache_HeroAttr::getInstance()->get_hero_attr_info($hero_data['hero_code']);
     if (empty($hero_conf)) {
         $this->throw_error('50120');
         #英雄配置错误
     }
     if ($hero_data['grow_rate'] >= $hero_conf['grow_limit']) {
         $this->throw_error('50121');
         #成长值已达上限
     }
     $obj_hero_grow = $this->get_data('PlayerHeroGrow');
     $hero_grow_id = $obj_hero_grow->get_player_hero_grow_data($hero_id);
     $hero_grow_conf = array();
     $findFlag = false;
     if (!$hero_grow_id) {
         $findFlag = true;
     } else {
         $hero_grow_conf = Cache_HeroGrow::getInstance()->get_config_info($hero_grow_id);
         if (empty($hero_grow_conf)) {
             $findFlag = true;
         } else {
             if ($hero_data['grow_rate'] < $hero_grow_conf['grow_left'] || $hero_data['grow_rate'] >= $hero_grow_conf['grow_right']) {
                 #区间错误
                 $findFlag = true;
             }
         }
     }
     if ($findFlag) {
         #启动自动纠错
         $hero_grow_id = $this->find_hero_grow_id($hero_data['grow_rate'], $hero_grow_conf);
         if (!$hero_grow_id) {
             $this->throw_error('10111');
             #配置错误
         }
     }
     if (empty($hero_grow_conf)) {
         $this->throw_error('10111');
     }
     $obj_prop_game = $this->get_game('Prop');
     $obj_shop_game = $this->get_game('Shop');
     $consume_props = $last_props = $arr_consume = $arr_shop_log = array();
     $last_props[$hero_grow_conf['item_id']] = intval($obj_prop_game->get_prop_num_by_prop_id($player_id, $hero_grow_conf['item_id']));
     if (empty($auto) && $last_props[$hero_grow_conf['item_id']] < $hero_grow_conf['item_nums']) {
         $this->throw_error('50107');
     }
     $player_info = $this->get_data('Player')->get_player_info($player_id, Com_Util::get_player_fields(array('currency', 'level', 'vip', 'privilege_level')));
     $crit_counter = 0;
     #暴击计数
     $counter = 10;
     #while执行计数
     $sum_rand_grow_val = 0;
     #总提升数量
     $new_hero_grow_val = 0;
     #新的成长值
     $upgrade_times = $counter;
     $error_code = 0;
     $update_gold = false;
     #是否更新彩钻或钻石资源
     do {
         $need_buy_prop_nums = 0;
         #每次执行所需要的材料需在商城购买的数量
         if ($last_props[$hero_grow_conf['item_id']] < $hero_grow_conf['item_nums']) {
             $last_props[$hero_grow_conf['item_id']] = 0;
             $need_buy_prop_nums = $hero_grow_conf['item_nums'] - $last_props[$hero_grow_conf['item_id']];
             if ($last_props[$hero_grow_conf['item_id']] > 0) {
                 $consume_props[$hero_grow_conf['item_id']] += $last_props[$hero_grow_conf['item_id']];
             }
         } else {
             $last_props[$hero_grow_conf['item_id']] -= $hero_grow_conf['item_nums'];
             #剩余数量
             $consume_props[$hero_grow_conf['item_id']] += $hero_grow_conf['item_nums'];
             #消耗数量
         }
         if ($need_buy_prop_nums > 0) {
             #材料不足需要在商城购买
             $update_gold = true;
             $buy_prop_info = $obj_shop_game->shortcut_purchase_interface($hero_grow_conf['item_id'], 1);
             if (empty($buy_prop_info['item_price'])) {
                 $this->throw_error('130001');
                 #商城没有出售该道具
             }
             list($cost_currency_type, $cost_currency_value) = each($buy_prop_info['item_price']);
             $cost_currency_value *= $need_buy_prop_nums;
             $cost_currency_key = Cache_Currency::getInstance()->get_key($cost_currency_type);
             $arr_tmp_consume = Com_Util::get_consume_info_for_data_center($player_info, $cost_currency_key, $cost_currency_value, $need_buy_prop_nums);
             if (!empty($arr_tmp_consume)) {
                 $arr_consume['price'] += $arr_tmp_consume['price'];
                 $arr_consume['gold'] += $arr_tmp_consume['gold'];
                 $arr_consume['ticket'] += $arr_tmp_consume['ticket'];
                 $arr_consume['count'] += $arr_tmp_consume['count'];
             }
             #虚拟商城记录日志
             if (!isset($arr_shop_log[$hero_grow_conf['item_id']])) {
                 $arr_shop_log[$hero_grow_conf['item_id']]['cost_resource_id'] = $cost_currency_type;
             }
             $arr_shop_log[$hero_grow_conf['item_id']]['item_num'] += $need_buy_prop_nums;
             $arr_shop_log[$hero_grow_conf['item_id']]['cost_resource_num'] += $cost_currency_value;
             $error_code = $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $cost_currency_key, $cost_currency_value, 0, $cost_currency_type);
             if ($error_code !== true) {
                 if ($counter == 10) {
                     #首次执行如果资源不足则退出
                     $this->throw_error($error_code);
                 }
                 break;
             }
         }
         $counter--;
         $rand_val = 0;
         $is_crit = Com_Random::probability($hero_grow_conf['crit_rate']);
         if ($is_crit) {
             $crit_counter++;
             $rand_val = $this->parse_data($hero_grow_conf['val_crit']);
         } else {
             $rand_val = $this->parse_data($hero_grow_conf['val_nor']);
         }
         if (!$rand_val) {
             $this->throw_error('50122');
             #英雄成长配置表解析错误
         }
         #单次随机值
         $real_rand_val = Com_Random::get_probability_key($rand_val);
         #批量随机值之和
         $sum_rand_grow_val += $real_rand_val;
         #英雄的新成长值
         $new_hero_grow_val = $hero_data['grow_rate'] + $sum_rand_grow_val;
         if ($new_hero_grow_val >= $hero_conf['grow_limit']) {
             #超过英雄成长值上限
             $new_hero_grow_val = $hero_conf['grow_limit'];
             $sum_rand_grow_val = $hero_conf['grow_limit'] - $hero_data['grow_rate'];
             break;
         }
         #移动至下一个成长值区间
         if ($new_hero_grow_val > $hero_grow_conf['grow_right']) {
             $hero_grow_id++;
             $hero_grow_conf = Cache_HeroGrow::getInstance()->get_config_info($hero_grow_id);
             if (empty($hero_grow_conf)) {
                 break;
             }
             if (!isset($last_props[$hero_grow_conf['item_id']])) {
                 $last_props[$hero_grow_conf['item_id']] = intval($obj_prop_game->get_prop_num_by_prop_id($player_id, $hero_grow_conf['item_id']));
             }
         }
         if (empty($auto) && $last_props[$hero_grow_conf['item_id']] < $hero_grow_conf['item_nums']) {
             #道具不足
             break;
         }
     } while ($counter > 0 && $state > 0);
     #控制循环数量防止进入死循环
     $this->start_trans();
     $result = true;
     if ($update_gold) {
         $result = $this->get_data('Player')->update_player_resource($player_id, $player_info, 557, array(), $arr_consume);
         $this->write_check($result, 3010476);
     }
     if (!empty($consume_props)) {
         $log_param = array('cmd_id' => 557, 'level' => $player_info['level'], 'vip' => $player_info['vip']);
         $logs = array();
         foreach ($consume_props as $prop_id => $prop_nums) {
             #批量扣除多个道具如果可能
             $result = $obj_prop_game->deduct_prop_by_prop_id($player_id, $prop_id, $prop_nums, $logs, 1, $log_param);
             if (!$result) {
                 $this->throw_error('10101');
             }
         }
     }
     if ($result) {
         $hero_data['grow_rate'] = $new_hero_grow_val;
         $hero_data['fight'] = $this->calc_fight($player_id, $hero_data, $hero_data['fit'], $hero_data['rune_hole_list'], $hero_data['star_add_attr_per'], $hero_data['skill_list']);
         $update_field['grow_rate'] = $hero_data['grow_rate'];
         $update_field['fight'] = $hero_data['fight'];
         $result = $this->update_db($player_id, $update_field, $hero_data, 557);
         $this->get_data('RankList')->update_hero_rank($hero_id, $hero_data['fight']);
     }
     if ($result) {
         $this->commit();
         $obj_hero_grow->set_player_hero_grow_data($hero_id, $hero_grow_id);
         $n_hero_grow_conf = Cache_HeroGrow::getInstance()->get_config_info($hero_grow_id);
         #引导任务
         $this->get_game('TaskTrigger')->async_trigger_guide_task($player_id, 26, $upgrade_times - $counter);
         $this->get_game('PlayerAchieve')->async_trigger_achieve_target($player_id, 37, $hero_data['grow_rate'] + $hero_data['fit_grow'], 8);
         if (!empty($arr_shop_log)) {
             foreach ($arr_shop_log as $item_id => $item_info) {
                 $obj_shop_game->add_dummy_shop_log($player_id, $player_info, $item_id, $item_info['item_num'], $item_info['cost_resource_id'], $item_info['cost_resource_num'], 557);
             }
         }
         return array('res' => $crit_counter, 'rand_val' => $sum_rand_grow_val, 'cur_grow_val' => $new_hero_grow_val, 'effect' => 10000 * round($this->calc_grow_attar($new_hero_grow_val, $hero_conf['grow']), 4), 'prop_id' => $n_hero_grow_conf['item_id'], 'prop_nums' => $n_hero_grow_conf['item_nums'], 'nor_desc' => $n_hero_grow_conf['nor_desc'], 'crit_desc' => $n_hero_grow_conf['crit_desc']);
     } else {
         $this->throw_error('10101');
     }
 }
예제 #3
0
 /**
  * 夺宝战斗结果
  * @param unknown $player_id
  * @param unknown $battle_seq
  * @param unknown $winner_player_id
  * @param unknown $loser_player_id
  */
 public function battle_result($player_id, $battle_seq, $winner_player_id, $loser_player_id)
 {
     $battle_seq = intval($battle_seq);
     $winner_player_id = intval($winner_player_id);
     $loser_player_id = intval($loser_player_id);
     $this->start_trans();
     $grab_fail_award = "";
     $get_piece_id = "";
     $battle_result = 0;
     $grab_result = 0;
     $opponent_player_id = $winner_player_id;
     $phrase_id = 0;
     $player_info = array();
     $opponent_player_info = array();
     if ($winner_player_id == 0 && $loser_player_id == 0) {
         $battle_id_info = $this->get_data("GrabTreasure")->get_battle_id_info($battle_seq);
         $player_id = $battle_id_info['player_id'];
         $opponent_player_id = $battle_id_info['opponent_player_id'];
         $player_info = $this->get_data('Player')->get_player_info($player_id, array("sum_fpower", "is_dummy", "name", "vip", "privilege_level", "level"));
         $opponent_player_info = $this->get_cross("GrabTreasure")->get_player_info($opponent_player_id, array("sum_fpower", "is_dummy", "name", "vip", "privilege_level", "level"));
         if (empty($opponent_player_info)) {
             $opponent_player_info = $this->get_data('Player')->get_player_info($opponent_player_id, array("sum_fpower", "is_dummy", "name", "vip", "privilege_level", "level"));
         }
         Com_Log::debug_write('async_trigger_battle_test', "player_id={$player_id},{$player_info['sum_fpower']}={$opponent_player_info['sum_fpower']}");
         if ($player_info['sum_fpower'] > $opponent_player_info['sum_fpower']) {
             $winner_player_id = $player_id;
             $loser_player_id = $opponent_player_id;
             $phrase_id = 16;
         } else {
             $winner_player_id = $opponent_player_id;
             $loser_player_id = $player_id;
             $phrase_id = 17;
         }
     }
     if ($player_id == $winner_player_id) {
         $battle_result = 1;
         $opponent_player_id = $loser_player_id;
         if (empty($opponent_player_info) || empty($player_info)) {
             $player_info = $this->get_data('Player')->get_player_info($player_id, array("sum_fpower", "is_dummy", "name", "vip", "privilege_level", "level"));
             $opponent_player_info = $this->get_cross("GrabTreasure")->get_player_info($opponent_player_id, array("sum_fpower", "is_dummy", "name", "vip", "privilege_level", "level"));
             if (empty($opponent_player_info)) {
                 $opponent_player_info = $this->get_data('Player')->get_player_info($opponent_player_id, array("sum_fpower", "is_dummy", "name", "vip", "privilege_level", "level"));
             }
         }
         #抢碎片成功概率
         $rate_config = $this->get_battle_success_rate($player_info, $opponent_player_info);
         $random_get_piece_result = Com_Random::probability($rate_config['success_rate'], 100);
         #新手引导成功率100%
         $player_treasure_info = $this->get_cross("GrabTreasure")->get_grab_treasure($player_id, array("battle_log_id", "battle_need_piece_id", "battle_piece_quality", "quality_piece_ids", "is_guide"));
         if (intval($player_treasure_info["is_guide"]) == 1) {
             $random_get_piece_result = true;
         }
         $player_treasure_info["is_guide"] = 0;
         #抢碎片成功
         if ($random_get_piece_result) {
             $grab_result = 1;
             $quality = $player_treasure_info["battle_piece_quality"];
             $need_piece_id = $player_treasure_info["battle_need_piece_id"];
             #挑战成功加碎片
             $player_treasure_info["quality_piece_ids"][$quality][$need_piece_id] = $need_piece_id;
             #真实玩家
             if ($opponent_player_info['is_dummy'] == 0) {
                 $grab_piece_id = $need_piece_id;
                 $opponent_treasure_info = $this->get_cross("GrabTreasure")->get_grab_treasure($opponent_player_id, array("quality_piece_ids"));
                 #碎片存在
                 if (isset($opponent_treasure_info["quality_piece_ids"][$quality]) && !empty($opponent_treasure_info["quality_piece_ids"][$quality])) {
                     if (isset($opponent_treasure_info["quality_piece_ids"][$quality][$need_piece_id])) {
                         unset($opponent_treasure_info["quality_piece_ids"][$quality][$need_piece_id]);
                     } else {
                         $grab_piece_id = array_shift($opponent_treasure_info["quality_piece_ids"][$quality]);
                     }
                     #被抢者扣碎片
                     $re = $this->get_cross("GrabTreasure")->update_grab_treasure($opponent_player_id, $opponent_treasure_info);
                     $this->write_check($re, 5010859);
                     #抢者加碎片
                     $re = $this->get_cross("GrabTreasure")->update_grab_treasure($player_id, $player_treasure_info);
                     $this->write_check($re, 5010867);
                     #解除战斗中锁
                     $re = $this->get_cross("GrabTreasure")->clear_battle_lock($opponent_player_id);
                     $this->write_check($re, 5010862);
                     #抢碎片日志
                     #{0}抢走了你的{1},简直不能忍!
                     $pieceConfig = Cache_GrabTreasurePiece::getInstance()->get_grab_treasure_piece($grab_piece_id);
                     $arr_replace = array(array('rep_type' => 0, 'rep_val' => $player_id, 'txt' => $player_info['name']), array('rep_type' => 7, 'txt' => $pieceConfig['name']));
                     $msg = Language_Message::make_message(123001, $arr_replace);
                     $add_log["player_id"] = $opponent_player_id;
                     $add_log["grab_player_id"] = $player_id;
                     $add_log["grab_piece_id"] = $grab_piece_id;
                     $add_log["quality"] = $quality;
                     $add_log["add_time"] = time();
                     $add_log['rep_content'] = $msg;
                     $add_log["is_allow_grab"] = 1;
                     $re = $this->get_cross("GrabTreasureLog")->add_grab_treasure_log($battle_seq, $add_log);
                     $this->write_check($re, 5010876);
                 } else {
                     $grab_result = 0;
                 }
             } else {
                 $re = $this->get_cross("GrabTreasure")->update_grab_treasure($player_id, $player_treasure_info);
                 $this->write_check($re, 5010992);
             }
             if (intval($player_treasure_info['battle_log_id']) > 0) {
                 $data = $this->get_cross('GrabTreasureLog')->get_grab_treasure_log($player_id, $player_treasure_info['battle_log_id']);
                 if (!empty($data)) {
                     $data['is_allow_grab'] = 0;
                     $re = $this->get_cross('GrabTreasureLog')->update_grab_treasure_info($player_id, $player_treasure_info['battle_log_id'], $data);
                     $this->write_check($re, 5010983);
                 }
             }
         }
         if ($grab_result == 0) {
             $need_piece_id = '';
             $grab_fail_award = $rate_config['fail_award'];
             $reward = $this->get_format_reward($grab_fail_award);
             if ($phrase_id > 0) {
                 $attachment = array();
                 foreach ($reward as $prop) {
                     $attachment[] = array("prop_id" => $prop['item_id'], "prop_num" => $prop['item_num']);
                 }
                 $phrase_config = Cache_FuncPhraseConfig::getInstance()->get_phrase_config_info($phrase_id);
                 $this->get_game('Mail')->async_trigger_mail($player_id, $phrase_config['title'], $phrase_config['content'], $attachment, $phrase_config['sender'], 1, 1230);
             } else {
                 $re = $this->get_game('Reward')->send_reward($player_id, $reward, array('cmd_id' => '1230'), 1);
                 if ($re !== true) {
                     $this->write_check($re, 5011077);
                 }
             }
         }
     }
     $is_battle_lock = $this->get_cross("GrabTreasure")->get_battle_lock($opponent_player_id);
     if ($is_battle_lock) {
         $re = $this->get_cross("GrabTreasure")->clear_battle_lock($opponent_player_id);
         $this->write_check($re, 5010872);
     }
     $this->commit();
     if ($battle_result == 1 && $grab_result == 0 && $phrase_id == 0) {
         $this->get_game('Reward')->add_reward_log();
     }
     if ($battle_result == 0 && $phrase_id > 0) {
         $phrase_config = Cache_FuncPhraseConfig::getInstance()->get_phrase_config_info($phrase_id);
         $this->get_game('Mail')->async_trigger_mail($player_id, $phrase_config['title'], $phrase_config['content'], array(), $phrase_config['sender'], 1);
     }
     #抢碎片增加日志
     if ($grab_result == 1) {
         if ($opponent_player_info['is_dummy'] == 0) {
             Log_Common::getInstance()->add_prop_log($opponent_player_id, $opponent_player_info['level'], $opponent_player_info['vip'], $opponent_player_info['privilege_level'], 1231, 11, 0, $grab_piece_id, 1, $pieceConfig['name'], $quality, 1, 0, 1, '', 0);
         }
         $pieceConfig = Cache_GrabTreasurePiece::getInstance()->get_grab_treasure_piece($need_piece_id);
         Log_Common::getInstance()->add_prop_log($player_id, $player_info['level'], $player_info['vip'], $player_info['privilege_level'], 1231, 10, 0, $need_piece_id, 1, $pieceConfig['name'], $quality, 1, 0, 1, '', 0);
         if ($phrase_id > 0) {
             $phrase_config = Cache_FuncPhraseConfig::getInstance()->get_phrase_config_info(18);
             $this->get_game('Mail')->async_trigger_mail($player_id, $phrase_config['title'], $phrase_config['content'], array(), $phrase_config['sender'], 1);
         }
     }
     $out = array('battle_result' => $battle_result, 'grab_result' => $grab_result, 'get_piece_id' => $need_piece_id, 'grab_fail_award' => $grab_fail_award);
     $this->get_game('PlayerFunc')->sync_func_tips($player_id, 1040);
     #日常任务埋点
     $this->get_game('TaskTrigger')->async_trigger_task($player_id, 119, 119, 1);
     Protocol::input($player_id, 8, 12, 1230, $out);
 }
예제 #4
0
 /**
  * 获取掉落数据
  * @param $loot_id
  * @return array
  */
 public function get_prop_loot($loot_id, $career_type = 0)
 {
     $prop_list = array();
     $condition = Cache_LootCondition::getInstance()->get_loot_condition($loot_id);
     if (intval($condition['prob_part_per_million']) > 0) {
         //0直接退出
         $flag = Com_Random::probability($condition['prob_part_per_million'], 1000000);
         if ($flag) {
             $loop_times = 0;
             //普通循环次数
             $arr_loop = array();
             $arr_critical_loop = array();
             for ($i = 0; $i < 5; $i++) {
                 //把循环次数权重取出
                 $lkey = 'count_weight' . $i;
                 $wkey = 'critical_weight' . $i;
                 $arr_loop[$i] = $condition[$lkey];
                 $arr_critical_loop[$i] = $condition[$wkey];
             }
             $crit_flag = Com_Random::probability($condition['critical_prob_part_per_million']);
             if ($crit_flag) {
                 //算暴击次数
                 $wkey = Com_Random::get_probability_key($arr_critical_loop);
                 $wkey = 'critical_times' . $wkey;
                 $loop_times += $condition[$wkey];
             }
             $lkey = Com_Random::get_probability_key($arr_loop);
             $lkey = 'count' . $lkey;
             $loop_times += $condition[$lkey];
             $loot_info = Cache_Loot::getInstance()->get_Loot_info($condition['loot_id']);
             if (!empty($loot_info)) {
                 $arr_loot_lib = array();
                 foreach ($loot_info as $loot) {
                     $arr_loot_lib[$loot['loot_lib_id']] = $loot['weight'];
                 }
                 $loot_lib = array();
                 for ($i = 0; $i < $loop_times; $i++) {
                     //获取掉落库的随机次数
                     $key = Com_Random::get_probability_key($arr_loot_lib);
                     $loot_lib[$key] += 1;
                 }
                 if (!empty($loot_lib)) {
                     foreach ($loot_lib as $key => $times) {
                         $arr_loot_lib = Cache_LootLib::getInstance()->get_loot_lib_info($key);
                         if (!empty($arr_loot_lib)) {
                             $arr_item = array();
                             $arr_item_limit = array();
                             $arr_item_num = array();
                             foreach ($arr_loot_lib as $loot_lib_info) {
                                 if ($loot_lib_info['class_filter'] > 0 && $loot_lib_info['class_filter'] != $career_type) {
                                     continue;
                                 }
                                 $arr_item[$loot_lib_info['item_sid']] = $loot_lib_info['weight'];
                                 $arr_item_num[$loot_lib_info['item_sid']] = $loot_lib_info['count'] <= 0 ? 1 : $loot_lib_info['count'];
                                 if ($loot_lib_info['loop_limit'] > 0) {
                                     if ($loot_lib_info['loop_limit'] > 0) {
                                         $arr_item_limit[$loot_lib_info['item_sid']] = $loot_lib_info['loop_limit'];
                                     }
                                 }
                             }
                             if (!empty($arr_item)) {
                                 for ($i = 0; $i < $times; $i++) {
                                     if (empty($arr_item)) {
                                         break;
                                     }
                                     $key = Com_Random::get_probability_key($arr_item);
                                     if (!isset($prop_list[$key])) {
                                         $type = $this->get_item_key($key);
                                         if ($type == 'prop') {
                                             $prop_list[$key] = array('type' => $type, 'item_id' => $key, 'item_num' => $arr_item_num[$key]);
                                         } else {
                                             $prop_list[$key] = array('type' => $type, 'item_id' => $key, 'item_num' => $arr_item_num[$key]);
                                         }
                                     } else {
                                         $prop_list[$key]['item_num'] += $arr_item_num[$key];
                                     }
                                     if (isset($arr_item_limit[$key])) {
                                         $arr_item_limit[$key] -= 1;
                                         if ($arr_item_limit[$key] <= 0) {
                                             unset($arr_item[$key]);
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     $flag = Com_Random::probability($condition['prob_silver_part_per_million'], 1000000);
     if ($flag) {
         $item_num = rand($condition['min_silver'], $condition['max_silver']);
         if ($item_num > 0) {
             if (isset($prop_list[3])) {
                 $item_num = $prop_list[3]['item_num'] + $item_num;
             }
             $prop_list[3] = array('type' => $this->get_item_key(3), 'item_id' => 3, 'item_num' => $item_num);
         }
     }
     $flag = Com_Random::probability($condition['prob_mojo_part_per_million'], 1000000);
     if ($flag) {
         $item_num = rand($condition['min_mojo'], $condition['max_mojo']);
         if ($item_num > 0) {
             if (isset($prop_list[13])) {
                 $item_num = $prop_list[13]['item_num'] + $item_num;
             }
             $prop_list[13] = array('type' => $this->get_item_key(13), 'item_id' => 13, 'item_num' => $item_num);
         }
     }
     if ($prop_list) {
         $now_time = time();
         foreach ($prop_list as $key => $item) {
             if ($item['item_id'] > 200) {
                 $arrPropConfig = Cache_Prop::getInstance()->get_prop_info($item['item_id']);
                 $prop_list[$key]['prop_config'] = $arrPropConfig;
                 if (!empty($arrPropConfig['generate_start_time']) && !empty($arrPropConfig['generate_end_time']) && ($now_time < strtotime($arrPropConfig['generate_start_time']) || $now_time > strtotime($arrPropConfig['generate_end_time']))) {
                     unset($prop_list[$key]);
                 }
             }
         }
     }
     return $prop_list;
 }
예제 #5
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;
 }
예제 #6
0
 /**
  * @Purpose:
  * 翅膀装备强化
  * @Param $player_id 玩家ID
  * @Param $player_prop_id 玩家装备ID
  * @Param $auto_buy 自动购买(0:不自动1:自动)
  */
 public function equip_intensify($player_id, $player_prop_id, $auto_buy)
 {
     $player_id = intval($player_id);
     $player_prop_id = strval($player_prop_id);
     $auto_buy = intval(0);
     #暂时没有自动购买功能
     $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_equip_info = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $player_prop_id);
     if (empty($player_equip_info)) {
         $this->throw_error('80013');
         //玩家没有该装备!
     }
     #根据翅膀等级获取翅膀装备当前最大的强化等级
     $player_detail = $this->get_data('PlayerDetail')->get_player_detail($player_id, Protocol_Player::get_player_attr_detail_key());
     if (empty($player_detail['wing_info'][$player_equip_info['vocation_limit']]) || $player_equip_info['sub_type'] == 7) {
         $this->throw_error('10110');
         #数据错误
     }
     $wing_level = $player_detail['wing_info'][$player_equip_info['vocation_limit']]['lvl'];
     $intensify_level_limit_table = Cache_WingEquipment::getInstance()->get_wing_equip_intensify_limit_info(array('wing_level' => $wing_level));
     if (empty($intensify_level_limit_table)) {
         $this->throw_error('10109');
         #配置表读取错误
     } else {
         if (empty($intensify_level_limit_table['intensify_level_limit'])) {
             $this->throw_error('150012');
             #wing_equip_intensify_limit配置表的intensify_level_limit字段配置错误
         }
     }
     $intensify_level_limit = $intensify_level_limit_table['intensify_level_limit'];
     if ($player_equip_info['intensive_level'] >= $intensify_level_limit) {
         $this->throw_error('80310');
         //已满级
     }
     $intensify_table = Cache_WingEquipment::getInstance()->get_wing_equip_intensify_info(array('level' => $player_equip_info['intensive_level'] + 1));
     if (empty($intensify_table)) {
         $this->throw_error('10109');
         #配置表读取错误
     }
     if (empty($intensify_table['expend_coin_list'])) {
         $this->throw_error('150014');
         #wing_equip_intensify配置表的expend_coin_list字段配置错误
     }
     $coin_list = $this->format_table_field($intensify_table['expend_coin_list']);
     if (!Com_Array::is_good_arr($coin_list)) {
         $this->throw_error('150014');
         #wing_equip_intensify配置表的expend_coin_list字段配置错误
     }
     #消耗货币检测
     foreach ($coin_list as $coin_type => $coin_num) {
         if (empty($coin_type) || empty($coin_num)) {
             $this->throw_error('150014');
             #wing_equip_intensify配置表的expend_coin_list字段配置错误
         }
         $cost_currency_key = Cache_Currency::getInstance()->get_key($coin_type);
         $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $cost_currency_key, $coin_num, 1, $coin_type);
     }
     $prop_list = array();
     if (!empty($intensify_table['expend_prop_list'])) {
         #$this->throw_error('150015'); #wing_equip_intensify配置表的expend_prop_list字段配置错误
         $prop_list = $this->format_table_field($intensify_table['expend_prop_list']);
         if (!Com_Array::is_good_arr($prop_list)) {
             $this->throw_error('150015');
             #wing_equip_intensify配置表的expend_prop_list字段配置错误
         }
         #消耗道具检测
         $is_gold_num_res = false;
         $player_prop_list = array();
         foreach ($prop_list as $prop_id => $prop_num) {
             if (empty($prop_id) || empty($prop_num)) {
                 $this->throw_error('150015');
                 #wing_equip_intensify配置表的expend_prop_list字段配置错误
             }
             $player_prop_num = $this->get_prop_num_by_player_bag($player_id, $prop_id);
             $player_prop_list[$prop_id] = $player_prop_num;
             if ($player_prop_num < $prop_num) {
                 if ($auto_buy) {
                     #获取商城表道具元宝价格
                     $obj_shop_game = $this->get_game('Shop');
                     $drop_info = $obj_shop_game->shortcut_purchase_interface($prop_id, 1);
                     if (empty($drop_info['item_price'])) {
                         $this->throw_error('130001');
                         # 商城没有出售该道具
                     }
                     list($cur_idx, $cur_val) = each($drop_info['item_price']);
                     $cost_currency_key = Cache_Currency::getInstance()->get_key($cur_idx);
                     $deduct_gold_num = intval($cur_val * ($prop_num - $player_prop_num));
                     if ('gold' == $cost_currency_key) {
                         if (20 == $cur_idx) {
                             if ($player_info['ticket'] < $deduct_gold_num) {
                                 $ticket = $player_info['ticket'];
                                 $gold = $deduct_gold_num - $ticket;
                             } else {
                                 $ticket = $deduct_gold_num;
                                 $gold = 0;
                             }
                         } else {
                             $gold = $deduct_gold_num;
                             $ticket = 0;
                         }
                         $arr_consume = array('price' => $cur_val, 'gold' => $gold, 'ticket' => $ticket, 'count' => $prop_num - $player_prop_num);
                         #数据中心推送
                     }
                     $this->get_data('Player')->check_player_resource($player_id, $player_info, '-', $cost_currency_key, $deduct_gold_num, 1, $cur_idx);
                     $is_gold_num_res = true;
                 } else {
                     $this->throw_error('150016');
                     #道具不足
                 }
             }
         }
     }
     #强化是否成功
     $is_success = 1;
     if (!empty($intensify_table['fail_num']) && $player_equip_info['intensive_lose_times'] >= $intensify_table['fail_num']) {
         $is_success = 0;
     } else {
         $intensify_success_rate = $intensify_table['success_rate'];
         if (Com_Random::probability($intensify_success_rate, 10000)) {
             $is_success = 0;
         }
     }
     #生成强化后的装备
     $is_update_wing = false;
     $equip_update_field = array();
     if ($is_success == 0) {
         $wing_attr = $player_detail['wing_info'][$player_equip_info['vocation_limit']];
         #如果是装备中的装备,先减少强化前装备的战斗力
         if ($player_equip_info['item_position'] == $this->wing_pos) {
             $wing_attr['equipment'][$player_equip_info['sub_type']] = array();
             $arr_remove_prop_detail = $player_equip_info;
             Struct_Prop::get_item_additions($arr_remove_prop_detail);
             $arr_config = Cache_Prop::getInstance()->get_prop_info($arr_remove_prop_detail['prop_id']);
             $arr_remove_prop_detail['type'] = $arr_config['type'];
             $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_equip_info['intensive_lose_times'] = 0;
         $player_equip_info['intensive_level'] += 1;
         $player_equip_info['intensive_desc'] = $this->get_latest_intensive_desc($player_equip_info, $intensify_table);
         $equip_update_field['intensive_lose_times'] = 0;
         $equip_update_field['intensive_level'] = $player_equip_info['intensive_level'];
         $equip_update_field['intensive_desc'] = $player_equip_info['intensive_desc'];
         #如果是装备中的装备,增加强化后装备的战斗力
         if ($player_equip_info['item_position'] == $this->wing_pos) {
             $wing_attr['equipment'][$player_equip_info['sub_type']] = $player_equip_info;
             $wing_attr['equip_attr'] = $this->get_wing_equip_attr($wing_attr['equipment']);
             $arr_prop_detail = $player_equip_info;
             Struct_Prop::get_item_additions($arr_prop_detail);
             $arr_config = Cache_Prop::getInstance()->get_prop_info($arr_prop_detail['prop_id']);
             $arr_prop_detail['type'] = $arr_config['type'];
             $wing_attr['fight'] += $arr_prop_detail['fpower'];
             $wing_attr['equipment_fight'] += $arr_prop_detail['fpower'];
             $player_detail['wing_info'][$player_equip_info['vocation_limit']] = $wing_attr;
             $is_update_wing = true;
         }
     } else {
         $player_equip_info['intensive_lose_times'] += 1;
         $equip_update_field['intensive_lose_times'] = $player_equip_info['intensive_lose_times'];
     }
     $this->start_trans();
     #更新道具属性
     if (!empty($equip_update_field)) {
         $update_res = $this->get_data('PlayerProp')->update_player_prop($player_equip_info, $equip_update_field);
         if (!$update_res) {
             $this->throw_error('10104');
         }
     }
     #更新翅膀战斗力
     if ($is_update_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');
         }
     }
     #扣道具
     if (Com_Array::is_good_arr($prop_list)) {
         if ($is_gold_num_res == true) {
             if (Com_Array::is_good_arr($player_prop_list)) {
                 foreach ($player_prop_list as $id => $num) {
                     if ($num > 0) {
                         $this->deduct_prop_num_by_prop_id($player_id, $id, $num, 1508, $player_info);
                     }
                 }
             }
         } else {
             foreach ($prop_list as $id => $num) {
                 $this->deduct_prop_num_by_prop_id($player_id, $id, $num, 1508, $player_info);
             }
         }
     }
     if (Com_Array::is_good_arr($coin_list)) {
         #扣货币
         $deduct_res = $this->get_data('Player')->update_player_resource($player_id, $player_info, 1508, array(), $arr_consume);
         if (!$deduct_res) {
             $this->throw_error('10104');
         }
     }
     if ($is_update_wing && $player_detail['wing_info'][$player_equip_info['vocation_limit']]['fight'] > 0) {
         $wing_fight = $player_detail['wing_info'][$player_equip_info['vocation_limit']]['fight'];
         $this->get_data('RankList')->update_wing_rank($player_id, $player_equip_info['vocation_limit'], $wing_fight);
     }
     $this->commit();
     $upgrade_item = array();
     if ($is_success == 0) {
         if ($is_update_wing) {
             $upgrade_item = Struct_Prop::get_prop_struct($player_equip_info);
             #同步翅膀属性
             $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']))));
         } else {
             #806通知前端道具属性变更
             $ndata = array();
             $ndata[] = $player_equip_info;
             Protocol_Prop::prop_806($player_id, $ndata);
         }
         $this->get_game('TaskTrigger')->async_trigger_guide_task($player_id, 34, 1);
         $this->get_game('PlayerAchieve')->async_trigger_achieve_target($player_id, 34, $player_equip_info['intensive_level'], 8);
     }
     $rtn_data = array('result' => intval($is_success), 'upgrade_item' => empty($upgrade_item) ? array() : $upgrade_item);
     return $rtn_data;
 }
예제 #7
0
 public function player_hero_grow_upgrade($player_id, $hero_id, $state)
 {
     $player_id = intval($player_id);
     $hero_id = strval($hero_id);
     $obj_player_hero_data = $this->get_data('PlayerHero');
     $hero_data = $obj_player_hero_data->get_player_hero_info($player_id, $hero_id);
     if (empty($hero_data)) {
         $this->throw_error('10102');
         #英雄不存在
     }
     $hero_conf = Cache_HeroAttr::getInstance()->get_hero_attr_info($hero_data['hero_code']);
     if (empty($hero_conf)) {
         $this->throw_error('50120');
         #英雄配置错误
     }
     if ($hero_data['grow_rate'] >= $hero_conf['grow_limit']) {
         $this->throw_error('50121');
         #成长值已达上限
     }
     /*
     $obj_hero_grow = $this->get_data('PlayerHeroGrow');
     $hero_grow_id = $obj_hero_grow->get_player_hero_grow_data($hero_id);
     $hero_grow_conf = array();
     $findFlag = false;
     if(!$hero_grow_id){
     	$findFlag = true;
     }else{
     	$hero_grow_conf = Cache_HeroGrow::getInstance()->get_config_info($hero_grow_id);
     	if(empty($hero_grow_conf)){
     		$findFlag = true;
     	}else{
     		if($hero_data['grow_rate']<$hero_grow_conf['grow_left'] || $hero_data['grow_rate']>=$hero_grow_conf['grow_right']){#区间错误
     			$findFlag = true;
     		}
     	}
     }
     if($findFlag){#启动自动纠错
     	$hero_grow_id = $this->find_hero_grow_id($hero_data['grow_rate'], $hero_grow_conf);
     	if(!$hero_grow_id){
     		$this->throw_error('10111');#配置错误
     	}
     }
     if(empty($hero_grow_conf)){
     	$this->throw_error('10111');
     }
     
     $obj_prop_game = $this->get_game('Prop');
     $consume_props = $last_props = array();
     $last_props[$hero_grow_conf['item_id']] = intval($obj_prop_game->get_prop_num_by_prop_id($player_id, $hero_grow_conf['item_id']));
     if($last_props[$hero_grow_conf['item_id']] < $hero_grow_conf['item_nums']){
     	$this->throw_error('50107');
     }
     */
     list($need_prop_id, $need_prop_nums) = explode(":", trim($hero_conf['grow_expend']));
     if (empty($need_prop_id) || empty($need_prop_nums)) {
         $this->throw_error('10111');
     }
     $obj_prop_game = $this->get_game('Prop');
     $last_props_nums = intval($obj_prop_game->get_prop_num_by_prop_id($player_id, $need_prop_id));
     if ($last_props_nums < $need_prop_nums) {
         $this->throw_error('50107');
     }
     $hero_grow_conf = Cache_HeroGrow::getInstance()->get_config_info($need_prop_id);
     if (empty($hero_grow_conf)) {
         $this->throw_error('10111');
         #配置错误
     }
     $consume_props_nums = 0;
     #消耗道具数量
     $crit_counter = 0;
     #暴击计数
     $counter = 10;
     #while执行计数
     $sum_rand_grow_val = 0;
     #总提升数量
     $new_hero_grow_val = 0;
     #新的成长值
     do {
         $counter--;
         // $last_props[$hero_grow_conf['item_id']] -= $hero_grow_conf['item_nums'];#剩余数量
         // $consume_props[$hero_grow_conf['item_id']] += $hero_grow_conf['item_nums'];#消耗数量
         $last_props_nums -= $need_prop_nums;
         $consume_props_nums += $need_prop_nums;
         $rand_val = 0;
         $is_crit = Com_Random::probability($hero_grow_conf['crit_rate']);
         if ($is_crit) {
             $crit_counter++;
             $rand_val = $this->parse_data($hero_grow_conf['val_crit']);
         } else {
             $rand_val = $this->parse_data($hero_grow_conf['val_nor']);
         }
         if (!$rand_val) {
             $this->throw_error('50122');
             #英雄成长配置表解析错误
         }
         #单次随机值
         $real_rand_val = Com_Random::get_probability_key($rand_val);
         #批量随机值之和
         $sum_rand_grow_val += $real_rand_val;
         #英雄的新成长值
         $new_hero_grow_val = $hero_data['grow_rate'] + $sum_rand_grow_val;
         if ($new_hero_grow_val >= $hero_conf['grow_limit']) {
             #超过英雄成长值上限
             $new_hero_grow_val = $hero_conf['grow_limit'];
             $sum_rand_grow_val = $hero_conf['grow_limit'] - $hero_data['grow_rate'];
             break;
         }
         /*
         #移动至下一个成长值区间
         if($new_hero_grow_val > $hero_grow_conf['grow_right']){
         	$hero_grow_id++;
         	$hero_grow_conf = Cache_HeroGrow::getInstance()->get_config_info($hero_grow_id);
         	if(empty($hero_grow_conf)){
         		break;
         	}
         
         	if(!isset($last_props[$hero_grow_conf['item_id']])){
         		$last_props[$hero_grow_conf['item_id']] = intval($obj_prop_game->get_prop_num_by_prop_id($player_id, $hero_grow_conf['item_id']));
         	}
         }
         if($last_props[$hero_grow_conf['item_id']] < $hero_grow_conf['item_nums']){#道具不足
         	break;
         }
         */
         if ($last_props_nums < $need_prop_nums) {
             break;
         }
     } while ($counter > 0 && $state > 0);
     #控制循环数量防止进入死循环
     $result = true;
     $player_info = $this->get_data('Player')->get_player_info($player_id, array('level', 'vip'));
     $log_param = array('cmd_id' => 557, 'level' => $player_info['level'], 'vip' => $player_info['vip']);
     $log = array();
     $this->start_trans();
     /*
     foreach($consume_props as $prop_id=>$prop_nums){#批量扣除多个道具如果可能
     	$result = $obj_prop_game->deduct_prop_by_prop_id($player_id, $prop_id, $prop_nums, $log, 1, $log_param);
     	if(!$result){
     		$this->throw_error('10101');
     	}
     }
     */
     $result = $obj_prop_game->deduct_prop_by_prop_id($player_id, $need_prop_id, $consume_props_nums, $log, 1, $log_param);
     if ($result) {
         $hero_data['grow_rate'] = $new_hero_grow_val;
         $result = $obj_player_hero_data->update_player_hero($player_id, $hero_id, array('grow_rate' => $new_hero_grow_val), $hero_data);
     }
     if ($result) {
         $this->commit();
         // $obj_hero_grow->set_player_hero_grow_data($hero_id, $hero_grow_id);
         // $n_hero_grow_conf = Cache_HeroGrow::getInstance()->get_config_info($hero_grow_id);
         return array('res' => $crit_counter, 'rand_val' => $sum_rand_grow_val, 'cur_grow_val' => $new_hero_grow_val, 'effect' => 1000 * self::calc_grow_attar($new_hero_grow_val, $hero_conf['grow']), 'prop_id' => $need_prop_id, 'prop_nums' => $need_prop_nums, 'nor_desc' => $hero_grow_conf['nor_desc'], 'crit_desc' => $hero_grow_conf['crit_desc']);
     } else {
         $this->throw_error('10101');
     }
 }
예제 #8
0
 public function equip_intensify($player_id, $player_prop_id, $auto_buy, $bless_item_id)
 {
     $this->get_game('PlayerFunc')->get_func_is_open($player_id, $this->func_id_intensifier);
     # 参数检查
     $this->param_check_numeric(array($player_id, $auto_buy, $bless_item_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_equip_info = $this->get_data('PlayerProp')->get_player_prop_detail($player_id, $player_prop_id);
     if (empty($player_equip_info)) {
         $this->throw_error('80013');
         //玩家没有该装备!
     }
     if (Com_Util::is_first_charge_item($player_equip_info['prop_id'])) {
         $this->throw_error('81101');
         # 首充装备不允许强化
     }
     # 获取强化等级上限
     $intensify_lv_limit = $this->get_intensify_lv_limit_by_item_level($player_equip_info['level']);
     if ($player_equip_info['intensive_level'] >= $intensify_lv_limit) {
         $this->throw_error('80310');
         //已满级
     }
     # 强化配置信息检查
     $intensify_config = Cache_Forge::getInstance()->get_intensify_info($player_equip_info['intensive_level'] + 1, 1);
     # 强化所需宝石检查
     $player_gems = 0;
     # 添加了自动购买强化宝石的逻辑,故没有该材料时不能报错
     $player_gems_info = $this->get_data('PlayerProp')->get_player_prop_by_prop_id($player_id, $intensify_config['item_id'], 1);
     if (!empty($player_gems_info)) {
         $gems = array_values($player_gems_info);
         foreach ($gems as $key => $val) {
             $player_gems += $val['item_num'];
         }
     }
     # 以下三种情况下的失败,前端要求仍然返回816协议下行,防止自动强化处理异常
     if ($player_info['silver'] < $intensify_config['silver_num']) {
         $extra_816 = array('is_failed' => 2, 'intensive_info' => array());
         Protocol::input($player_id, 3, 8, 816, $extra_816);
         $message = array('texts' => array(array('code' => 10113, 'content' => array(), 'params' => array())), 'delay' => 0);
         Protocol::input($player_id, 3, 7, 742, $message);
         return;
         #$this->throw_error('10113'); # 银两不足
     }
     if (!$auto_buy && $player_gems < $intensify_config['item_num']) {
         $extra_816 = array('is_failed' => 3, 'intensive_info' => array());
         Protocol::input($player_id, 3, 8, 816, $extra_816);
         $message = array('texts' => array(array('code' => 80312, 'content' => array(), 'params' => array())), 'delay' => 0);
         Protocol::input($player_id, 3, 7, 742, $message);
         return;
         #$this->throw_error('80312'); # 玩家强化的强化宝石不足!
     }
     if (!empty($bless_item_id)) {
         # 玩家强化的祝福石不足!
         # 强化所需祝福石检查
         $player_bless_item_info = $this->get_data('PlayerProp')->get_player_prop_by_prop_id($player_id, $bless_item_id, 1);
         if (empty($player_bless_item_info)) {
             $extra_816 = array('is_failed' => 4, 'intensive_info' => array());
             Protocol::input($player_id, 3, 8, 816, $extra_816);
             $message = array('texts' => array(array('code' => 80320, 'content' => array(), 'params' => array())), 'delay' => 0);
             Protocol::input($player_id, 3, 7, 742, $message);
             return;
         }
     }
     # 成功率判断
     $flag = false;
     if ($player_equip_info['intensive_lose_times'] >= $intensify_config['lose_num']) {
         $flag = true;
     } else {
         $intensify_success_rate = $intensify_config['chance'];
         if (!empty($bless_item_id)) {
             $intensify_bless_info = Cache_Forge::getInstance()->get_intensify_bless_info_by_item_id($bless_item_id, 1);
             $intensify_success_rate += $intensify_bless_info['add_success_rate'];
         }
         if (Com_Random::probability($intensify_success_rate, 10000)) {
             $flag = true;
         }
     }
     # 强化处理
     $before_intensive_desc = $player_equip_info['intensive_desc'];
     $after_intensive_desc = $this->equip_intensify_handle($flag, $player_id, $player_gems, $player_info, $player_equip_info, $intensify_config, $auto_buy, $bless_item_id);
     # 强化成功后,当前装备的强化等级加1
     if ($flag) {
         $player_equip_info['intensive_level'] += 1;
         # 添加好友动态消息
         $prop_info = Cache_Prop::getInstance()->get_prop_info($player_equip_info['prop_id']);
         $param = array(1 => "0|{$player_equip_info['intensive_level']}|1", 2 => "1|{$player_equip_info['prop_id']},{$prop_info['name']},{$player_equip_info['quality']}|2");
         //$this->get_game("PlayerFriend")->add_friend_news_by_type($player_id, 1, 3, 1, $param);
         # --------------------------------------------------------------------
         # 公告
         # --------------------------------------------------------------------
         $replace_info = array(array('rep_type' => 0, 'rep_val' => $player_id), array('rep_type' => 2, 'rep_val' => $player_equip_info['prop_id'], 'rep_player_id' => $player_id, 'rep_pid' => $player_equip_info['player_prop_id']), array('rep_type' => 7, 'txt' => $player_equip_info['intensive_level']));
         $this->get_game('SystemNotice')->push_sys_notice($player_id, 61, $player_equip_info['intensive_level'], $replace_info);
         # 强化公告
         if ($player_equip_info['type'] == 1) {
             $this->get_game('PlayerAchieve')->async_trigger_achieve_target($player_id, 6, "1:" . $player_equip_info['quality'] . ":" . $player_equip_info['star_level'] . ":" . intval($player_equip_info['intensive_level']) . ":{$player_equip_info['player_prop_id']}", 4);
         } else {
             if ($player_equip_info['type'] == 6) {
                 $this->get_game('PlayerAchieve')->async_trigger_achieve_target($player_id, 35, "1:" . $player_equip_info['quality'] . ":" . $player_equip_info['star_level'] . ":" . intval($player_equip_info['level']) . ":{$player_equip_info['player_prop_id']}", 4);
             }
         }
     } else {
         # 失败时提示消息
         /**
         			$player_equip_info['intensive_lose_times'] += 1;
         			$sure_succeed = $intensify_config['lose_num'] - $player_equip_info['intensive_lose_times']; # 剩余必定成功次数
         			if ($sure_succeed < 0) $sure_secceed = 0;
         			$message = array(
         				'texts'	=> array(
         					array(
         						'code' 		=> 80906, 
         						'content' 	=> array(), 
         						'params' 	=> array(
         							array (
         								array('txt' => '', 'type' => 7, 'value' => $sure_succeed, 'param' => '')
         							),
         						),
         					),
         				),	
         				'delay'	=> 0,
         			);
         			**/
         $message = array('texts' => array(array('code' => 80919, 'content' => array(), 'params' => array())));
         Protocol::input($player_id, 3, 7, 742, $message);
     }
     $out_816 = array();
     $out_816['is_failed'] = $flag ? 0 : 1;
     # 强化成功后,获取下一级强化信息,若已满级,则可忽略满级标识以外信息内容,9->10级时,失败仍然会返回满级标识,进入下面if结构
     if ($player_equip_info['intensive_level'] >= $intensify_lv_limit) {
         $silver_index = Cache_Currency::getInstance()->get_index('silver');
         $out_816['intensive_info'] = array('result' => 1, 'item_pid' => $player_prop_id, 'upgrade_item' => array(), 'success_per' => 0, 'success_num' => 0, 'fail_num' => 0, 'expend_prop' => "{$intensify_config['item_id']}:{$intensify_config['item_num']}", 'expend_currency' => "{$silver_index}:{$intensify_config['silver_num']}", 'max_intensify_lv' => $intensify_lv_limit);
     } else {
         $ret = $this->get_equip_intensify_info($player_id, $player_prop_id);
         $out_816['intensive_info'] = $ret[0];
     }
     # 通知玩家信息变更[必须放在commit之后]
     # 日常活跃度处理
     $this->get_game('DailyBoon')->async_trigger_daily_boon_task($player_id, 2000);
     # 日常任务埋点
     $this->get_game('TaskTrigger')->async_trigger_task($player_id, 107, 107, 1);
     # 引导任务埋点
     $this->get_game('TaskTrigger')->async_trigger_guide_task($player_id, 15, 1);
     # --------------------------------------------------------------------
     # 游戏日志记录
     # --------------------------------------------------------------------
     $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' => $player_prop_id, 'item_id' => $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'], 'before_level' => $flag ? $player_equip_info['intensive_level'] - 1 : $player_equip_info['intensive_level'], 'after_level' => $player_equip_info['intensive_level'], 'before_attr_add' => $before_intensive_desc, 'after_attr_add' => $after_intensive_desc);
     Log_Forge::getInstance()->add_log($log_info, 'intensify');
     Protocol::input($player_id, 3, 8, 816, $out_816);
 }
예제 #9
0
파일: Fairy.php 프로젝트: bluefan/phpsource
 /**
  * [train_upgrade 女神强化]
  * @param  [type] $player_id   [玩家ID]
  * @param  [type] $fairy_id    [女神ID]
  * @param  [type] $auto_buy    [是否自动购买]
  * @param  [type] $improve_per [是否提高成功率]
  * @return [type]              [0成功,1概率失败,2金币不足失败,3材料不足失败]
  */
 public function train_upgrade($player_id, $fairy_id, $auto_buy, $improve_flag)
 {
     # 参数检查
     $this->param_check_numeric(array($player_id, $auto_buy, $improve_flag), 0);
     # 获取玩家货币信息
     $player_info = $this->get_data('Player')->get_player_info($player_id, Com_Util::get_player_fields(array('currency', 'level')));
     if (empty($player_info)) {
         $this->throw_error('20002');
         //没有玩家信息!
     }
     # 获取玩家女神信息
     $fairy_info = $this->get_data('Fairy')->get_player_fairy_info($fairy_id);
     if (!$fairy_info) {
         $this->throw_error('10112');
         //获取女神信息失败
     }
     # 获取强化等级上限
     $max_train_lv = Cache_FairyTrain::getInstance()->get_max_train_lv();
     if (!empty($max_train_lv)) {
         $max_train_lv = $this->max_train_lv;
     }
     if ($fairy_info['train_level'] >= $max_train_lv) {
         $this->throw_error('80310');
         //已满级
     }
     # 获取升级到下一级的培养数据
     $trainConfigs = $this->get_cache_table_data('fairy_train_table', array("lvl" => $fairy_info['train_level']));
     if (!$trainConfigs[0] || empty($trainConfigs[0]['expend'])) {
         $this->throw_error('10109');
         //配置表读取错误
     }
     $train_config = $trainConfigs[0];
     // 消耗需求
     $cost_material = explode("|", $train_config['expend']);
     //升级下一级消耗
     $costItemInfo = explode(':', $cost_material[0]);
     //道具消耗
     $costGoldInfo = !empty($cost_material[1]) ? explode(':', $cost_material[1]) : 0;
     //金币消耗
     #当期女神品阶是否达到强化品阶
     if ($fairy_info['level'] < $train_config['fairy_lvl']) {
         $out_536 = array('result' => 5);
         Protocol::input($player_id, 3, 5, 536, $out_536);
         $message = array('texts' => array(array('code' => 536002, 'content' => array(), 'params' => array())), 'delay' => 0);
         Protocol::input($player_id, 3, 7, 742, $message);
         //536002 玩家的女神品阶没有达到当前强化需求
         return;
     }
     # 强化所需材料检查
     $cost_item_id = $costItemInfo[0];
     $cost_item_num = intval($costItemInfo[1]);
     # 获取包裹中资源数量
     $player_item_num = 0;
     # 添加了自动购买逻辑,故没有该材料时不能报错
     $player_item_info = $this->get_data('PlayerProp')->get_player_prop_by_prop_id($player_id, $cost_item_id, 1);
     if (!empty($player_item_info)) {
         $items = array_values($player_item_info);
         foreach ($items as $key => $val) {
             $player_item_num += $val['item_num'];
         }
     }
     # 强化所需金币
     $cost_silver_num = 0;
     $cost_silver_num = is_array($costGoldInfo) ? intval($costGoldInfo[1]) : 0;
     #勾选使用钻石提高成功率时钻石消耗
     $cost_gold_num = 0;
     if ($improve_flag) {
         $cost_gold_num = $train_config['success_buy_gold'];
     }
     # 金币不足
     if ($player_info['silver'] < $cost_silver_num) {
         $out_536 = array('result' => 2);
         Protocol::input($player_id, 3, 5, 536, $out_536);
         $message = array('texts' => array(array('code' => 10113, 'content' => array(), 'params' => array())), 'delay' => 0);
         Protocol::input($player_id, 3, 7, 742, $message);
         return;
     }
     # 钻石不足
     if ($improve_flag && $player_info['gold'] < $cost_gold_num) {
         $out_536 = array('result' => 3);
         Protocol::input($player_id, 3, 5, 536, $out_536);
         $message = array('texts' => array(array('code' => 10108, 'content' => array(), 'params' => array())), 'delay' => 0);
         Protocol::input($player_id, 3, 7, 742, $message);
         return;
     }
     # 材料不足 玩家升级的女神之泪不足
     if (!$auto_buy && $player_item_num < $cost_item_num) {
         $out_536 = array('result' => 4);
         Protocol::input($player_id, 3, 5, 536, $out_536);
         $message = array('texts' => array(array('code' => 536001, 'content' => array(), 'params' => array())), 'delay' => 0);
         Protocol::input($player_id, 3, 7, 742, $message);
         return;
     }
     # 成功率判断
     $flag = false;
     $current_success_rate = $train_config['success_rate'];
     # 如果勾选了金币购买成功率
     if ($improve_flag) {
         $current_success_rate += $train_config['success_buy_rate'];
     }
     # 成功率大于等于100%必定成功
     if ($current_success_rate >= 100) {
         $flag = true;
     } else {
         # 根据概率值返回是否成功
         if (Com_Random::probability($current_success_rate, 100)) {
             $flag = true;
         }
     }
     # 强化处理
     $old_fairy_info = $fairy_info;
     $this->_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);
     # 强化成功
     if ($flag) {
         #引导任务
         $this->get_game('TaskTrigger')->async_trigger_guide_task($player_id, 27, 1);
         $this->get_game('PlayerAchieve')->async_trigger_achieve_target($player_id, 38, $fairy_info['train_level'], 8);
     } else {
         # 失败时提示消息
         #失败返还一半消耗
         $call_back_silver = floor($cost_silver_num / 2);
         $this->_return_faile_silver($player_id, $call_back_silver);
         $message = array('texts' => array(array('code' => 80910, 'content' => array(), 'params' => array())));
         Protocol::input($player_id, 3, 7, 742, $message);
     }
     # 游戏日志记录
     $log_data = array('player_id' => $player_id, 'channel' => 536, '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'], 'ad_info' => $player_info['ad_info'], 'cmd_id' => 536, 'player_fairy_id' => $fairy_id, 'fairy_code' => $fairy_info['fairy_code'], 'type' => $fairy_info['type'], 'old_train_level' => $old_fairy_info['train_level'], 'new_train_level' => $fairy_info['train_level'], 'old_train_attr' => json_encode($old_fairy_info['train_attr']), 'new_train_attr' => $flag ? $fairy_info['train_attr'] : json_encode($fairy_info['train_attr']), 'flag' => $flag ? 1 : 0);
     Log_Common::getInstance()->add_log_by_table($log_data, 'log_fairy_train');
     $out_536['result'] = $flag ? 0 : 1;
     Protocol::input($player_id, 3, 5, 536, $out_536);
 }
예제 #10
0
 public function get_answer_right_reward($player_id, $question_id, $map_id, $player_list)
 {
     if (empty($map_id) || empty($question_id) || empty($player_list)) {
         $this->throw_error('10107');
         //参数错误!
     }
     $athena_question_reward_id = Cache_Const::getInstance()->get_const('athena_question_reward_id', 0, 1);
     # 掉落道具ID
     $athena_question_reward_ratio = Cache_Const::getInstance()->get_const('athena_question_reward_ratio', 0, 1);
     # 掉落概率
     $athena_question_reward_stint = Cache_Const::getInstance()->get_const('athena_question_reward_stint', 0, 1);
     # 掉落获取次数上限
     $involved_num = count($player_list);
     # 参与人数
     for ($i = 0; $i < $involved_num; $i++) {
         $player_info = $this->get_data('Player')->get_player_info($player_list[$i], array('player_id', 'level', 'vip', 'privilege_level'));
         if (empty($player_info)) {
             continue;
             # 不阻挡别人发奖
         }
         if (Com_Random::probability($athena_question_reward_ratio, 10000)) {
             $gain_num = $this->get_data('PlayerDailyTime')->get_player_used_time($player_list[$i], $this->daily_answer_right_reward_gain_num);
             if ($gain_num >= $athena_question_reward_stint) {
                 continue;
             }
             $reward = array();
             $reward[] = array('type' => 'drop', 'item_id' => $athena_question_reward_id, 'item_num' => 1);
             $re = $this->get_game('Reward')->send_reward($player_list[$i], $reward, array('cmd_id' => '549'), 1);
             $this->write_check_strict($re, 3010334);
             # 更新奖励获取次数
             $re = $this->get_data('PlayerDailyTime')->add_used_time($player_list[$i], $this->daily_answer_right_reward_gain_num, 1);
             $this->write_check($re, 3010338);
             # 该方法会自动推送843协议告知前端显示奖励信息,会调用prop_806协议通知道具变更,调用p2c_part_update通知人物信息变更
             $ret = $this->get_game('Reward')->add_reward_log(true);
             /**
             				$reward_fmt = array();
             				$reward_fmt[] = array(
             					'type' 		=> $item_id,
             					'item_id'	=> $item_id,
             					'item_num'	=> $item_num,
             				);
             
             				# 告知Flash奖励
             				Protocol::input($player_list[$i], 8, 11, 1154, array('reward' => $reward_fmt));
             				**/
             Com_Log::debug_write('xgame.athena_question', "{$player_list[$i]} get answer right reward" . json_encode($reward));
         }
     }
     return null;
 }