def _set_pvp_rival_guard(self, proxy, rival_user_id, rival): """ """ guards = proxy.get_all_result("guard") rival_guard = None for guard in guards: if guard.user_id == rival_user_id: #一个玩家目前只对应一个guard rival_guard = guard break #if rival_guard is None: # rival.clear() #该玩家不存在或没有guard信息 rival.set_pvp_enemy_guard(rival_guard) if rival_guard == None: rival.rival_id = rival_user_id rival.is_rob = True cache_proxy = DataProxy() #查询 user, technology, hero, resource, defense 表 cache_proxy.search("user", rival.rival_id) cache_proxy.search("union", rival.rival_id) cache_proxy.search_by_index("technology", "user_id", rival.rival_id) heroes_id = rival.get_heroes_id() for hero_id in heroes_id: if hero_id != 0: cache_proxy.search("hero", hero_id) if rival.is_rob: cache_proxy.search("resource", rival.rival_id) cache_proxy.search("defense", rival.defense_id) defer = cache_proxy.execute() return defer
def _calc_season_result(self, pre_proxy, req, union_min, union_max, indiv_min, indiv_max, timer): seasons = [] users = [] for i, union_info in enumerate( pre_proxy.get_rank_result("unionseason", "score", union_min, union_max)): seasons.append(union_info) for i, indiv_info in enumerate( pre_proxy.get_rank_result("union", "season_score", indiv_min, indiv_max)): users.append(indiv_info) #查询联盟信息 proxy = DataProxy() for union_info in seasons: proxy.search("unionunion", union_info.union_id) proxy.search_by_index("unionmember", "union_id", union_info.union_id) for indiv_info in users: proxy.search("user", indiv_info.user_id) defer = proxy.execute() defer.addCallback(self._calc_season_ranking_result, req, seasons, users, timer) return defer
def _filter_pvp_rival(self, proxy): """筛选出合适的对手 筛选掉不合法的对手(比如重复的对手) """ exit_rivals = [] for rival in self._pvp_players: candidate = [] guard_list = proxy.get_rank_score_result("guard", "score", rival.score_min, rival.score_max, rival.offset, rival.count) for guard in guard_list: if guard.user_id not in self._invalid: logger.debug("Candidate[user id=%d]" % guard.user_id) candidate.append(guard) #如果可选对手为空,退化为 PVE if len(candidate) == 0: logger.warning( "Bad luck for no candidate[id=%d][%d-%d][%d,%d]" % (rival.id, rival.score_min, rival.score_max, rival.offset, rival.count)) exit_rivals.append(rival) continue #随机选择 random.seed() rival_guard = random.sample(candidate, 1)[0] rival.set_pvp_enemy_guard(rival_guard) self._invalid.append(rival.rival_id) #不能匹配到重复的敌人 logger.debug("Add invalid user[user id=%d]" % rival.rival_id) #退化成 PVE 对手 for rival in exit_rivals: self._pvp_convert_to_pve(rival) cache_proxy = DataProxy() #查询 user, technology, hero, resource, defense 表 for rival in self._pvp_players: cache_proxy.search("user", rival.rival_id) cache_proxy.search_by_index("technology", "user_id", rival.rival_id) heroes_id = rival.get_heroes_id() for hero_id in heroes_id: if hero_id != 0: cache_proxy.search("hero", hero_id) if rival.is_rob: cache_proxy.search("resource", rival.rival_id) cache_proxy.search("defense", rival.defense_id) defer = cache_proxy.execute() return defer
def search(self, unions): """查询联盟战争中的玩家信息 """ self.unions = unions proxy = DataProxy() for union_id in self.unions: proxy.search_by_index("unionmember", "union_id", union_id) defer = proxy.execute() defer.addCallback(self._calc_result) return defer
def patch(self, union_id): proxy = DataProxy() proxy.search("unionseason", union_id) proxy.search_by_index("unionbattle", "union_id", union_id) proxy.execute(asyn=False) season = proxy.get_result("unionseason", union_id) for battle in proxy.get_all_result("unionbattle"): if battle.index == season.current_battle_index: return battle.stage raise Exception("union data error")
def _match_user(self, city_id, rival_id): """查找真实玩家的信息 """ #查询 rival 信息 proxy = DataProxy() proxy.search("user", rival_id) proxy.search("guard", rival_id) proxy.search("legendcity", LegendCityInfo.generate_id(rival_id, city_id)) proxy.search_by_index("technology", "user_id", rival_id) proxy.search_by_index("hero", "user_id", rival_id) defer = proxy.execute() defer.addCallback(self._calc_result, rival_id, city_id) return defer
def load_from_cache(self, id): """从 cache 中载入城池数据 Args: id[int]: 城池 id """ self.id = id proxy = DataProxy() proxy.search("unitcity", id) proxy.search_by_index("unitposition", "city_id", id) defer = proxy.execute() defer.addCallback(self._post_load) return defer
def match(self, user_id, union_id): """查询玩家信息、联盟信息、阵容信息 """ self.user_id = user_id self.union_id = union_id proxy = DataProxy() proxy.search("user", self.user_id) proxy.search("battle_score", self.user_id) proxy.search("union", self.user_id) proxy.search_by_index("technology", "user_id", self.user_id) #查战斗科技 proxy.search_by_index("team", "user_id", self.user_id) #查战斗科技 defer = proxy.execute() defer.addCallback(self._calc_result) return defer
def _select_players_info(self, proxy, data, melee, players_rank): """查询玩家的主公信息、阵容和战斗科技 """ users_id = [] users_arena = {} users_arena_ranking = {} for rank in players_rank: if rank > self.users_count: #超过本房间人数则跳过 continue results = proxy.get_rank_result("melee", "score", self.rank_base + rank - 1, self.rank_base + rank - 1) if len(results) == 0: continue #匹配到玩家自己,舍弃 if results[0].user_id == data.user.get(True).id: continue #匹配到积分为0的玩家,舍弃 if MeleeInfo.get_real_score(results[0].score) == 0: continue #如果乱斗场阵容不足9个,舍弃 if len(utils.split_to_int(results[0].heroes_basic_id)) != 9: logger.warning("melee heroes_id not correct.[user_id=%d]" % results[0].user_id) continue #assert len(results) == 1 user_id = results[0].user_id users_id.append(user_id) users_arena[user_id] = results[0] users_arena_ranking[user_id] = rank cache_proxy = DataProxy() for user_id in users_id: cache_proxy.search("user", user_id) #查询主公信息 cache_proxy.search("guard", user_id) #查阵容 cache_proxy.search_by_index("technology", "user_id", user_id) #查战斗科技 defer = cache_proxy.execute() defer.addCallback(self._select_teams, data, melee, users_id, users_arena, users_arena_ranking) return defer
def query_ranking_player_powerful_teams(self, user_id, request): timer = Timer(user_id) req = ranking_pb2.QueryRankingPlayerPowerfulTeamsReq() req.ParseFromString(request) proxy = DataProxy() proxy.search("battle_score", req.target_user_id) #查询目标玩家的排名信息 proxy.search_by_index("technology", "user_id", req.target_user_id) #查战斗科技 defer = proxy.execute() defer.addCallback(self._calc_query_ranking_player_powerful_teams, req, timer) defer.addErrback(self._query_ranking_player_powerful_teams_failed, req, timer) return defer
def _select_players_info(self, proxy, data, arena, players_rank): """查询玩家的主公信息、阵容和战斗科技 """ users_id = [] users_arena = {} users_arena_ranking = {} for rank in players_rank: if rank > self.users_count: #超过本房间人数则跳过 continue results = proxy.get_rank_result( "arena", "score", self.rank_base + rank - 1, self.rank_base + rank - 1) if len(results) == 0: continue #匹配到玩家自己,舍弃 if results[0].user_id == data.user.get(True).id: continue #匹配到积分为0的玩家,舍弃 if ArenaInfo.get_real_score(results[0].score) == 0: continue #assert len(results) == 1 user_id = results[0].user_id users_id.append(user_id) users_arena[user_id] = results[0] users_arena_ranking[user_id] = rank cache_proxy = DataProxy() for user_id in users_id: cache_proxy.search("user", user_id) #查询主公信息 cache_proxy.search("guard", user_id) #查阵容 cache_proxy.search_by_index("technology", "user_id", user_id) #查战斗科技 defer = cache_proxy.execute() defer.addCallback(self._select_teams, data, arena, users_id, users_arena, users_arena_ranking) return defer
def load_from_cache(self, id): """从 cache 中载入基础数据 Args: id[int]: """ self.id = id proxy = DataProxy() proxy.search("basicinit", self.id) proxy.search_by_index("basicactivity", "basic_id", self.id) proxy.search_by_index("basicactivitystep", "basic_id", self.id) proxy.search_by_index("basicactivityheroreward", "basic_id", self.id) proxy.search_by_index("basicworldboss", "basic_id", self.id) defer = proxy.execute() defer.addCallback(self._post_load) return defer
def load_from_cache(self, id=COMMON_ID): """从 cache 中载入 Args: id[int]: common数据目前只有一套 """ self.id = id proxy = DataProxy() proxy.search("commonconsole", id) proxy.search_by_index("commonbroadcast", "common_id", id) proxy.search_by_index("commonannealrecord", "common_id", id) proxy.search("commonworldboss", id) proxy.search("commonexchange", id) proxy.search_by_index("commontransfer", "common_id", id) proxy.search("commoncountry", id) #proxy.search("commoncat", id) proxy.search_by_index("commoncat", "common_id", id) defer = proxy.execute() defer.addCallback(self._post_load) return defer
def load_from_cache(self, id): """从 cache 中载入联盟数据 Args: id[int]: 联盟 id """ self.id = id proxy = DataProxy() proxy.search("unionunion", id) proxy.search_by_index("unionmember", "union_id", id) proxy.search_by_index("unionapplication", "union_id", id) proxy.search_by_index("unionaid", "union_id", id) proxy.search("unionseason", id) proxy.search_by_index("unionbattle", "union_id", id) proxy.search_by_index("unionbattle_node", "union_id", id) proxy.search_by_index("unionbattle_record", "union_id", id) proxy.search_by_index("uniondonatebox", "union_id", id) proxy.search_by_index("uniondonaterecord", "union_id", id) proxy.search_by_index("unionboss", "union_id", id) defer = proxy.execute() defer.addCallback(self._post_load) return defer
def load_from_cache(self, id): """从 cache 中载入用户数据 Args: id[int]: 用户 id """ self.id = id proxy = DataProxy() proxy.search("user", id) proxy.search("resource", id) proxy.search_by_index("hero", "user_id", id) proxy.search_by_index("team", "user_id", id) proxy.search("guard", id) proxy.search_by_index("item", "user_id", id) proxy.search_by_index("soldier", "user_id", id) proxy.search_by_index("technology", "user_id", id) proxy.search_by_index("herostar", "user_id", id) proxy.search_by_index("city", "user_id", id) proxy.search_by_index("building", "user_id", id) proxy.search_by_index("conscript", "user_id", id) proxy.search_by_index("defense", "user_id", id) proxy.search("map", id) proxy.search("energy", id) proxy.search_by_index("node", "user_id", id) proxy.search_by_index("battle", "user_id", id) proxy.search_by_index("rival", "user_id", id) proxy.search_by_index("visit", "user_id", id) proxy.search("question", id) proxy.search("dungeon", id) proxy.search("arena", id) proxy.search_by_index("arena_record", "user_id", id) proxy.search("melee", id) proxy.search_by_index("melee_record", "user_id", id) proxy.search("exploitation", id) proxy.search("transfer", id) proxy.search_by_index("transfer_record", "user_id", id) proxy.search("pray", id) proxy.search_by_index("legendcity", "user_id", id) proxy.search_by_index("legendcity_record", "user_id", id) proxy.search("union", id) proxy.search_by_index("userdonatebox", "user_id", id) proxy.search_by_index("userunionboss", "user_id", id) proxy.search("draw", id) proxy.search("pay", id) proxy.search_by_index("pay_record", "user_id", id) proxy.search_by_index("activity", "user_id", id) proxy.search_by_index("shop", "user_id", id) proxy.search("sign", id) proxy.search_by_index("mission", "user_id", id) proxy.search("postoffice", id) proxy.search_by_index("mail", "user_id", id) proxy.search("battle_score", id) proxy.search("statistics", id) proxy.search("trainer", id) proxy.search("chest", id) proxy.search("anneal", id) proxy.search("worldboss", id) proxy.search_by_index("expand_dungeon", "user_id", id) proxy.search("plunder", id) proxy.search_by_index("plunder_record", "user_id", id) proxy.search_by_index("friend", "user_id", id) proxy.search_by_index("message", "user_id", id) defer = proxy.execute() defer.addCallback(self._post_load) return defer