Exemple #1
0
 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)
Exemple #2
0
 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)
Exemple #3
0
 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)
Exemple #4
0
    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)
Exemple #5
0
 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)
Exemple #6
0
    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)
Exemple #7
0
 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)