示例#1
0
文件: service.py 项目: kimch2/x8623
 def vip_packs_buy(self, msgtype, body):
     req = poem_pb.VipPacksBuyRequest()
     req.ParseFromString(body)
     p = self.player
     from entity.manager import save_guide
     save_guide(p, req.guide_type)  # 保存新手引导进度
     now = int(time.time())
     today = datedate.fromtimestamp(now)
     config = get_config(VipPacksConfig).get(req.ID)
     if not config:
         return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST)
     if config.gift_type != VipPackType.Daily:
         if now < config.gift_starttime or now > config.gift_lasttime:
             return fail_msg(msgtype, msgTips.FAIL_MSG_VIP_PACKS_EXPIRED)
     rest = get_vip_pack_rest_count(p, req.ID, today=today)
     if rest != -1 and rest <= 0:
         return fail_msg(msgtype, reason="次数不足")
     if p.vip < config.vip_level:
         return fail_msg(msgtype, reason="VIP不足")
     cost = parse_reward([{
         'count': config.discount_price,
         'type': config.discount_price_type}])
     gain = parse_reward(config.rewards)
     try:
         apply_reward(p, gain, cost=cost, type=RewardType.VipPacks)
     except AttrNotEnoughError:
         return fail_msg(msgtype, reason="消耗不足")
     set_vip_packs_limits(p, config.ID, now)
     p.vip_packs_today_bought_count += 1
     p.save()
     p.sync()
     return success_msg(msgtype, "")
示例#2
0
文件: service.py 项目: kimch2/x8623
    def gem_compose(self, msgtype, body):
        req = poem_pb.GemComposeRequest()
        req.ParseFromString(body)
        p = self.player
        config = get_config(GemConfig).get(req.gemID, None)
        if not config:
            return fail_msg(msgtype, code=msgTips.FAIL_MSG_INVALID_REQUEST)

        if config.gupr <= 0:
            return fail_msg(msgtype, code=msgTips.FAIL_MSG_INVALID_REQUEST)

        have = p.gems.get(config.ID, 0)
        if have >= config.compose_consume:
            count = have / config.compose_consume if req.all else 1
            cost = config.compose_consume * count
            cost = parse_reward(
                [dict(type=RewardItemType.Gem, arg=config.ID, count=cost)])
            reward = parse_reward(
                [dict(type=RewardItemType.Gem, arg=config.gupr, count=count)])
            result = apply_reward(p,
                                  reward,
                                  cost=cost,
                                  type=RewardType.GemCompose)
        else:
            return fail_msg(msgtype, reason='宝石不足')

        p.save()
        p.sync()
        return success_msg(msgtype, '')
示例#3
0
文件: service.py 项目: kimch2/x8623
 def trigger_store_buy(self, msgtype, body):
     p = self.player
     if not check_trigger_event_type(p, EventType.Store):
         return fail_msg(msgtype, reason="无触发事件或错误的事件类型")
     config = get_config(TriggerEventConfig)[p.trigger_event]
     goods = get_config(TriggerStoreConfig).get(config.event_param)
     if not goods:
         return fail_msg(msgtype, reason="没有这个商品")
     cost = parse_reward([{
         'count': goods.discount_price,
         'type': goods.discount_price_type}])
     gain = parse_reward([goods.reward])
     try:
         apply_reward(p, gain, cost=cost, type=RewardType.TriggerStore)
     except AttrNotEnoughError as e:
         if e.attr == "gold":
             return fail_msg(msgtype, reason="钻石不足")
         elif e.attr == "money":
             return fail_msg(msgtype, reason="金币不足")
         else:
             return fail_msg(msgtype, reason="消耗不足")
     p.trigger_event = 0
     p.save()
     p.sync()
     return success_msg(msgtype, "")
示例#4
0
文件: manager.py 项目: kimch2/x8623
 def give_reward(self, date=None):
     if not date:
         now = int(time.time())
         tm = date = datedate.fromtimestamp(now).strftime("%Y-%m-%d")
     else:
         tm = date
     ranking = get_ranking_backup(self.type)
     key = ranking.key
     ll = get_config(RankingCampaignRewardByGroupConfig).get(
         self.config.group, [])
     configs = get_config(RankingCampaignRewardConfig)
     configs = [configs[i.id] for i in ll]
     key = "%s{%s}" % (key, tm)
     limit = get_ranking_limit(self.type)
     if limit is not None:
         rankers = ranking.get_range_by_score(limit,
                                              "+inf",
                                              withscores=True)
     else:
         rankers = ranking.get_range_by_score("-inf",
                                              "+inf",
                                              withscores=True)
     rankers = convert_list_to_dict(rankers, dictcls=OrderedDict).items()
     for rank, (entityID, score) in enumerate(rankers, 1):
         config = None
         for c in configs:
             start, end = c.range
             if start:
                 if start > rank:
                     continue
             if end:
                 if end < rank:
                     continue
             config = c
         if not config:
             continue
         title, content, ID = get_mail("RankingReward")
         content = content.format(self.config.day, self.config.title, rank)
         if self.type in get_faction_types():
             f = Faction.simple_load(entityID, ["leaderID", "memberset"])
             for i in set(f.memberset):
                 if i == f.leaderID:
                     rewards = parse_reward(config.rewards)
                 else:
                     rewards = parse_reward(config.rewards2)
                 try:
                     proxy.ranking_send_mail(i, title, content, rewards,
                                             key, ID)
                 except AttributeError:
                     pass
         else:
             rewards = parse_reward(config.rewards)
             try:
                 proxy.ranking_send_mail(entityID, title, content, rewards,
                                         key, ID)
             except AttributeError:
                 pass
示例#5
0
文件: service.py 项目: kimch2/x8623
 def treasure_end(self, msgtype, body):
     p = self.player
     req = poem_pb.EndTreasure()
     req.ParseFromString(body)
     if not PlayerTreasureLock.unlock(p.entityID, req.verify_code):
         logger.debug("verify_code %s", req.verify_code)
         return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST)
     if not p.treasure_cache:
         logger.debug("not treasure_cache")
         return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST)
     rewards = []
     for type, subtype, count in p.treasure_cache:
         if type == TreasureGrid.TreasureGridTypeReward:
             rewards.append(poem_pb.RewardData(
                 type=subtype, count=count))
     r1 = parse_reward(req.rewards)
     r2 = parse_reward(rewards)
     logger.debug("reward %r %r", r1, r2)
     if not compare_reward(r1, r2):
         logger.debug("compare reward fail")
         return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST)
     config = get_config(TreasureChestConfig)[p.treasure_type]
     gain_chest = bool(req.gain_chest)
     if gain_chest:
         reward = open_reward(RewardType.Treasure, config.drop)
         result = reward.apply_after()
     else:
         result = {}
     result = combine_reward(r1, result)
     rsp = poem_pb.EndTreasureResponse()
     finisheds = []
     finisheds.append(gain_chest)
     finisheds.append(bool(req.kill_monster))
     need = get_cons_value("TreasureNeedBuffCount")
     finisheds.append(len(req.rewards) >= need)
     rsp.stars = len(filter(lambda s: s, finisheds))
     if rsp.stars == len(finisheds):
         rewardex = open_reward(RewardType.Treasure, config.dropex)
         rsp.rewardsex = build_reward(rewardex.apply(p))
     rsp.finisheds = finisheds
     apply_reward(p, result, type=RewardType.Treasure)
     build_reward_msg(rsp, result)
     now = int(time.time())
     p.treasure_used_count += 1
     p.treasure_cd = now + 10 * 60
     p.treasure_cache = []
     refresh_treasure(p)
     on_treasure_count(p)
     p.save()
     p.sync()
     return success_msg(msgtype, rsp)
示例#6
0
文件: service.py 项目: kimch2/x8623
 def vip_packs_info(self, msgtype, body):
     req = poem_pb.VipPacksInfoRequest()
     req.ParseFromString(body)
     rsp = poem_pb.VipPacksInfo()
     p = self.player
     now = int(time.time())
     today = datedate.fromtimestamp(now)
     configs = get_config(VipPacksConfig)
     if req.type == VipPackType.Daily:
         try:
             config = get_config(VipConfig)[req.vip or p.vip]
         except KeyError:
             config = get_config(VipConfig)[p.vip]
         group = [config.day_giftID]
     else:
         group = [i.ID for i in get_config(
             VipPacksByGroupConfig).get(req.type, [])]
     for each in group:
         config = configs[each]
         if config.gift_type != VipPackType.Daily:
             if now < config.gift_starttime or now > config.gift_lasttime:
                 continue
         info = dict(config._asdict())
         info["rewards"] = build_reward(parse_reward(info["rewards"]))
         #  同组共用一个限购数据
         count = get_vip_pack_rest_count(p, each, today=today)
         info["count"] = count
         rsp.packs.add(**info)
     return success_msg(msgtype, rsp)
示例#7
0
def give_visit_reward(p=None):
    if p:
        ps = [p]
    else:
        ps = g_entityManager.players.values()
    # 有积分,发奖励
    campaign = g_campaignManager.visit_campaign
    campaign_opened = campaign.is_open()
    start, final = campaign.get_current_time()
    for p in ps:
        if not p.pious or not p.visit_group:
            continue
        configs = get_config(VisitRewardByGroupConfig).get(p.visit_group, [])
        if campaign_opened:
            if p.visit_time >= start and p.visit_time < final:
                continue
        for config in configs:
            if p.pious >= config.pious:
                rewards = parse_reward(config.rewards)
                title, content, ID = get_mail("Visit")
                content = content.format(p.pious)
                send_mail(p.entityID,
                          title,
                          content,
                          addition=rewards,
                          configID=ID)
                p.pious_backup = p.pious
                p.pious = 0
                p.save()
                p.sync()
                break
示例#8
0
    def tip(self, player):
        """打赏
        这部分最麻烦的是打赏的类型会根据配置变化,配置变化时必须结算当前打赏收益
        """
        config = get_config(ClimbTowerAccreditConfig)[player.climb_tower_floor + 1]
        cost = dict(zip(['type', 'arg', 'count'], config.tip))
        apply_reward(player, {}, parse_reward([cost]), type=RewardType.ClimbTower)

        target = self.challenge(player)
        if target['entityID'] > 0:
            # 保存打赏收益及次数
            idx = self.tip_earnings[config.tip[0]]
            idx.pool.execute('HINCRBY', idx.key,
                             target['entityID'], config.tip[2])
            idx.pool.execute('HINCRBY', idx.key,
                             't%d' % target['entityID'], 1)

            now = int(time.time())
            self.add_history(target['entityID'], {
                "oppID": player.entityID,
                "name": player.name,
                "prototypeID": player.prototypeID,
                "borderID": player.borderID,
                "level": player.level,
                "faction_name": player.faction_name,
                "isWin": False,
                "isActive": True, "time": now,
                "isRevenge": False,
                "tip_type": config.tip[0],
                "tip_count": config.tip[2],
            })
示例#9
0
 def city_treasure_recv(self, msgtype, body):
     if g_campaignManager.city_dungeon_campaign.is_open():
         return fail_msg(msgtype, reason="活动开启中")
     if g_campaignManager.city_contend_campaign.is_open():
         return fail_msg(msgtype, reason="活动开启中")
     p = self.player
     info = g_cityDungeon.get_top_info()
     top_factionID = info.get("top_factionID", 0)
     if not top_factionID:
         return fail_msg(msgtype, reason="还没有公会获得宝藏")
     if p.factionID != top_factionID:
         return fail_msg(msgtype, reason="您不属于这个公会")
     if p.city_treasure_recv_flag:
         return fail_msg(msgtype, reason="今天已经领取过了")
     f = Faction.simple_load(p.factionID, ["faction_treasure"])
     if not f.faction_treasure:
         return fail_msg(msgtype, reason="还没有公会获得宝藏")
     current = None
     configs = get_config(CityTreasureRecvConfig)
     for config in configs.values():
         if f.faction_treasure >= config.treasure_count:
             current = config
         else:
             break
     if not current:
         return fail_msg(msgtype, reason="没有奖励可以领取")
     result = apply_reward(p,
                           parse_reward(current.rewards),
                           type=RewardType.CityTreasure)
     rsp = poem_pb.CityTreasureRecv()
     build_reward_msg(rsp, result)
     p.city_treasure_recv_flag = True
     p.save()
     p.sync()
     return success_msg(msgtype, rsp)
示例#10
0
文件: service.py 项目: kimch2/x8623
 def trigger_chest_recv(self, msgtype, body):
     p = self.player
     if not check_trigger_event_type(p, EventType.Chest):
         return fail_msg(msgtype, reason="无触发事件或错误的事件类型")
     req = poem_pb.TriggerChestRecvRequest()
     req.ParseFromString(body)
     config = get_config(TriggerEventConfig)[p.trigger_event]
     chest = get_config(TriggerChestConfig).get(config.event_param)
     if not chest:
         return fail_msg(msgtype, reason="不存在的宝箱")
     if req.is_double:
         cost = {"gold": get_cons_value("TriggerChestDoubleCost")}
         gain = {}
         for i in range(get_cons_value("TriggerChestMultiple")):
             gain = combine_reward([chest.reward], [], data=gain)
     else:
         cost = {}
         gain = parse_reward([chest.reward])
     try:
         apply_reward(p, gain, cost=cost, type=RewardType.TriggerChest)
     except AttrNotEnoughError:
         return fail_msg(msgtype, reason="钻石不足")
     p.trigger_event = 0
     p.save()
     p.sync()
     rsp = poem_pb.TriggerChestRecv()
     build_reward_msg(rsp, gain)
     return success_msg(msgtype, rsp)
示例#11
0
def give_reward_by_mail(p):
    now = int(time.time())
    if not p.groupID:
        return
    g = Group.simple_load(
        p.groupID, ["name", "gve_rewards", "members", "gve_activateds_detail"])
    g.gve_rewards.load()
    g.gve_activateds_detail.load()
    if p.entityID not in g.gve_rewards:
        return
    rewards, lock, addition = g.gve_rewards[p.entityID]
    detail = g.gve_activateds_detail.get(p.entityID, {})
    addition = detail.get("addition", 0)
    score = detail.get("score", 0)
    damage = detail.get("damage", 0)
    total_damage = detail.get("total_damage", 0)
    title, content, ID = get_mail("GroupBaseReward")
    content = content.format(g.name, total_damage, damage, score, addition)
    if now >= lock:
        for reward in rewards:
            reward["count"] = int(reward["count"] *
                                  (1 + addition / float(100)))
        rewards = parse_reward(rewards)
        if rewards:
            send_mail(p.entityID,
                      title,
                      content,
                      addition=rewards,
                      configID=ID)
        del g.gve_rewards[p.entityID]
        g.members.load()
        member = g.members[p.entityID]
        member["intimate"] = member.get("intimate", 0) + 10
        g.members[p.entityID] = member
        g.save()
示例#12
0
文件: city.py 项目: kimch2/x8623
 def give_reward(self):
     ranking = CityDungeonSelfRanking.get_range_by_score(
         "-inf", "+inf", withscores=True)
     configs = get_config(CityDungeonRewardConfig)
     from campaign.manager import g_campaignManager
     start_time = g_campaignManager.city_dungeon_campaign.get_start_time()
     final_time = g_campaignManager.city_dungeon_campaign.get_final_time()
     for rank, (entityID, score) in enumerate(
             convert_list_to_dict(ranking, dictcls=OrderedDict).items(), 1):
         if not rank:
             continue
         for c in configs.values():
             start, end = c.range
             if start:
                 if start > rank:
                     continue
             if end:
                 if end < rank:
                     continue
             config = c
         if not config:
             continue
         title, content, ID = get_mail("CityDungeon")
         content = content.format(rank)
         rewards = parse_reward(config.rewards)
         key = "CityDungeon{%d}{%d}" % (start_time, final_time)
         try:
             proxy.city_send_mail(
                 entityID, title, content, rewards, key, ID)
         except AttributeError:
             pass
示例#13
0
文件: city.py 项目: kimch2/x8623
 def get_panel(self, p, rsp):
     if self.is_top_faction(p.factionID):  # 防守方
         rsp.self_rank = CityContendDefendRanking.get_rank(p.entityID)
         if not rsp.self_rank:
             CityContendDefendRanking.update_score(p.entityID, 0)
         rsp.self_ranking = self.get_player_ranking(
             CityContendDefendRanking)
         if not p.city_contend_treasure:
             configs = get_config(CityTreasureConfig)
             config = configs.get(p.level)
             if not config:
                 config = configs[max(configs)]
             p.city_contend_treasure = config.defend_treasure
             p.save()
             p.sync()
     else:  # 攻击方
         rsp.self_rank = CityContendAttackRanking.get_rank(p.entityID)
         if not rsp.self_rank:
             CityContendAttackRanking.update_score(p.entityID, 0)
         rsp.faction_rank = CityContendFactionRanking.get_rank(p.factionID)
         if not rsp.faction_rank:
             CityContendFactionRanking.update_score(p.factionID, 0)
         rsp.self_ranking = self.get_player_ranking(
             CityContendAttackRanking)
         rsp.faction_ranking = self.get_faction_ranking(
             CityContendFactionRanking)
     rsp.reds = list(g_redManager.get_red_messages(
         module=RedModuleType.CityContendDefend)) + list(
             g_redManager.get_red_messages(
                 module=RedModuleType.CityContendAttack))
     rsp.events = self.get_events(p)
     rsp.rewards = build_reward(parse_reward(p.city_contend_rewards))
     f = Faction.simple_load(p.factionID, ["faction_treasure"])
     rsp.faction_treasure = f.faction_treasure
示例#14
0
文件: service.py 项目: kimch2/x8623
 def trigger_chests_recv(self, msgtype, body):
     p = self.player
     if not check_trigger_event_type(p, EventType.Chests):
         return fail_msg(msgtype, reason="无触发事件或错误的事件类型")
     config = get_config(TriggerEventConfig)[p.trigger_event]
     chest = get_config(TriggerChestsConfig).get(config.event_param)
     if len(p.trigger_chests) > 0:
         cost = {"gold": get_cons_value("TriggerChestsMoreCost")}
     else:
         cost = {}
     rests = set(range(len(chest.rewards))) - p.trigger_chests
     if not rests:
         return fail_msg(msgtype, reason="已经没有宝箱了")
     index = choice_one(list(rests))
     is_best = False
     if index == 0:
         p.trigger_event = 0
         is_best = True
     gain = parse_reward([chest.rewards[index]])
     try:
         apply_reward(p, gain, cost=cost, type=RewardType.TriggerChests)
     except AttrNotEnoughError:
         return fail_msg(msgtype, reason="钻石不足")
     p.trigger_chests.add(index)
     p.save()
     p.sync()
     rsp = poem_pb.TriggerChestsRecv(is_best=is_best)
     build_reward_msg(rsp, gain)
     return success_msg(msgtype, rsp)
示例#15
0
文件: service.py 项目: kimch2/x8623
 def trigger_chests_info(self, msgtype, body):
     p = self.player
     if not check_trigger_event_type(p, EventType.Chests):
         return fail_msg(msgtype, reason="无触发事件或错误的事件类型")
     config = get_config(TriggerEventConfig)[p.trigger_event]
     chest = get_config(TriggerChestsConfig).get(config.event_param)
     reward = chest.rewards[0]  # 默认第一个是最好的
     rsp = poem_pb.TriggerChestsInfo(
         more_cost=get_cons_value("TriggerChestsMoreCost"))
     build_reward_msg(rsp, parse_reward([reward]))
     return success_msg(msgtype, rsp)
示例#16
0
文件: service.py 项目: kimch2/x8623
 def trigger_store_info(self, msgtype, body):
     p = self.player
     if not check_trigger_event_type(p, EventType.Store):
         return fail_msg(msgtype, reason="无触发事件或错误的事件类型")
     config = get_config(TriggerEventConfig)[p.trigger_event]
     goods = get_config(TriggerStoreConfig).get(config.event_param)
     if not goods:
         return fail_msg(msgtype, reason="没有这个商品")
     info = goods._asdict()
     info["rewards"] = build_reward(parse_reward([goods.reward]))
     rsp = poem_pb.TriggerStoreInfo(**info)
     return success_msg(msgtype, rsp)
示例#17
0
文件: service.py 项目: kimch2/x8623
 def visit_reward(self, msgtype, body):
     campaign = g_campaignManager.visit_campaign
     if campaign.is_open():
         group = campaign.get_current().reward_group
     else:
         group = 1
     configs = get_config(VisitRewardByGroupConfig).get(group)
     rsp = poem_pb.VisitRewardResponse()
     for config in sorted(configs, key=lambda s: s.pious, reverse=True):
         info = config._asdict()
         info["rewards"] = build_reward(parse_reward(config.rewards))
         rsp.items.add(**info)
     return success_msg(msgtype, rsp)
示例#18
0
    def tally_up(self, player):
        """结算收益"""
        if not player:
            return
        cd = player.climb_tower_accredit_cd
        floor = player.climb_tower_accredit_floor

        if floor in self.floors:
            # 统一的结束时间
            payoff = self.floors[floor].payoff
            if payoff > player.climb_tower_accredit_stash_time and payoff < cd:
                player.climb_tower_accredit_cd = cd = payoff
                player.save()

        if floor > 0 and cd > 0 and cd <= int(time.time()):
            # 派驻到期
            config = get_config(ClimbTowerAccreditConfig)[floor]
            payload = dict(type=config.earnings[0], arg=config.earnings[0],
                           count=player.climb_tower_accredit_acc_earnings)
            rewards = [payload] if payload['count'] > 0 else []
            clear = []
            fields = ['t%d' % player.entityID, player.entityID]

            # 结算所有类型打赏收益
            for kind, idx in self.tip_earnings.items():
                tip = int(idx.pool.execute('HGET', idx.key, player.entityID) or 0)
                if tip > 0:
                    earnings = dict(type=kind,
                                    arg=kind,
                                    count=tip)
                    rewards.append(earnings)
                    clear.append(idx)

            logger.info('tally_up: %d, %s' % (player.entityID, rewards))
            reward = parse_reward(rewards)
            title, content, ID = get_mail('ClimbTowerAccredit')
            dt = datetime.fromtimestamp(cd)
            send_mail(player.entityID, title=title,
                      content=content.format(dt.strftime('%Y-%m-%d')),
                      addition=reward, configID=ID)
            self.floors[floor].idx.unregister(player.entityID)
            player.climb_tower_accredit_stash_time = 0
            player.climb_tower_accredit_cd = 0
            player.climb_tower_accredit_stash_earnings = 0
            player.climb_tower_accredit_floor = 0
            player.save()
            player.sync()

            for idx in clear:
                idx.pool.execute('HDEL', idx.key, *fields)
示例#19
0
def send_flower_boss_mail_offline(entityID, configID, rank, damage):
    if not configID:
        return
    p = Player.simple_load(entityID, ['friendfb_kill_count'])
    p.friendfb_kill_count += 1
    config = get_config(FriendfbRewardConfig).get(configID)
    rewards = {}
    if config:
        rewards = parse_reward(config.rewards)
    p.save()
    title, content, ID = get_mail("FlowerBoss")
    content = content.format(damage, rank)
    do_send_mail(entityID, title, content, addition=rewards, configID=ID)
    return True
示例#20
0
def advance_equip(p, petID, equipID, equips):
    pet = p.pets.get(petID)
    if not pet:
        return msgTips.FAIL_MSG_INVALID_REQUEST
    equip = get_or_create_equip(p, pet, equipID)
    if not equip:
        return msgTips.FAIL_MSG_INVALID_REQUEST
    equip_config = get_config(NewEquipConfig).get(equip.prototypeID)
    if not equip_config:
        return msgTips.FAIL_MSG_INVALID_REQUEST
    binding = p.equipeds.get(equip.entityID)
    if petID != binding:
        return msgTips.FAIL_MSG_INVALID_REQUEST
    advance_configs = get_config(EquipAdvanceConfig)
    advance_config = advance_configs.get(equip.step)
    if equip.step + 1 > max(advance_configs):
        return msgTips.FAIL_MSG_INVALID_REQUEST
    # 宠物必须满足等级要求
    if pet.level < advance_config.level:
        return msgTips.FAIL_MSG_INVALID_REQUEST
    advance_cost_config = get_config(EquipAdvanceCostConfig).get(
        equip_config.gup_id)
    if not advance_cost_config:
        return msgTips.FAIL_MSG_INVALID_REQUEST
    cost = parse_reward(advance_cost_config.costs[equip.step - 1])
    combine_reward({"money": advance_config.money}, {}, data=cost)
    equipList = sorted([i[0] for i in cost.pop("equipList", [])])
    try:  # 扣除装备,宠物 TODO
        equips = [p.equips[i] for i in equips]
        equips_prototypeID = sorted([i.prototypeID for i in equips])
        if len(equips_prototypeID) != len(equipList):
            raise KeyError
        for i in range(len(equips_prototypeID)):
            if equips_prototypeID[i] != equipList[i]:
                raise KeyError
        apply_reward(p, {}, cost, type=RewardType.EquipAdvance)
        p.del_equips(*equips)
    except KeyError:
        return msgTips.FAIL_MSG_INVALID_REQUEST
    except (AttrNotEnoughError or MatNotEnoughError):
        return msgTips.FAIL_MSG_INVALID_REQUEST
    equip.step += 1
    from task.manager import on_advance_equip
    on_advance_equip(p, equip)
    update_ranking_equip(p, equip)
    equip.save()
    equip.sync()
    p.save()
    p.sync()
    return SUCCESS
示例#21
0
def send_flower_boss_mail(entityID, configID, rank, damage):
    if not configID:
        return
    p = g_entityManager.get_player(entityID)
    p.friendfb_kill_count += 1
    p.save()
    p.sync()
    config = get_config(FriendfbRewardConfig).get(configID)
    rewards = {}
    if config:
        rewards = parse_reward(config.rewards)
    title, content, ID = get_mail("FlowerBoss")
    content = content.format(damage, rank)
    do_send_mail(entityID, title, content, addition=rewards, configID=ID)
    return True
示例#22
0
文件: dlc.py 项目: kimch2/x8623
def get_campaign_info(p, dlcID):
    from task.manager import get_task_info
    from task.manager import get_plan
    campaign = g_dlcCampaignManager.campaigns.get(dlcID)
    if not campaign or not campaign.is_open():
        return
    rsp = poem_pb.DlcCampaignInfo()
    today = datedate.today()
    dlc_tasks = p.dlc_tasks.get(dlcID, [])
    task = None
    count = 0
    total = len(dlc_tasks)
    configs = get_config(DlcTaskConfig)
    infos = get_config(TaskConfig)
    cost = 0
    for i in sorted(dlc_tasks):
        dlc_task = configs[i]
        info = infos[i]
        is_done = get_plan(p, i, today) >= info.goal
        if dlc_task.rewards:
            rsp.nodes.add(
                rewards=build_reward(
                    parse_reward(dlc_task.rewards)),
                can_receive=(i in p.taskrewards),
                is_done=is_done,
                index=dlc_task.index)
        if is_done:
            count += 1
            if task is None:
                if i in p.taskrewards:
                    task = get_task_info(p, i, today)
                    cost = dlc_task.gold
        elif task is None:
            task = get_task_info(p, i, today)
            cost = dlc_task.gold
    if task:
        now = int(time.time())
        rsp.campaign_cd = max(campaign.get_end_time() - now, 0)
        rsp.task = task
        rsp.count = count
        rsp.total = total
        rsp.cost = cost
        cd = p.dlc_tasks_cd.get(dlcID, 0)
        if cd:
            rsp.cd = max(cd - now, 0)
        return rsp
    return None
示例#23
0
文件: service.py 项目: kimch2/x8623
 def dlc_star_packs_info(self, msgtype, body):
     p = self.player
     req = poem_pb.DlcStarPacksInfoRequest()
     req.ParseFromString(body)
     group = get_config(DlcStarPacksByDlcConfig).get(req.dlcID, [])
     configs = get_config(DlcStarPacksConfig)
     rsp = poem_pb.DlcStarPacksInfo()
     for each in group:
         config = configs[each.ID]
         if each.ID in p.dlc_star_packs_end:
             continue
         rsp.packs.add(
             id=config.ID, star=config.score,
             rewards=build_reward(
                 parse_reward(config.rewards)))
     # rsp.rank = get_current_rank("DLC%d" % req.dlcID, p.entityID)
     return success_msg(msgtype, rsp)
示例#24
0
文件: service.py 项目: kimch2/x8623
 def dlc_star_packs_recv(self, msgtype, body):
     req = poem_pb.DlcStarPacksRecv()
     req.ParseFromString(body)
     p = self.player
     if req.id in p.dlc_star_packs_end:
         return fail_msg(msgtype, reason="领过了")
     config = get_config(DlcStarPacksConfig).get(req.id)
     if not config:
         return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST)
     score = get_dlc_score(p, config.dlcID)
     if score < config.score:
         return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST)
     apply_reward(
         p, parse_reward(config.rewards),
         type=RewardType.DlcStarPacks)
     p.dlc_star_packs_end.add(req.id)
     p.save()
     p.sync()
     return success_msg(msgtype, '')
示例#25
0
文件: boss.py 项目: kimch2/x8623
def give_reward(p, rewards=None):
    if not rewards:
        rs = pool.execute("HGET", BOSS_REWARD, p.entityID)
        if rs:
            rewards = cPickle.loads(rs)
        else:
            return
    for key, info in rewards.items():
        if key in p.boss_campaign_rewards:
            continue
        title, content, ID = get_mail("BossKill")
        content = content.format(info.get("damage", 0), info.get("rank", 0))
        send_mail(p.entityID,
                  title,
                  content,
                  addition=parse_reward(info.get("rewards", {})),
                  configID=ID)
        p.boss_campaign_rewards.add(key)
        p.save()
    pool.execute("HDEL", BOSS_REWARD, p.entityID)
示例#26
0
 def give_reward(self, key=None, p=None):
     if not key:
         date = datedate.today() - timedelta(days=1)
         key = self.backup_key(date)
         if key not in self.rewards:
             self.dump_rewards(key)
     ranking = SwapRanking(Player,
                           'swaprank',
                           pool=settings.REDISES['index'],
                           register_on_create=False,
                           key=key)
     if key not in self.rewards:
         self.dump_rewards(key)
     # ranking = PlayerSwapRankRanking
     if p:
         ps = [p]
     else:
         ps = g_entityManager.players.values()
     t, configs = self.rewards[key]
     for p in ps:
         if key in p.pvprankreceiveds:
             continue
         rank = ranking.get_rank(p.entityID)
         if not rank:
             continue
         for config in configs.values():
             start, end = config["range"]
             if start:
                 if start > rank:
                     continue
             if end:
                 if end < rank:
                     continue
             rewards = parse_reward(config["rewards"])
             tm = datedate.fromtimestamp(t).strftime(DATE_FMT)
             title, content, ID = get_mail("SwapRank")
             content = content.format(tm, rank)
             self.send_mail(p, title, content, rewards, key, ID)
             break
示例#27
0
文件: service.py 项目: kimch2/x8623
    def gem_refine(self, msgtype, body):
        req = poem_pb.GemRefineRequest()
        req.ParseFromString(body)
        p = self.player
        if not hasattr(p, 'inlay%d' % req.index):
            return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST)

        inlay = getattr(p, 'inlay%d' % req.index)
        config = get_config(GemRefineConfig).get(inlay + 1)
        if not config:
            return fail_msg(msgtype, reason='满级了')

        kind = {1: 11, 2: 12, 3: 13, 4: 14, 5: 15}[req.index]
        refine_cfg = get_config(PlayerRefineConfig)[kind]
        cost = [
            dict(type=config.cost_type,
                 arg=config.cost_type,
                 count=config.cost)
        ]
        gems = match_gems(req.index, inlay + 1)
        cost.extend(
            [dict(type=RewardItemType.Gem, arg=g.ID, count=1) for g in gems])
        try:
            result = apply_reward(p, {},
                                  cost=parse_reward(cost),
                                  type=RewardType.GemRefine)
        except AttrNotEnoughError as e:
            return fail_msg(msgtype, reason='消耗不足')
        except GemNotEnoughError:
            return fail_msg(msgtype, reason='宝石不足')

        count = 1
        setattr(p, "inlay%d" % req.index, inlay + count)
        p.clear_equip_power()
        p.clear_power()
        p.save()
        p.sync()
        return success_msg(msgtype, '')
示例#28
0
 def faction_recv_level_reward(self, msgtype, body):
     p = self.player
     req = poem_pb.RecvLevelReward()
     req.ParseFromString(body)
     config = get_config(FactionLevelRewardConfig).get(req.level)
     if not config:
         return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST)
     if req.level != p.faction_level:
         return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST)
     if p.faction_level_rewards_received:
         return fail_msg(msgtype, msgTips.FAIL_MSG_INVALID_REQUEST)
     rewards = []
     for i, _ in enumerate(config.types):
         rewards.append(
             poem_pb.RewardData(type=config.types[i],
                                arg=config.itemIDs[i],
                                count=config.amounts[i]))
     rewards = parse_reward(rewards)
     apply_reward(p, rewards, type=RewardType.FactionLevelReward)
     p.faction_level_rewards_received.add(req.level)
     p.save()
     p.sync()
     return success_msg(msgtype, '')
示例#29
0
文件: manager.py 项目: kimch2/x8623
    def checkWaterWormReward(self, p):
        from protocol import poem_pb
        rsp = poem_pb.SeedWateringWormingResponse()
        if p.watering_used_count >= p.watering_max_count and p.worming_used_count >= p.worming_max_count:
            import random
            from config.configs import get_cons_string_value
            rt = random.randint(1, 2)
            ww_reward = get_cons_string_value("CampaignWWReward_" + str(rt))
            tmp = map(int, ww_reward.split('|'))
            info = {}
            info["type"] = tmp[0]
            info["arg"] = tmp[1]
            info["count"] = tmp[2]
            rsp.rewards.add(**info)

            from reward.manager import RewardType
            from reward.manager import apply_reward
            from reward.manager import parse_reward
            apply_reward(p,
                         parse_reward([info]),
                         type=RewardType.SeedWaterWormCampaign)

        return rsp
示例#30
0
def give_gve_ranking_reward(entityID):
    from config.configs import get_config
    from config.configs import GveRankingRewardConfig
    from reward.manager import parse_reward
    from mail.manager import send_mail
    from mail.manager import get_mail
    try:
        entityID = int(entityID)
    except ValueError:
        return FAILURE
    try:
        configID = int(request.POST.getone("configID", 0))
    except ValueError:
        return FAILURE
    group_name = request.POST.getone("group_name", u"")
    group_damage = request.POST.getone("group_damage", 0)
    group_rank = request.POST.getone("group_rank", 0)
    date = request.POST.getone("date", u"")
    if not date:
        return FAILURE
    from player.model import Player
    if not int(
            Player.pool.execute("HSET", "gve_ranking_rewards_p{%d}" % entityID,
                                date, "")):
        # 不让重复添加
        return SUCCESS
    config = get_config(GveRankingRewardConfig).get(configID)
    if not config:
        return FAILURE
    title, content, ID = get_mail("GroupRankReward")
    try:
        content = content.format(group_name, group_damage, group_rank)
    except UnicodeDecodeError:
        pass
    rewards = parse_reward(config.rewards)
    send_mail(entityID, title, content, addition=rewards, configID=ID)
    return SUCCESS