_switchIsOpen('circuitMatch')) { $this->_rspErr(1, 'server error1'); die; } if (!(count(CIRCUIT_MATCH_SERVER_LIST) <= 0 || in_array(myself()->_getZid(), CIRCUIT_MATCH_SERVER_LIST))) { $this->_rspErr(1, 'server error2'); die; } } public function CircuitTaskList(){ $circuitCircuitMeta = mt\CircuitTime::getCurrentCircuit(); $nextCircuitMeta = mt\CircuitTime::getNextCircuit(); $taskList = array(); if (!$circuitCircuitMeta && $nextCircuitMeta && myself()->_getNowTime() > strtotime($nextCircuitMeta['task_open_time']) ){ $metas = \mt\CircuitTask::getListBySeason($nextCircuitMeta['circuit_season']); if (count($metas) > 0){ foreach ($metas as $meta){ array_push($taskList, array( 'task_id' => $meta['id'], 'current' => CircuitTask::getCurrentVal($nextCircuitMeta['circuit_season'],$meta['type']), 'target' => $meta['target'], )); } } } $this->_rspData(array('list' => $taskList)); } public function getCurrentStage(){ $circuitStageMeta = mt\CircuitTime::getCurrentStage(); if (!$circuitStageMeta){ $this->_rspErr(1, 'current stage Have not yet started'); return ; } $currentCircuitMeta = mt\CircuitTime::getCurrentCircuit(); $info = array( 'start_time' => strtotime($circuitStageMeta['start_time']), 'end_time' => strtotime($circuitStageMeta['end_time']), 'stage_cec_pool' => $circuitStageMeta['cec_pool'], 'total_cec_pool' => $currentCircuitMeta['cec_pool'] ); $this->_rspData(array('info' => $info)); } public function getCircuitRanking(){ $currentCircuitMeta = mt\CircuitTime::getCurrentCircuit(); if (!$currentCircuitMeta){ $this->_rspErr(1, 'current stage Have not yet started'); return ; } $redis = $this->_getRedis($this->redis_key_circuit_ranking); if (! $redis->exists(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking)){ $rows = Circuit::getCircuitList($currentCircuitMeta['circuit_season']); $sortRows = myself()->arraySort($rows, 'cumulative_score', 'desc'); $list = $this->_extractRankingInfo($sortRows); $redis->set(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking , json_encode($list)); $redis->pexpire(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking , 10*60*1000); }else{ $listStr = $redis->get(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking); $list = emptyReplace(json_decode($listStr, true), array()); } $myRankedInfo = $this->_celMyRankingInfo($list); $this->_rspData(array( 'rank_list' => $list, 'my_rank' => $myRankedInfo, )); } public function getCircuitPhaseRanking(){ $currentCircuitMeta = mt\CircuitTime::getCurrentCircuit(); if (!$currentCircuitMeta){ $this->_rspErr(1, 'current stage Have not yet started'); return ; } $currentStageMeta = mt\CircuitTime::getCurrentStage(); if (!$currentStageMeta){ $currentStageMeta = mt\CircuitTime::getPrevStage(); } $redis = $this->_getRedis($this->redis_key_circuit_phase_ranking); if (! $redis->exists(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_phase_ranking)){ $rows = Circuit::getCircuitPhaseList($currentStageMeta['circuit_season'],$currentStageMeta['circuit_phase']); $sortRows = myself()->arraySort($rows, 'cumulative_score', 'desc'); $list = $this->_extractRankingInfo($sortRows); $redis->set(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_phase_ranking , json_encode($list)); $redis->pexpire(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_phase_ranking , 10*60*1000); }else{ $listStr = $redis->get(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_phase_ranking); $list = emptyReplace(json_decode($listStr, true), array()); } $myRankedInfo = $this->_celMyRankingInfo($list); $this->_rspData(array( 'rank_list' => $list, 'my_rank' => $myRankedInfo, )); } private function _extractRankingInfo($data){ $rankingList = array(); foreach ($data as $k=>$row){ $userDb = User::find($row['account_id']); $heroDb = Hero::findByAccountId($userDb['account_id'],$userDb['hero_id']); $skinDb = HeroSkin::find($heroDb['skin_id']); $heroId = $heroDb ? $heroDb['hero_id']:0; $skinId = $skinDb ? $skinDb['skin_id']:0; $ranking = $k+1; $rewardWeight = \mt\CircuitReward::getRewardWeight($ranking); if ($userDb){ $info = array( 'account_id' => $userDb['account_id'], 'name' => utf8_encode($userDb['name']), 'head_id' => $userDb['head_id'], 'head_frame' => $userDb['head_frame'], 'hero_id' => $heroId, 'skin_id' => $skinId, 'ranking' => $ranking, 'weight' => $rewardWeight, 'score' => $row['cumulative_score'], 'score_boost' => $row['score_boost'], ); array_push($rankingList,$info); } } return $rankingList; } private function _celMyRankingInfo($list){ $currentCircuitMeta = mt\CircuitTime::getCurrentCircuit(); $score = Circuit::getMyScore($currentCircuitMeta['circuit_season']); $userDb = User::find(myself()->_getAccountId()); $codeDb = UserInvitationCode::findMyCode(); $count = UserInvitationCode::getMyCodeBindCount($codeDb['invitation_code']); $boost = min($count * 3 / 100,60 / 100); $boostScore = $score * $boost; $myRankedInfo = array( 'ranking' => 0, 'account_id' => $userDb['account_id'], 'name' => $userDb['name'], 'head_id' => $userDb['head_id'], 'head_frame' => $userDb['head_frame'], 'score' => $score + $boostScore, 'score_boost' => $boostScore, 'cec' => 0, ); if (count($list) > 0){ $totalWeight = 0; $rate = \mt\Parameter::getVal('circuit_reward_rate',''); $count = floor(count($list) * $rate) ; foreach ($list as $value){ if ($value['ranking'] <= $count){ $totalWeight += $value['weight']; } } $circuitStageMeta = mt\CircuitTime::getCurrentStage(); $cecPool = $circuitStageMeta ? $circuitStageMeta['cec_pool'] : 0; foreach ($list as $value){ $cec = 0; if ($value['ranking'] <= $count){ $cec = ($value['weight'] / $totalWeight) * $cecPool; } if ($value['account_id'] == myself()->_getAccountId()){ $myRankedInfo['ranking'] = $value['ranking']; $myRankedInfo['cec'] = $cec; } } } return $myRankedInfo; } }