def _pack_signin_response(self, data, hero_list, item_list, now): """封装签到响应 """ #为了封装 response 构造 HeroInfo 和 ItemInfo win_hero = [] for (basic_id, num) in hero_list: soldier_basic_id = HeroInfo.get_default_soldier_basic_id(basic_id) soldier_id = SoldierInfo.generate_id(data.id, soldier_basic_id) soldier = data.soldier_list.get(soldier_id, True) hero = HeroInfo.create(data.id, basic_id, soldier, []) for i in range(0, num): win_hero.append(hero) win_item = [] for (basic_id, num) in item_list: item = ItemInfo.create(data.id, basic_id, num) win_item.append(item) res = user_pb2.SignInRes() res.status = 0 if len(win_hero) > 0: assert len(win_hero) == 1 pack.pack_hero_info(win_hero[0], res.hero, now) if len(win_item) > 0: assert len(win_item) == 1 pack.pack_item_info(win_item[0], res.item) return res
def _calc_member_detail(self, matcher, data, req, timer): res = union_pb2.QueryUnionMemberRes() res.status = 0 if matcher.union.union_id != req.union_id: logger.debug("User is not belong to union") res.ret = union_pb2.UNION_MEMBER_INVALID else: res.ret = union_pb2.UNION_OK #队伍 & 英雄 for team in matcher.teams: pack.pack_team_info(team, res.teams.add()) for team_msg in res.teams: for hero_msg in team_msg.heroes: if hero_msg.basic_id != 0: hero = matcher.heroes[hero_msg.basic_id] pack.pack_hero_info(hero, hero_msg, timer.now) #战斗科技 for tech in matcher.technologys: if tech.is_battle_technology(): res.battle_tech_ids.append(tech.basic_id) defer = DataBase().commit(data) defer.addCallback(self._query_member_succeed, req, res, timer) return defer
def _pack_draw_response(self, data, hero_list, item_list, resource, search_num, next_time, now): """封装响应 返回客户端的是抽奖获得的英雄和物品(并未将已经拥有的英雄分解成将魂石) 客户端会自行进行分解 """ win_hero = [] for (basic_id, num) in hero_list: soldier_basic_id = HeroInfo.get_default_soldier_basic_id(basic_id) soldier_id = SoldierInfo.generate_id(data.id, soldier_basic_id) soldier = data.soldier_list.get(soldier_id, True) hero = HeroInfo.create(data.id, basic_id, soldier, technology_basic_ids = []) for i in range(0, num): win_hero.append(hero) win_item = [] for (basic_id, num) in item_list: item = ItemInfo.create(data.id, basic_id, num) win_item.append(item) res = wineShop_pb2.WineShopDrawRes() res.status = 0 for item in win_item: pack.pack_item_info(item, res.items.add()) for hero in win_hero: pack.pack_hero_info(hero, res.heroes.add(), now) pack.pack_resource_info(resource, res.resource) res.draw.search_num = search_num res.draw.next_left_time = max(0, next_time - now) return res
def _pack_refine_cannt_upgrade(self, data, req, hero, timer): res = hero_pb2.RefineHeroRes() res.status = 0 res.return_ret = res.Refine_CANNT_UPGRADE pack.pack_hero_info(hero, res.hero, timer.now) return self._refine_upgrade_succeed(data, req, res, timer)
def _pack_update_garrison_hero_exp_response(self, heroes, now): res = hero_pb2.HeroUpdateGarrisonExpRes() res.status = 0 for hero in heroes: pack.pack_hero_info(hero, res.heroes.add(), now) return res
def _query_ranking_player_powerful_teams_succeed(self, proxy, technology_basic_ids, req, timer, teams): heroes = proxy.get_all_result("hero") res = ranking_pb2.QueryRankingPlayerPowerfulTeamsRes() res.status = 0 i = 0 for team in teams: team_res = res.teams.add() pack.pack_team_info(team, team_res) team_res.index = i i += 1 for team_hero_res in team_res.heroes: if team_hero_res.basic_id == 0: continue for hero in heroes: if hero.basic_id == team_hero_res.basic_id: pack.pack_hero_info(hero, team_hero_res, timer.now) for basic_id in technology_basic_ids: res.battle_tech_ids.append(basic_id) response = res.SerializeToString() log = log_formater.output2( req.user_id, "Query ranking player powerful teams succeed", req, res, timer.count_ms()) logger.notice(log) return response
def _calc_own_finish_result(self, union_response, rival_union_res, win, own_soldier_info, enemy_soldier_info, data, skip, heroes, req, timer): union_res = internal_union_pb2.InternalFinishUnionBattleRes() union_res.ParseFromString(union_response) if union_res.status != 0: raise Exception("Query union battle res error") score = 0 if union_res.HasField("individual_battle_score_add"): score = union_res.individual_battle_score_add #结束战斗 if win: if not union_battle_business.win_battle(data, enemy_soldier_info, own_soldier_info, score, timer.now): raise Exception("Win battle failed") else: if not union_battle_business.lose_battle(data, enemy_soldier_info, own_soldier_info, score, timer.now): raise Exception("Lose battle failed") #检查请求 if win: compare.check_user(data, req.monarch, with_level=True) for info in req.battle.attack_heroes: compare.check_hero(data, info.hero, with_level=True) for item_info in req.items: compare.check_item(data, item_info) res = union_battle_pb2.FinishUnionBattleRes() res.status = 0 if union_res.ret != union_pb2.UNION_OK: res.ret = union_res.ret else: res.ret = rival_union_res.ret if skip: pack.pack_monarch_info(data.user.get(True), res.monarch) if win: res.battle_output.result = battle_pb2.BattleOutputInfo.WIN else: res.battle_output.result = battle_pb2.BattleOutputInfo.LOSE for i, hero in enumerate(heroes): attack_hero = res.battle_output.attack_heroes.add() pack.pack_hero_info(hero, attack_hero.hero, timer.now) attack_hero.soldier_survival = own_soldier_info[i][2] if union_res.HasField("battle") and rival_union_res.HasField("battle"): defer = UnionBattlePatcher().patch_by_both_message( res.battle, union_res.battle, rival_union_res.battle, data, timer.now) defer.addCallback(self._calc_finish_post, data, req, res, timer) return defer return self._calc_finish_post(None, data, req, res, timer)
def _pack_refine_upgrade_succeed(self, data, req, hero, timer): res = hero_pb2.RefineHeroRes() res.status = 0 res.return_ret = res.Refine_SUCCESS pack.pack_hero_info(hero, res.hero, timer.now) defer = DataBase().commit(data) defer.addCallback(self._refine_upgrade_succeed, req, res, timer) return defer
def _finish_visit_succeed(self, data, req, timer): res = event_pb2.FinishEventVisitRes() res.status = 0 if req.HasField("hero"): hero = hero_business.get_hero_by_id(data, req.hero.basic_id, True) pack.pack_hero_info(hero, res.hero, timer.now) pack.pack_resource_info(data.resource.get(True), res.resource) response = res.SerializeToString() log = log_formater.output(data, "Finish visit succeed", req, res, timer.count_ms()) logger.notice(log) return response
def _pack_refine_succeed(self, data, req, hero, timer): res = hero_pb2.RefineHeroRes() res.status = 0 res.return_ret = res.Refine_SUCCESS pack.pack_hero_info(hero, res.hero, timer.now) (item_id, item_num) = hero.refine_item() item = item_business.get_item_by_id(data, item_id) pack.pack_item_info(item, res.items.add()) defer = DataBase().commit(data) defer.addCallback(self._refine_succeed, req, res, timer) return defer
def _calc_receive_deploy_force(self, data, req, timer): union = data.union.get(True) if not union.is_belong_to_target_union(req.union_id): #玩家不属于联盟 res = union_battle_pb2.DeployUnionBattleForceRes() res.status = 0 res.ret = union_pb2.UNION_NOT_MATCHED defer = DataBase().commit(data) defer.addCallback(self._receive_deploy_succeed, req, res, timer) return defer battle_score = data.battle_score.get() teams_index = battle_score.get_powerful_teams_id()[0:3] #取前三队 teams = [] for team_index in teams_index: team_id = TeamInfo.generate_id(data.id, team_index) team = data.team_list.get(team_id, True) teams.append(team) if not union_battle_business.is_able_to_deploy(data, req.node_index, teams, True): raise Exception("Team deploy invalid") union_req = internal_union_pb2.InternalDeployUnionBattleReq() user = data.user.get(True) union_req.user_id = data.id union_req.defender_user_id = data.id union_req.defender_user_name = user.get_readable_name() union_req.defender_user_icon = user.icon_id union_req.defender_user_level = user.level union_req.node_index = req.node_index for team in teams: team_msg = union_req.teams.add() team_msg.index = team.index for hero_id in team.get_heroes(): if hero_id != 0: hero = data.hero_list.get(hero_id, True) pack.pack_hero_info(hero, team_msg.heroes.add(), timer.now) for tech in data.technology_list.get_all(True): if tech.is_battle_technology() and not tech.is_upgrade: union_req.battle_tech_ids.append(tech.basic_id) defer = GlobalObject().remote['gunion'].callRemote( "deploy_battle", req.union_id, union_req.SerializeToString()) defer.addCallback(self._calc_receive_deploy_result, data, req, timer) return defer
def _pack_user_info(self, data, basic_data, req, timer, first_init, arena_matcher=None, melee_matcher=None): """打包所有用户数据 Args: data[UserData]: 用户数据 req[protobuf]: 请求 Returns: res[protobuf] """ res = init_pb2.InitRes() res.status = 0 res.first_init = first_init info = res.info user = data.user.get(True) pay = data.pay.get(True) pack.pack_monarch_info(user, info.monarch) union = data.union.get(True) resource = data.resource.get(True) if union.is_belong_to_union(): info.monarch.union_id = union.union_id info.union_battle_stage = UnionBattleStagePatcher().patch( union.union_id) pack.pack_resource_info(data.resource.get(True), info.resource) for item in data.item_list.get_all(True): pack.pack_item_info(item, info.items.add()) for hero in data.hero_list.get_all(True): pack.pack_hero_info(hero, info.heroes.add(), timer.now) for team in data.team_list.get_all(True): pack.pack_team_info(team, info.teams.add()) pack.pack_map_info(data, data.map.get(True), info.map, timer.now) for city in data.city_list.get_all(True): pack.pack_city_info(city, info.cities.add()) for building in data.building_list.get_all(True): pack.pack_building_info(building, info.buildings.add(), timer.now) for technology in data.technology_list.get_all(True): pack.pack_technology_info(technology, info.techs.add(), timer.now) for conscript in data.conscript_list.get_all(True): pack.pack_conscript_info(conscript, info.conscripts.add(), timer.now) assert len(data.defense_list) == 1 pack.pack_money_draw_info(data.draw.get(True), info.money_draw, timer.now) pack.pack_gold_draw_info(data.draw.get(True), info.gold_draw, timer.now) for mission in data.mission_list: pack.pack_mission_info(mission.get(True), info.missions.add()) #邮件看产生时间顺序给出 # data.mail.sort(cmp = None, key=lambda x:x.time, reverse = False) for mail in data.mail_list.get_all(True): pack.pack_mail_info(mail, info.mails.add(), timer.now) pack.pack_sign_info(data.sign.get(True), info.sign_in) #演武场 arena = data.arena.get(True) arena_ranking = 0 if arena_matcher is not None: arena_ranking = arena_matcher.rank pack.pack_arena_info(user, arena, info.arena, timer.now, arena_ranking) #if user.allow_pvp_arena and arena.is_arena_active(timer.now): # #胜场奖励 # if arena.is_able_to_get_win_num_reward(): # pack.pack_arena_reward_info(arena, info.arena.win_num_reward) # #对手信息 # if arena.rivals_user_id != '': # rivals_id = arena.generate_arena_rivals_id() # for rival_id in rivals_id: # rival = data.rival_list.get(rival_id, True) # pack.pack_arena_player(rival, info.arena.rivals.add()) # #系统选定的对战对手 # choose_rival_id = arena.get_choose_rival_id() # choose_rival = data.rival_list.get(choose_rival_id, True) # info.arena.choosed_user_id = choose_rival.rival_id # #对战记录 # record_list = data.arena_record_list.get_all(True) # for record in record_list: # pack.pack_arena_record(record, info.arena.records.add()) flags = account_business.get_flags() if 'is_open_melee' in flags: #乱斗场 melee = data.melee.get(True) melee_ranking = 0 if melee_matcher is not None: melee_ranking = melee_matcher.rank pack.pack_melee_info(user, melee, info.melee_arena, timer.now, melee_ranking) #if melee.is_able_to_unlock(user) and melee.is_arena_active(timer.now): # #胜场奖励 # if melee.is_able_to_get_win_num_reward(): # pack.pack_arena_reward_info(melee, info.melee_arena.win_num_reward) # #对手信息 # if melee.rivals_user_id != '': # rivals_id = melee.generate_arena_rivals_id() # for rival_id in rivals_id: # rival = data.rival_list.get(rival_id, True) # pack.pack_melee_player(rival, info.melee_arena.rivals.add()) # #对战记录 # record_list = data.melee_record_list.get_all(True) # for record in record_list: # pack.pack_arena_record(record, info.melee_arena.records.add()) ##乱斗场阵容 #(heroes_list, positions_list) = melee.get_heroes_position() #if len(heroes_list) > 0: # info.melee_team.index = 0 #for hero_basic_id in heroes_list: # (info.melee_team.heroes.add()).basic_id = hero_basic_id #for position in positions_list: # info.melee_team.hero_positions.append(position) #政令 energy = data.energy.get(True) pack.pack_energy_info(energy, info.energy_info, timer.now) #祈福 pray = data.pray.get(True) pack.pack_pray_info(pray, info.pray, timer.now) #红包 chest = data.chest.get(True) pack.pack_chest_info(chest, info.chest, timer.now) #试炼场 anneal = data.anneal.get(True) pack.pack_anneal_info(data, anneal, info.anneal, timer.now) #打包新手引导进度信息 pack.pack_guide_info(data.user.get(True), info.guide) #将星盘 herostar_list = data.herostar_list.get_all(True) for herostar in herostar_list: info.hero_star.append(herostar.star_id) #世界boss #pack.pack_worldboss_info(data.worldboss.get(True), user, info.world_boss, timer.now) #功能开关 #flags = account_business.get_flags() pack.pack_flag_info(flags, info.flags) #扩展副本 dungeons = data.expand_dungeon_list.get_all() for dungeon in dungeons: dungeon.daily_update(timer.now) pack.pack_expand_dungeon_info(dungeon, user, info.expand_dungeons.add(), 0, timer.now, brief=True) #主界面的按钮提示 pack.pack_button_tips(basic_data, data, info, timer.now) #lua #pack.pack_luas(info.luas) logger.notice( "Submit Role[user_id=%d][level=%d][name=%s][vip=%d][status=LOGIN][create_time=%d][last_login_time=%d][money=%d][food=%d][gold=%d][pay_count=%d][pay_amount=%.2f]" % (user.id, user.level, user.name, user.vip_level, user.create_time, user.last_login_time, resource.money, resource.food, resource.gold, pay.pay_count, pay.pay_amount)) #log = log_formater.output_gold(data, 0, log_formater.INIT_RESOURCE_GOLD, # "Gain gold from init resource", before_gold = data.resource.get(True).gold) #logger.notice(log) return self._init_succeed(data, req, res, timer)