_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 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::getRankingList($currentCircuitMeta['circuit_season']); $list = $this->_extractRankingInfo($rows); $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, )); } 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'], ); array_push($rankingList,$info); } } return $rankingList; } private function _celMyRankingInfo($list){ $currentCircuitMeta = mt\CircuitTime::getCurrentCircuit(); $userDb = User::find(myself()->_getAccountId()); $myRankedInfo = array( 'ranking' => 0, 'account_id' => $userDb['account_id'], 'name' => $userDb['name'], 'head_id' => $userDb['head_id'], 'head_frame' => $userDb['head_frame'], 'score' => Circuit::getMyScore($currentCircuitMeta['circuit_season']), '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; } }