currRankSeasonMeta = mt\RankSeason::getCurrentSeason(); if (!$this->currRankSeasonMeta) { $this->_rspErr(10, 'server internal error'); die(); } $this->propertyChgService = new services\PropertyChgService(); $this->awardService = new services\AwardService(); $this->userInfo = $this->_safeGetOrmUserInfo(); $this->seasonDb = Season::find($this->currRankSeasonMeta['id']); if (!$this->seasonDb) { Season::add($this->currRankSeasonMeta['id']); $this->seasonDb = Season::find($this->currRankSeasonMeta['id']); } if (!$this->seasonDb) { $this->_rspErr(10, 'server internal error'); die(); } $this->missionService = new services\MissionService(); $this->missionService->init($this->userInfo, $this->seasonDb); } public function info() { $rankMeta = mt\Rank::get($this->userInfo['rank']); $this->_rspData(array( 'info' => array( 'season_id' => $this->currSeasonMeta['id'], 'rank' => $this->userInfo['rank'], 'score' => $this->userInfo['score'], 'max_score' => $rankMeta ? $rankMeta['max_score'] : 0, 'noshow_score_bar' => $rankMeta ? $rankMeta['noshow_score_bar'] : 1, 'mission' => $this->getMissionInfo() ) )); } public function infoNew() { $rankMeta = mt\Rank::getRankById($this->userInfo['rank']); $nextRankMeta = mt\Rank::getNextRankById($this->userInfo['rank']); if (!$nextRankMeta){ $nextRankMeta = mt\Rank::getMaxRank(); } $info = array( 'season_name' => $this->currRankSeasonMeta['name'], 'rank' => $this->userInfo['rank'], 'rank_name' => $rankMeta['rank_name'], 'score' => $this->userInfo['score'], 'next_score' => $nextRankMeta['rank_score'], 'season_end_time' => strtotime($this->currRankSeasonMeta['end_time']), 'season_reward' => Season::seasonReward($rankMeta) ); $r = $this->_getRedis($this->rankingUnid); $rankList = $this->readRankingList($r,$this->rankingUnid); $list = array(); if (!$rankList){ $rankList = $this->checkRankingList(); $this->saveRankingList($r,$this->rankingUnid,$rankList); } foreach ($rankList as $v){ if ($this->userInfo['rank'] == $v['rank'] && count($list) < 20){ array_push($list,$v); } } $info['season_rank'] = $list; $this->_rspData(['info'=>$info]); } public function getRankingInfo(){ $rank_param = getReqVal('rank',0); if (!$rank_param){ $this->_rspErr(1, 'params rank error'); die(); } $r = $this->_getRedis($this->rankingUnid); $rankList = $this->readRankingList($r,$this->rankingUnid); $list = array(); if (!$rankList){ $rankList = $this->checkRankingList(); $this->saveRankingList($r,$this->rankingUnid,$rankList); } foreach ($rankList as $v){ if ($rank_param == $v['rank'] && count($list) < 20){ array_push($list,$v); } } $this->_rspData(['info'=>$list]); } public function getDataInfo(){ $seasonDb = Season::find($this->currRankSeasonMeta['id']); $currRankSeasonHistory = array(); if ($seasonDb){ $battleData = json_decode($seasonDb['battle_data'], true); $seasonBattleData = isset($battleData) ? getXVal($battleData, 'season_data', array()) : array(); $gameTimes = getXVal($seasonBattleData, 'total_battle_times', 0); $winTimes = getXVal($seasonBattleData, 'total_win_times', 0); $topTenTimes = getXVal($seasonBattleData, 'total_top_ten_times', 0); $totalKills = getXVal($seasonBattleData, 'total_kills_times', 0); $temp = $gameTimes-$winTimes ? $gameTimes-$winTimes:0; if (! $temp){ $kill_killed = 0; }else{ $kill_killed = round($totalKills/$temp,2); } $currRankSeasonHistory= array( 'season_id' => $seasonDb['season_id'], // 'total_kills' => $totalKills, 'game_times' => $gameTimes, 'win_times' => $winTimes, 'top_ten_times' => $topTenTimes, 'kill_killed' => $kill_killed, ); } if (!$currRankSeasonHistory){ $currRankSeasonHistory = array( 'season_id' => $this->currRankSeasonMeta['id'], // 'total_kills' => $totalKills, 'game_times' => 0, 'win_times' => 0, 'top_ten_times' => 0, 'kill_killed' => 0, ); } $this->_rspData(['info'=>$currRankSeasonHistory]); } public function getHeroInfo(){ $seasonDb = Season::find($this->currRankSeasonMeta['id']); $currHeroSeasonHistory = array(); if ($seasonDb) { $battleData = json_decode($seasonDb['battle_data'], true); $seasonBattleData = isset($battleData) ? getXVal($battleData, 'season_data', array()) : array(); $seasonHeroInfo = isset($seasonBattleData) ? getXVal($seasonBattleData, 'hero_info', array()) : array(); $heroSort = array(); foreach ($seasonHeroInfo as $key=>$heroInfo){ $heroSort[$key]['use_times'] = isset($heroInfo['use_times']) ? $heroInfo['use_times'] : 0; $heroSort[$key]['weapon'] = isset($heroInfo['weapon']) ? $heroInfo['weapon'] : array(); $heroSort[$key]['win_times'] = isset($heroInfo['win_times']) ? $heroInfo['win_times'] : 0; $heroSort[$key]['top_ten_times'] = isset($heroInfo['top_ten_times']) ? $heroInfo['top_ten_times'] : 0; $heroSort[$key]['hero'] = $key; arsort($heroSort[$key]['weapon']); $heroSort[$key]['weapon'] = array_keys($heroSort[$key]['weapon']); $heroSort[$key]['weapon'] = implode('|',array_slice($heroSort[$key]['weapon'],0,2)); } arsort($heroSort); $heroSort = array_slice($heroSort,0,3); foreach ($heroSort as &$value){ $value['season_id'] = $seasonDb['season_id']; $value['win_rate'] = round($value['win_times']/$value['use_times'],2); $value['top_ten_rate'] = round($value['top_ten_times']/$value['use_times'],2); } $currHeroSeasonHistory = $heroSort; } // if (!$currHeroSeasonHistory){ // array_push($currHeroSeasonHistory, // array( // 'season_id' => $this->currRankSeasonMeta['id'], // 'use_times' => 0, // 'weapon' => 0, // 'win_times' => 0, // 'top_ten_times' => 0, // 'hero_id' => 0, // 'win_rate' => 0, // 'top_ten_rate' => 0, // )); // } $this->_rspData(['info'=>$currHeroSeasonHistory]); } public function getMissionReward() { $mission = $this->getMissionInfo(); if (!$mission || $mission['state'] != Mission::RECEIVEABLE_STATE) { $this->_rspErr(1, 'Can not receive'); return; } $missionMeta = mt\Task::get($this->currSeasonMeta['task_id']); $missionId = $this->currSeasonMeta['task_id']; if (!$missionMeta) { $this->_rspErr(10, 'server internal error'); return; } $dropMeta = mt\Drop::get($missionMeta['reward']); if (!$dropMeta) { $this->_rspErr(10, 'server internal error'); return; } $this->_scatterDrop('mission:' . $missionId, $dropMeta, $this->awardService, $this->propertyChgService); Mission::add($missionId); $missionDb = Mission::find($missionId); $missionDto = $this->missionService->getMissionDto( $this->userInfo, $this->seasonDb, $missionDb, $missionMeta); $this->_rspData(array( 'award' => $this->awardService->toDto(), 'property_chg' => $this->propertyChgService->toDto(), )); } private function getMissionInfo() { $info = array( 'state' => Mission::NOT_FINISHED_STATE, 'current' => 0, 'target' => 0, 'target_rank' => 0 ); $missionMeta = mt\Task::get($this->currSeasonMeta['task_id']); if ($missionMeta) { $info['target_rank'] = $missionMeta['param1']; $info['target'] = $missionMeta['target']; $missionDb = Mission::find($missionMeta['id']); $missionDto = $this->missionService->getMissionDto( $this->userInfo, $this->seasonDb, $missionDb, $missionMeta); if ($missionDto) { $info['state'] = $missionDto['state']; $info['current'] = $missionDto['current']; $info['target'] = $missionDto['target']; } } return $info; } private function checkRankingList(){ $rankList = array(); $users = User::orderBy(User::allUser()); $rewardParamMeta = \mt\Parameter::getByName('rank_ring_reward'); $rewardParamMetaValue = $rewardParamMeta ? $rewardParamMeta['param_value'] : ''; $rewardList = explode('|',$rewardParamMetaValue); if (count($users)>0){ $KingCount = 0; foreach ($users as $k=>$user){ $userDto = User::getUserByRankMess($user); $userDto['rank_sort'] = $k+1; if ($userDto['score'] >= $this->starshine){ $KingCount += 1; $userDto['echelonTopX'] = \services\FormulaService::echelonTopX($userDto['rank_sort']); switch ($userDto['rank_sort']){ case 1:$userDto['ring_item_id'] = $rewardList[0];break; case 2:$userDto['ring_item_id'] = $rewardList[1];break; case 3:$userDto['ring_item_id'] = $rewardList[2];break; default : $userDto['ring_item_id'] = 0; } }else{ $userDto['ring_item_id'] = 0; } array_push($rankList,$userDto); } //当月排位赛最大分配金额 $maxSum = \services\FormulaService::calcCECMaxSum(); //排位赛参与分配人数 // $PeopleCapita = $this->calcPeopleCapita($KingCount); //排位赛人数% // $PeopleCapitaPer = $this->calcPeopleCapitaPer($KingCount); //排位赛预计分配额 $expected_CEC_Sum = 0; foreach ($rankList as $k=>$value){ if ($value['score'] >= $this->starshine){ $rankList[$k]['standardTopX'] = \services\FormulaService::standardTopX($value['rank_sort'],$value['echelonTopX']); $expected_CEC_Sum += \services\FormulaService::calcCECTopXSum($value['rank_sort'],$value['echelonTopX'],$KingCount); } } //排位赛金额% $rankAmountPre = min($maxSum/($expected_CEC_Sum+1),1); //MIN(当月排位赛最大分配额/(排位赛预计分配额+1),1) foreach ($rankList as $k=>$value){ if ($value['score'] >= $this->starshine && $value['rank_sort'] <= 10000 ){ $rankList[$k]['rewardCEC'] = $value['standardTopX']*$rankAmountPre; }else{ $rankList[$k]['rewardCEC'] = 0; } } } return $rankList; } private function readRankingList($r,$rankUnid) { $list = $r->get(RANKING_KEY.$rankUnid); if (empty($list)) { return array(); } $list = json_decode($list, true); return $list; } private function saveRankingList($r,$rankUnid ,$list) { $r->set(RANKING_KEY.$rankUnid , json_encode($list)); $r->pexpire(RANKING_KEY.$rankUnid , 3*60*60*1000); } }