Esempio n. 1
0
    def perform_action(self):

        if not self.get_params().switch_local_send_bot:
            return

        if not self.send_accounts:
            return

        send_items = self.get_params().send_items

        for send_item in send_items:
            item_obj = self.get_item_reader().get(send_item.name)
            for send_account in self.send_accounts:
                if u'collection' in item_obj.type:
                    # Если указан только минимум и стоит флаг, пересылать все ддо минимума не равнями частями
                    if not self.get_params().send_equal_parts_collection and not send_item.count:
                        for coll_element in item_obj.items:
                            item_col_obj = self.get_item_reader().get(coll_element)
                            storage_count = self.get_game_state().count_collection_item(coll_element)
                            delta = get_item_count(send_item, storage_count)
                            if delta:
                                logger.info(u'Отправили %s %i шт на %s' %
                                            (item_col_obj.name, delta, self.user_dict.get(send_account)))
                                msg = self.get_params().send_account_msg
                                gift_item = SendGiftItem(msg=msg, item=coll_element, count=delta, user=send_account)
                                send_event = SendGift(gift=gift_item)
                                self.get_events_sender().send_game_events([send_event])

                                self.get_game_state().remove_collection_item(coll_element, delta)
                    else:
                        storage_count = self.get_game_state().count_collection(item_obj.items)
                        delta = get_item_count(send_item, storage_count)
                        if delta:
                            logger.info(u'Отправили %s %i шт на %s' %
                                        (item_obj.name, delta, self.user_dict.get(send_account)))
                            msg = self.get_params().send_account_msg
                            for coll_element in item_obj.items:
                                gift_item = SendGiftItem(msg=msg, item=coll_element, count=delta, user=send_account)
                                send_event = SendGift(gift=gift_item)
                                self.get_events_sender().send_game_events([send_event])

                                self.get_game_state().remove_collection_item(coll_element, delta)
                else:
                    storage_count = self.get_game_state().count_storage(send_item.name)
                    delta = get_item_count(send_item, storage_count)
                    if delta:
                        logger.info(u'Отправили %s %i шт на %s' %
                                    (item_obj.name, delta, self.user_dict.get(send_account)))
                        msg = self.get_params().send_account_msg
                        gift_item = SendGiftItem(msg=msg, item=send_item.name, count=delta, user=send_account)
                        send_event = SendGift(gift=gift_item)
                        self.get_events_sender().send_game_events([send_event])

                        self.get_game_state().remove_storage(send_item.name, delta)

            if not send_item.loop:
                send_items.remove(send_item)
Esempio n. 2
0
    def perform_action(self):

        if not self.get_params().switch_local_collection_bot:
            return

        changed_colls = self.get_params().changed_colls

        for coll in changed_colls:
            coll_obj = self.get_item_reader().get(coll.name)
            coll_count = self.get_game_state().count_collection(coll_obj.items)
            delta = get_item_count(coll, coll_count)

            if delta:
                logger.info(u'Обменяли %s %i шт' % (coll_obj.name, delta))
                exchange_coll_event = GameExchangeCollection(itemId=coll.name,
                                                             count=delta)
                self.get_events_sender().send_game_events(
                    [exchange_coll_event])
                self.get_game_state().remove_collection(coll_obj.items, delta)

                for prize in coll_obj.prizes:
                    if prize.item == u'@COINS':
                        self.get_game_state().get_state(
                        ).gameMoney += prize.count * delta
                    elif prize.item == u'@XP':
                        self.get_game_state().get_state(
                        ).experience += prize.count * delta
                    elif prize.item == u'@CASH':
                        self.get_game_state().get_state(
                        ).cashMoney += prize.count * delta
                    else:
                        self.get_game_state().add_storage(
                            prize.item, prize.count * delta)
Esempio n. 3
0
    def perform_action(self):

        if not self.get_params().switch_local_storage_bot:
            return

        sell_items = self.get_params().sell_items

        for sell_item in sell_items:
            item_count = self.get_game_state().count_storage(sell_item.name)
            delta = get_item_count(sell_item, item_count)
            if delta:
                item_obj = self.get_item_reader().get(sell_item.name)

                sell_item_event = GameSellItem(itemId=sell_item.name[1:], count=delta)
                self.get_events_sender().send_game_events([sell_item_event])
                self.get_game_state().remove_storage(sell_item.name, delta)

                logger.info(u"Продали со склада %s %i шт" % (item_obj.name, delta))

        for wealth in self.get_params().wealth_types:
            wealth_count = self.get_game_state().count_storage(wealth)
            item_obj = self.get_item_reader().get(wealth)

            if wealth_count:
                logger.info(u"Открываем со склада %s %i шт" % (item_obj.name, wealth_count))

                while wealth_count:
                    x = 10 if wealth_count >= 10 else wealth_count
                    wealth_event = GameUseStorageItem(itemId=item_obj.id, x=10, y=10)
                    self.get_events_sender().send_game_events([wealth_event] * x)
                    self.get_game_state().remove_storage(wealth, x)
                    wealth_count -= x

        # Если на текущем острове нельзя убирать декор то выходим
        current_loc_id = self.get_game_state().get_game_loc().id
        if current_loc_id in self.get_params().allow_move_decoration_locations:
            decor_evts = []
            decorations = self.get_game_state().get_objects_by_types(["decoration"])
            decorations += self.get_game_state().get_objects_by_items(
                [u"@SC_BASE", u"@SCASTLE_GIRL", u"@MP_MONSTER_PIT_1"]
            )
            for decoration in decorations:
                decoration_obj = self.get_item_reader().get(decoration.item)
                logger.info(u"Убираем на склад декорацию %s" % decoration_obj.name)
                evt = MoveToStorage(objId=decoration.id)
                decor_evts.append(evt)

            if decor_evts:
                self.get_events_sender().send_game_events(decor_evts)
Esempio n. 4
0
    def perform_action(self):

        if not self.get_params().switch_local_daily_bot:
            return

        players = self.get_game_state().get_players()

        # Ежедневный бонус
        daily_bonus = self.get_game_state().get_state().dailyBonus
        if int(daily_bonus.playFrom) and self.get_timer().has_elapsed(daily_bonus.playFrom, 10):
            daily = DailyBonus()
            self.get_events_sender().send_game_events([daily])

            # Если можно крутнуть ежедневную рулетку,
            # Значит можно уже и дарить ежедневные подарочки
            self.get_game_state().get_state().freeGiftUsers = []

            # Сбрасываем палочки-выручалочки
            self.get_game_state().get_state().magic.used = 0
            self.get_game_state().get_state().magic.expire = unicode(86400000)

        free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
        not_gift_users = [
            x for x in players if x.id not in free_gift_users and x.id not in self.get_params().exclude_low_level
        ]

        if not_gift_users:
            # Подарки нищебродам до 80 уровня
            # Максиммальное время отсутствия, не может быть больше 3 суток
            deadline = 3
            day_timestamp = 1000 * 60 * 60 * 24
            deadline_timestamp = deadline * day_timestamp

            pre_aways = [x for x in not_gift_users if hasattr(x, u"accessDate")]
            lst = [x for x in pre_aways if abs(int(x.accessDate)) < deadline_timestamp and x.level in xrange(40, 81)]

            for user in lst:
                if type(user) == unicode:
                    continue
                for low_level_gift in self.low_level_gifts:
                    if low_level_gift.name in user.liteGameState.wishlist:
                        # Если на складе нет нужного количества для подарка идем к следущему подарку
                        storage_count = self.get_game_state().count_storage(low_level_gift.name)
                        delta = get_item_count(low_level_gift, storage_count)

                        if delta:
                            # Выбрали подарок и дарим его
                            low_level_gift_obj = self.get_item_reader().get(low_level_gift.name)
                            gift_item = SendGiftItem(
                                msg=self.low_level_msg, item=low_level_gift.name, count=delta, user=user.id
                            )
                            send_event = SendGift(gift=gift_item)
                            evts = self.get_events_sender().send_game_events([send_event])
                            evts += self.get_events_sender().send_game_events()

                            # Если успешно прошел подарок идем к следущему соседу по списку
                            filter_evts = [x.type for x in evts]
                            if u"alert" not in filter_evts:
                                friend = self.get_game_state().get_player(user.id)
                                user_name = friend.name if hasattr(friend, "name") else user.id
                                logger.info(
                                    u"Отправляем для %s в подарок % s %i шт"
                                    % (user_name, low_level_gift_obj.name, delta)
                                )

                                if u"storage" in low_level_gift_obj.type:
                                    self.get_game_state().remove_storage(low_level_gift.name, delta)
                            break

            # Бесплатные подарки
            for free_gift in self.free_gifts:
                gift_obj = self.get_item_reader().get(free_gift)

                free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
                lst = [x.id for x in players if free_gift in x.liteGameState.wishlist and x.id not in free_gift_users]

                if lst:
                    logger.info(u"Отправляем бесплатный подарок %s %i игрокам" % (gift_obj.name, len(lst)))
                    freegift_event = SendFreeGifts(msg=self.free_msg, itemId=gift_obj.id, userIds=lst)

                    self.get_events_sender().send_game_events([freegift_event])

                    while lst:
                        lst_item = lst.pop(0)
                        user_obj = dict2obj({"user": lst_item})
                        self.get_game_state().get_state().freeGiftUsers.append(user_obj)

            free_gift = random.choice(self.free_gifts)
            gift_obj = self.get_item_reader().get(free_gift)

            free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
            lst = [x.id for x in players if x.id not in free_gift_users]

            if lst:
                logger.info(u"Отправляем бесплатный подарок %s %i игрокам" % (gift_obj.name, len(lst)))
                freegift_event = SendFreeGifts(msg=self.free_msg, itemId=gift_obj.id, userIds=lst)

                self.get_events_sender().send_game_events([freegift_event])

                while lst:
                    lst_item = lst.pop(0)
                    user_obj = dict2obj({"user": lst_item})
                    self.get_game_state().get_state().freeGiftUsers.append(user_obj)
Esempio n. 5
0
    def perform_action(self):

        if not self.get_params().switch_local_send_bot:
            return

        if not self.send_accounts:
            return

        send_items = self.get_params().send_items

        for send_item in send_items:
            item_obj = self.get_item_reader().get(send_item.name)
            for send_account in self.send_accounts:
                if u'collection' in item_obj.type:
                    # Если указан только минимум и стоит флаг, пересылать все ддо минимума не равнями частями
                    if not self.get_params(
                    ).send_equal_parts_collection and not send_item.count:
                        for coll_element in item_obj.items:
                            item_col_obj = self.get_item_reader().get(
                                coll_element)
                            storage_count = self.get_game_state(
                            ).count_collection_item(coll_element)
                            delta = get_item_count(send_item, storage_count)
                            if delta:
                                logger.info(u'Отправили %s %i шт на %s' %
                                            (item_col_obj.name, delta,
                                             self.user_dict.get(send_account)))
                                msg = self.get_params().send_account_msg
                                gift_item = SendGiftItem(msg=msg,
                                                         item=coll_element,
                                                         count=delta,
                                                         user=send_account)
                                send_event = SendGift(gift=gift_item)
                                self.get_events_sender().send_game_events(
                                    [send_event])

                                self.get_game_state().remove_collection_item(
                                    coll_element, delta)
                    else:
                        storage_count = self.get_game_state().count_collection(
                            item_obj.items)
                        delta = get_item_count(send_item, storage_count)
                        if delta:
                            logger.info(u'Отправили %s %i шт на %s' %
                                        (item_obj.name, delta,
                                         self.user_dict.get(send_account)))
                            msg = self.get_params().send_account_msg
                            for coll_element in item_obj.items:
                                gift_item = SendGiftItem(msg=msg,
                                                         item=coll_element,
                                                         count=delta,
                                                         user=send_account)
                                send_event = SendGift(gift=gift_item)
                                self.get_events_sender().send_game_events(
                                    [send_event])

                                self.get_game_state().remove_collection_item(
                                    coll_element, delta)
                else:
                    storage_count = self.get_game_state().count_storage(
                        send_item.name)
                    delta = get_item_count(send_item, storage_count)
                    if delta:
                        logger.info(u'Отправили %s %i шт на %s' %
                                    (item_obj.name, delta,
                                     self.user_dict.get(send_account)))
                        msg = self.get_params().send_account_msg
                        gift_item = SendGiftItem(msg=msg,
                                                 item=send_item.name,
                                                 count=delta,
                                                 user=send_account)
                        send_event = SendGift(gift=gift_item)
                        self.get_events_sender().send_game_events([send_event])

                        self.get_game_state().remove_storage(
                            send_item.name, delta)

            if not send_item.loop:
                send_items.remove(send_item)
Esempio n. 6
0
    def perform_action(self):

        if not self.get_params().switch_local_daily_bot:
            return

        players = self.get_game_state().get_players()

        # Ежедневный бонус
        daily_bonus = self.get_game_state().get_state().dailyBonus
        if int(daily_bonus.playFrom) and self.get_timer().has_elapsed(daily_bonus.playFrom, 10):
            daily = DailyBonus()
            self.get_events_sender().send_game_events([daily])

            # Если можно крутнуть ежедневную рулетку,
            # Значит можно уже и дарить ежедневные подарочки
            self.get_game_state().get_state().freeGiftUsers = []

            # Сбрасываем палочки-выручалочки
            self.get_game_state().get_state().magic.used = 0
            self.get_game_state().get_state().magic.expire = unicode(86400000)

        free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
        not_gift_users = [x for x in players
                          if x.id not in free_gift_users and x.id not in self.get_params().exclude_low_level]

        if not_gift_users:
            # Подарки нищебродам до 80 уровня
            # Максиммальное время отсутствия, не может быть больше 3 суток
            deadline = 3
            day_timestamp = 1000 * 60 * 60 * 24
            deadline_timestamp = deadline * day_timestamp

            pre_aways = [x for x in not_gift_users if hasattr(x, u'accessDate')]
            lst = [x for x in pre_aways if abs(int(x.accessDate)) < deadline_timestamp and x.level in xrange(40, 81)]

            for user in lst:
                if type(user) == unicode:
                    continue
                for low_level_gift in self.low_level_gifts:
                    if low_level_gift.name in user.liteGameState.wishlist:
                        # Если на складе нет нужного количества для подарка идем к следущему подарку
                        storage_count = self.get_game_state().count_storage(low_level_gift.name)
                        delta = get_item_count(low_level_gift, storage_count)

                        if delta:
                            # Выбрали подарок и дарим его
                            low_level_gift_obj = self.get_item_reader().get(low_level_gift.name)
                            gift_item = SendGiftItem(msg=self.low_level_msg, item=low_level_gift.name,
                                                     count=delta, user=user.id)
                            send_event = SendGift(gift=gift_item)
                            evts = self.get_events_sender().send_game_events([send_event])
                            evts += self.get_events_sender().send_game_events()

                            # Если успешно прошел подарок идем к следущему соседу по списку
                            filter_evts = [x.type for x in evts]
                            if u'alert' not in filter_evts:
                                friend = self.get_game_state().get_player(user.id)
                                user_name = friend.name if hasattr(friend, 'name') else user.id
                                logger.info(u'Отправляем для %s в подарок % s %i шт' %
                                            (user_name, low_level_gift_obj.name, delta))

                                if u'storage' in low_level_gift_obj.type:
                                    self.get_game_state().remove_storage(low_level_gift.name, delta)
                            break

            # Бесплатные подарки
            for free_gift in self.free_gifts:
                gift_obj = self.get_item_reader().get(free_gift)

                free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
                lst = [x.id for x in players if free_gift in x.liteGameState.wishlist and x.id not in free_gift_users]

                if lst:
                    logger.info(u'Отправляем бесплатный подарок %s %i игрокам' % (gift_obj.name, len(lst)))
                    freegift_event = SendFreeGifts(msg=self.free_msg, itemId=gift_obj.id, userIds=lst)

                    self.get_events_sender().send_game_events([freegift_event])

                    while lst:
                        lst_item = lst.pop(0)
                        user_obj = dict2obj({'user': lst_item})
                        self.get_game_state().get_state().freeGiftUsers.append(user_obj)

            free_gift = random.choice(self.free_gifts)
            gift_obj = self.get_item_reader().get(free_gift)

            free_gift_users = [x.user for x in self.get_game_state().get_state().freeGiftUsers]
            lst = [x.id for x in players if x.id not in free_gift_users]

            if lst:
                logger.info(u'Отправляем бесплатный подарок %s %i игрокам' % (gift_obj.name, len(lst)))
                freegift_event = SendFreeGifts(msg=self.free_msg, itemId=gift_obj.id, userIds=lst)

                self.get_events_sender().send_game_events([freegift_event])

                while lst:
                    lst_item = lst.pop(0)
                    user_obj = dict2obj({'user': lst_item})
                    self.get_game_state().get_state().freeGiftUsers.append(user_obj)
Esempio n. 7
0
    def perform_action(self):

        if not self.get_params().switch_local_cook_bot:
            return

        cook_events = []
        pick_events = []
        speedup_events = []
        recipes = self.get_params().recipes

        if not recipes:
            return

        cook_graves = self.get_game_state().get_objects_by_types(self.get_worker_types())

        for cook_grave in cook_graves:
            cook_grave_obj = self.get_item_reader().get(cook_grave.item)
            # Если повар не работает, то отправляем его на работу
            if not cook_grave.isUp:
                start_evt = StartWorker(objId=cook_grave.id)
                evts = self.get_events_sender().send_game_events([start_evt])

                # Если от сервера пришло сообщение о том что нет мозгов,
                # то обрабатываем его сразу чтобы знать кто не будет работать
                no_brains = False
                for evt in evts:
                    if evt.type == u'alert':
                        if evt.msg == u'SERVER_NO_BRAINS':
                            no_brains = True
                if not no_brains:
                    logger.info(u'Отправляем работать %s %i' % (cook_grave_obj.name, cook_grave.id))
                    cook_grave.isUp = True
                    # Если у него есть рецепты в корзинках, то готовим их
                    if cook_grave.pendingRecipes:
                        cook_grave.currentRecipe = cook_grave.pendingRecipes.pop(0)

            # Солим рецепт если разрешено и есть соль на складе
            if self.get_params().allow_cook_speedup:
                if not cook_grave.speeduped:
                    speeduper_obj = self.get_item_reader().get(u'@RED_SPEEDUPER')
                    speeduper_count = self.get_game_state().count_storage(u'@RED_SPEEDUPER')
                    if speeduper_count:
                        logger.info(u'Используем %s для %s %i' %
                                    (speeduper_obj.name, cook_grave_obj.name, cook_grave.id))
                        speedup_evt = CookSpeedup(objId=cook_grave.id)
                        speedup_events.append(speedup_evt)
                        self.get_game_state().remove_storage(u'@RED_SPEEDUPER', 1)

            # Если у него есть бочки, их нужно собрать
            while cook_grave.materials:
                material_item = cook_grave.materials.pop(0)
                material = self.get_item_reader().get(material_item)
                logger.info(u'Забираем у %s %i %s 1 шт' % (cook_grave_obj.name, cook_grave.id, material.name))
                pick_item = GamePickItem(itemId=material.id, objId=cook_grave.id)
                pick_events.append(pick_item)

                # Добавляем на склад
                if u'storage' in material.type:
                    self.get_game_state().add_storage(material_item, 1)

                # Если есть рецепты еще, то ставим их на варение
                if cook_grave.pendingRecipes:
                    cook_grave.currentRecipe = cook_grave.pendingRecipes.pop(0)

            # Если сейчас ничего не варим
            if not hasattr(cook_grave, u'currentRecipe') and cook_grave.isUp or \
                (hasattr(cook_grave, u'currentRecipe') and
                 len(cook_grave.pendingRecipes) < self.get_params().cook_receipts - 1):

                current_count = 1 if hasattr(cook_grave, u'currentRecipe') else 0
                need_count = self.get_params().cook_receipts - len(cook_grave.pendingRecipes) - current_count
                while need_count:
                    for recipe in recipes:
                        # Берем рецепт
                        recipe_obj = self.get_item_reader().get(recipe.name)
                        storage_count = self.get_game_state().count_storage(recipe_obj.result)
                        delta = get_item_count(recipe, storage_count)
                        if delta:
                            # Проверяем наличие ингридиентов
                            ingridients = recipe_obj.ingridients
                            ingridients_enough = True
                            for ingridient in ingridients:
                                if self.get_game_state().count_storage(ingridient.item) < ingridient.count:
                                    ingridients_enough = False
                                    break

                            # Если нам хватает ингридиентов на рецепт, то варим его
                            if ingridients_enough:
                                logger.info(u'Начали готовить %s' % recipe_obj.name)
                                cook_event = GameCookRecipe(itemId=recipe_obj.id, objId=cook_grave.id)
                                cook_events.append(cook_event)
                                if not hasattr(cook_grave, u'currentRecipe'):
                                    cook_grave.currentRecipe = recipe.name
                                else:
                                    cook_grave.pendingRecipes.append(recipe.name)
                                break

                    need_count -= 1

            # Если повара без мозгов не начали работать,
            # то отправляем их спать, чтобы не занимать мозги
            if not hasattr(cook_grave, u'currentRecipe') and cook_grave_obj.id.find(u'BRAIN') == -1 and cook_grave.isUp:
                stop_evt = StopWorker(objId=cook_grave.id)
                self.get_events_sender().send_game_events([stop_evt])
                logger.info(u'Отправляем %s %i спать' % (cook_grave_obj.name, cook_grave.id))
                cook_grave.isUp = False

        # Шлем все на сервер
        self.get_events_sender().send_game_pack_events(speedup_events)
        self.get_events_sender().send_game_pack_events(pick_events)
        self.get_events_sender().send_game_pack_events(cook_events)