def city_dungeon_start_fight(self, msgtype, body): p = self.player if not p.factionID: return fail_msg(msgtype, msgTips.FAIL_MSG_FACTION_HAS_NOT_FACTION) if not g_campaignManager.city_dungeon_campaign.is_open(): return fail_msg(msgtype, msgTips.FAIL_MSG_CITY_CAMPAIGN_CLOSED) # {{ 自动复活, 使用每日PVP的 now = int(time.time()) if (now > p.daily_dead_cd and p.daily_dead_resume < p.daily_dead_cd)\ or not p.daily_dead_cd: lineup = p.lineups.get(LineupType.City, []) for each in lineup: pet = p.pets.get(each) if pet: pet.daily_dead = False pet.daily_restHP = 0 pet.save() pet.sync() p.daily_dead_resume = now p.daily_dead_cd = now # }} p.save() p.sync() if now < p.daily_dead_cd: return fail_msg(msgtype, reason="你已经死亡") rsp = poem_pb.CityDungeonStartFightResponse() rsp.mg = g_cityDungeon.get_mg(p) rsp.verify_code = PlayerFightLock.lock(p.entityID, force=True) return success_msg(msgtype, rsp)
def friend_friendfb_end(self, msgtype, body): p = self.player req = poem_pb.EndFriendfb() req.ParseFromString(body) if not PlayerFightLock.unlock(p.entityID, req.verify_code): return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST) assert p.cache_friendfbID, "impossible" rsp = poem_pb.EndFriendfbResponse() try: createtime, hp, fbID = simple_load_friendfb( p.cache_friendfbID, 'createtime', 'hp', 'fbID') except DoesNotExistsException: error_code = msgTips.FAIL_MSG_FRIENDFB_ALREADY_DISAPPEARED else: if hp <= 0: error_code = msgTips.FAIL_MSG_FRIENDFB_ALREADY_DEAD # return fail_msg(msgtype, reason='BOSS已经被击杀了') else: from pvp.manager import send_fight_verify from fightverifier.direct_verifier import verify send_fight_verify(p, req.fight) if not verify(p, req.fight): return fail_msg(msgtype, msgTips.FAIL_MSG_FIGHT_VERIFY_FAILED) error_code = 0 now = int(time.time()) if if_boss(p.cache_friendfbID) and\ not if_boss_campaign_opened(p.cache_friendfbID) or \ not if_boss(p.cache_friendfbID) and \ now > createtime + FRIENDFB_INTERVAL: error_code = msgTips.FAIL_MSG_FRIENDFB_ALREADY_DISAPPEARED # NOQA else: info = get_config(FriendfbConfig)[fbID] if info.drop: r = open_reward(RewardType.Friendfb, info.drop) result = r.apply(p) build_reward_msg(rsp, result) damage = max(req.fight.total_damage or 0, 0) hp = hurt_boss(p, fbID, p.cache_friendfbID, damage) if hp <= 0: if if_boss(p.cache_friendfbID): # 提前发奖 bc = get_boss_campaign(p.cache_friendfbID) proxy.notify_boss_campaign_end(bc.config.ID) entityID = bc.get_by_rank(1) proxy.sync_on_task_change(entityID, TaskCond.FriendfbFirst, p.cache_friendfbID) else: give_reward(p.cache_friendfbID) on_friendfb_count(p, fbID) else: p.friendfb_deads.add(p.cache_friendfbID) p.friendfb_deadtimes[fbID] = now p.friendfb_buff = 0 p.save() p.sync() rsp.error_code = error_code return success_msg(msgtype, rsp)
def city_dungeon_final_fight(self, msgtype, body): p = self.player if not p.factionID: return fail_msg(msgtype, msgTips.FAIL_MSG_FACTION_HAS_NOT_FACTION) if not g_campaignManager.city_dungeon_campaign.is_open(): return fail_msg(msgtype, msgTips.FAIL_MSG_CITY_CAMPAIGN_CLOSED) req = poem_pb.CityDungeonFinalFightRequest() req.ParseFromString(body) rsp = poem_pb.CityDungeonFinalFightResponse() if not PlayerFightLock.unlock(p.entityID, req.verify_code): cached = get_cached_fight_response(p, req.verify_code) if cached is not None: rsp.ParseFromString(cached) return success_msg(msgtype, rsp) return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST) g_cityDungeon.battle(p, req.fight, rsp) cache_fight_response(p, req.verify_code, rsp) return success_msg(msgtype, rsp)
def flowerboss_friendfb_enter(self, msgtype, body): p = self.player req = poem_pb.EnterFriendfb() req.ParseFromString(body) from campaign.manager import g_campaignManager flower_boss_friendfbID = "bosscampaign:%d" % g_campaignManager.flower_boss_campaign.flower_boss_config_id if req.friendfbID != flower_boss_friendfbID: return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST) if player_is_dead(p, req.friendfbID): return fail_msg(msgtype, reason="已经死亡") if not if_boss(req.friendfbID) and \ req.friendfbID not in p.friendfb_list: return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST) try: createtime, maxhp, hp, fbID = simple_load_friendfb( req.friendfbID, 'createtime', 'maxhp', 'hp', 'fbID') except DoesNotExistsException: return fail_msg(msgtype, msgTips.FAIL_MSG_FRIENDFB_ALREADY_DISAPPEARED) if hp <= 0: return fail_msg(msgtype, reason='BOSS已经被击杀了') now = int(time.time()) if if_boss(req.friendfbID): if not if_boss_campaign_opened(req.friendfbID): return fail_msg(msgtype, reason='秘境已经消失') elif now > createtime + FRIENDFB_INTERVAL: return fail_msg(msgtype, reason='秘境已经消失') # activists = load_friendfb_activists(req.friendfbID) # if p.entityID in activists: # return fail_msg(msgtype, reason='已经挑战过了') if req.friendfbID not in p.friendfb_reborn_counts: p.friendfb_used_count += 1 done_friendfb(req.friendfbID, p.entityID) info = get_config(FriendfbConfig)[fbID] rsp = poem_pb.EnterFriendfbResponse(maxhp=maxhp, hp=hp, bossID=info.bossID) rsp.verify_code = PlayerFightLock.lock(p.entityID, force=True) p.cache_friendfbID = req.friendfbID p.save() p.sync() return success_msg(msgtype, rsp)
def gve_fight(self, msgtype, body): p = self.player if not gve_is_open(p): return fail_msg(msgtype, msgTips.FAIL_MSG_GROUP_GVE_NOT_OPEN) if gve_is_end(p): return fail_msg(msgtype, msgTips.FAIL_MSG_GROUP_GVE_ALREADY_END) req = poem_pb.GveFight() req.ParseFromString(body) g = Group.simple_load( p.groupID, ["gve_activateds", "gve_progress"]) g.gve_progress.load() config = get_config(GveFbInfoConfig)[req.fbID] maxhp = config.boss_hp hp = g.gve_progress.get(req.fbID, maxhp) if hp <= 0: return fail_msg(msgtype, reason="目标已经死亡") rsp = poem_pb.GveFightResponse(hp=hp, maxhp=maxhp) p.gve_state = GveEntity.GveEntityStateFight p.gve_target = req.fbID p.save() g.gve_activateds.load() sync_gve_entity(g.gve_activateds, p.entityID) rsp.verify_code = PlayerFightLock.lock(p.entityID, force=True) return success_msg(msgtype, rsp)
def flowerboss_friendfb_end(self, msgtype, body): p = self.player req = poem_pb.EndFriendfb() req.ParseFromString(body) if not PlayerFightLock.unlock(p.entityID, req.verify_code): return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST) assert p.cache_friendfbID, "impossible" from campaign.manager import g_campaignManager flower_boss_friendfbID = "bosscampaign:%d" % g_campaignManager.flower_boss_campaign.flower_boss_config_id if p.cache_friendfbID != flower_boss_friendfbID: return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST) rsp = poem_pb.EndFriendfbResponse() try: createtime, hp, fbID = simple_load_friendfb( p.cache_friendfbID, 'createtime', 'hp', 'fbID') except DoesNotExistsException: error_code = msgTips.FAIL_MSG_FRIENDFB_ALREADY_DISAPPEARED else: if hp <= 0: error_code = msgTips.FAIL_MSG_FRIENDFB_ALREADY_DEAD # return fail_msg(msgtype, reason='BOSS已经被击杀了') else: from pvp.manager import send_fight_verify from fightverifier.direct_verifier import verify send_fight_verify(p, req.fight) if not verify(p, req.fight): return fail_msg(msgtype, msgTips.FAIL_MSG_FIGHT_VERIFY_FAILED) error_code = 0 now = int(time.time()) if if_boss(p.cache_friendfbID) and\ not if_boss_campaign_opened(p.cache_friendfbID) or \ not if_boss(p.cache_friendfbID) and \ now > createtime + FRIENDFB_INTERVAL: error_code = msgTips.FAIL_MSG_FRIENDFB_ALREADY_DISAPPEARED # NOQA else: damage = max(req.fight.total_damage or 0, 0) info = get_config(FriendfbConfig)[fbID] if info.drop: from config.configs import HandselMulRewardConfig mr_configs = get_config(HandselMulRewardConfig) mr_id = g_campaignManager.flower_boss_campaign.get_mulreward_id( ) mr_config = mr_configs[mr_id] mr = mr_config.mulreward import math r = open_reward(RewardType.Flower315Campaign, info.drop, int(math.ceil(mr * damage))) result = r.apply(p) build_reward_msg(rsp, result) start_time, end_time = g_campaignManager.flower_boss_campaign.get_current_time( ) if p.flower_boss_campaign_last_time < start_time or p.flower_boss_campaign_last_time > end_time: p.flower_boss_campaign_total_hurt = 0 p.flower_boss_campaign_total_hurt += damage p.flower_boss_campaign_last_time = now hp = hurt_boss(p, fbID, p.cache_friendfbID, damage) if hp <= 0: if if_boss(p.cache_friendfbID): # 提前发奖 bc = get_boss_campaign(p.cache_friendfbID) proxy.notify_boss_campaign_end(bc.config.ID) entityID = bc.get_by_rank(1) proxy.sync_on_task_change(entityID, TaskCond.FriendfbFirst, p.cache_friendfbID) else: give_reward(p.cache_friendfbID) on_friendfb_count(p, fbID) else: p.friendfb_deads.add(p.cache_friendfbID) p.friendfb_deadtimes[fbID] = now p.friendfb_buff = 0 p.save() p.sync() rsp.error_code = error_code return success_msg(msgtype, rsp)
def gve_fight_end(self, msgtype, body): p = self.player error_code = 0 if not gve_is_open(p): error_code = msgTips.FAIL_MSG_GROUP_GVE_NOT_OPEN elif gve_is_end(p): error_code = msgTips.FAIL_MSG_GROUP_GVE_ALREADY_END elif not p.gve_target: error_code = msgTips.FAIL_MSG_GROUP_GVE_ALREADY_END else: sceneID = get_sceneID() req = poem_pb.GveFightEnd() req.ParseFromString(body) if not PlayerFightLock.unlock(p.entityID, req.verify_code): return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST) hurt = req.fight.total_damage or 1 win = req.fight.fightResult hp = int(Group.pool.execute( "HINCRBY", "gve_progress_g{%s}" % p.groupID, p.gve_target, -hurt)) update_group_damage(sceneID, p.groupID, hurt) update_group_member_damage(sceneID, p.entityID, hurt) fbID = p.gve_target scene = get_config(SceneInfoConfig)[sceneID] index = scene.fbs.index(fbID) + 3 config = get_config(GveFbInfoConfig)[fbID] maxhp = config.boss_hp g = Group.simple_load( p.groupID, [ "gve_end_cd", "gve_activateds", "gve_deads", "gve_rewards", "gve_activateds_detail"]) g.gve_activateds.load() if not win: p.gve_target = 0 set_gve_state(p, GveEntity.GveEntityStateDead, force=True) g.gve_deads.load() g.gve_deads.add(p.entityID) count = len(g.gve_deads) if count >= len(g.gve_activateds): g.gve_end_cd = int(time.time()) + 19 g.save() else: p.gve_target = 0 set_gve_state( p, GveEntity.GveEntityStateNormal, force=True) boss_state = GveEntity.GveEntityStateNormal \ if hp > 0 else GveEntity.GveEntityStateDead p.gve_damage += hurt total_damage = max( p.gve_damage, get_group_score(sceneID, p.groupID)) sync_group_damage(p.groupID, total_damage) gve_scene = get_config(GveSceneInfoConfig)[sceneID] max_damage = gve_scene.max_damage p.gve_score = int(10000 * p.gve_damage / float(max_damage)) x = p.gve_damage / float(total_damage) p.gve_addition = int(( 0.25 * (pow( x, 3) - 7 * pow( x, 2) + 7 * x) + p.gve_damage / float( max_damage)) * 100) p.gve_groupdamage = total_damage g.gve_rewards.load() rewards = ujson.loads(p.gve_basereward) g.gve_rewards[p.entityID] = [ rewards, g.gve_end_cd, p.gve_addition] for k in g.gve_activateds: if k in g.gve_rewards: v = g.gve_rewards[k] v[1] = g.gve_end_cd g.gve_rewards[k] = v g.gve_activateds_detail.load() g.gve_activateds_detail[p.entityID] = { "addition": p.gve_addition, "damage": p.gve_damage, "score": p.gve_score, "total_damage": p.gve_groupdamage, } g.save() # a = 个人总伤害 # b = 团队总伤害 # x = a/b # max = 理论最大伤害(配在gve副本表中,每个副本都有相应的max值) # # 奖励加成 # y = 0.25 * ( x^3 - 7*x^2 + 7*x ) + a/max # 保留2位小数,换算成百分比可得 XX% # # 个人评分 # 评分 = int(10000*a/max) p.save() p.sync() sync_gve_entity(g.gve_activateds, p.entityID) boardcast_gve_entity( g.gve_activateds, success_msg( msgid.SYNC_GVE_ENTITY, poem_pb.GveEntity(**{ "id": fbID, "index": index, "state": boss_state, "hp": hp, "maxhp": maxhp, }))) rsp = poem_pb.GveFightEndResponse() rsp.error_code = error_code return success_msg(msgtype, rsp)