def _pre_select_pvp_rival(self, proxy): """初步选择对手 在可选区间内,初步随机选择 X 名对手 通常情况下,X > 1,为了避免选择到的对手不合适而需要重新请求 Args: proxy[DataProxy] """ cache_proxy = DataProxy() exit_rivals = [] least_count = 3 #初步选择3人 for rival in self._pvp_players: total_count = proxy.get_rank_score_count( "guard", "score", rival.score_min, rival.score_max) if total_count <= 0: #对应的区间范围内无合适的 PVP 对手,退化为 PVE logger.warning("Invalid rival score range[id=%d][%d-%d]" % (rival.id, rival.score_min, rival.score_max)) exit_rivals.append(rival) random.seed() count = min(least_count, total_count) offset = random.randint(0, total_count - count) rival.set_pvp_filter_range(offset, count) cache_proxy.search_by_rank_score("guard", "score", rival.score_min, rival.score_max, rival.offset, rival.count) #退化成 PVE 对手 for rival in exit_rivals: self._pvp_convert_to_pve(rival) defer = cache_proxy.execute() return defer
def _query_arenas_by_ranking(self, status, arena, count, users): """按照排名查询竞技场信息 """ assert status is True cache_proxy = DataProxy() #查询玩家所在房间的前count名 (min_score, max_score) = ArenaInfo.get_index_score_range(arena.index) cache_proxy.search_by_rank_score( "arena", "score", min_score, max_score, 0, count) defer = cache_proxy.execute() defer.addCallback(self._query_users, min_score, max_score, count, users) return defer
def _get_arena_rank(self, status, data, arena): """获得玩家竞技场的排名 """ assert status is True cache_proxy = DataProxy() #查询玩家所在房间的第一名 (min_score, max_score) = ArenaInfo.get_index_score_range(arena.index) cache_proxy.search_by_rank_score( "arena", "score", min_score, max_score, 0, 1) #查询玩家所在房间人数 cache_proxy.search_rank_score_count( "arena", "score", min_score, max_score) defer = cache_proxy.execute() defer.addCallback(self._select_arena_rank, data, min_score, max_score) return defer
def _query_melee_ranking(self, user_id, req, timer): cache_proxy = DataProxy() cache_proxy.search("melee", user_id) #先查玩家自己的melee cache_proxy.search_ranking("melee", "score", user_id) #先查玩家自己的排名 #拿到房间的积分范围 scores_range = [] range = MeleeInfo.get_index_score_range(MeleeInfo.MELEE_INDEX) scores_range.append(range) for range in scores_range: cache_proxy.search_by_rank_score("melee", "score", range[0], range[1], 0, MELEE_COUNT) defer = cache_proxy.execute() defer.addCallback(self._calc_query_melee_ranking, user_id, scores_range, req, timer) return defer
def _query_official_position_ranking(self, user_id, req, timer): cache_proxy = DataProxy() cache_proxy.search("arena", user_id) #先查玩家自己的arena #拿到房间的积分范围 scores_range = [] range = ArenaInfo.get_index_score_range(ArenaInfo.ARENA_INDEX) scores_range.append(range) for range in scores_range: cache_proxy.search_by_rank_score("arena", "score", range[0], range[1], 0, OFFICIAL_POSITION_COUNT) defer = cache_proxy.execute() defer.addCallback(self._calc_query_official_position_ranking, user_id, scores_range, req, timer) return defer