def gain_material_event(self, event): go = self.get_game_state().get_object_by_id(event.objId) if not go: return if go.doneCounter != event.doneCounter or go.startCounter != event.startCounter: go.doneCounter = event.doneCounter go.startCounter = event.startCounter if event.action == u'start': if go.target: target = self.get_game_state().get_object_by_id( event.targetId) target.materialCount -= 1 target_obj = self.get_item_reader().get(target.item) go.materials.append(target_obj.material) if not target.materialCount: logger.info(u'Полностью вырубили %s' % target_obj.name) if hasattr(target_obj, 'box'): box_obj = self.get_item_reader().get( target_obj.box) new_obj = dict2obj({ 'item': target_obj.box, 'type': 'pickup', 'id': target.id, 'x': target.x, 'y': target.y }) self.get_game_state().remove_object_by_id( target.id) self.get_game_state().append_object(new_obj) logger.info(u'%s превращён в %s' % (target_obj.name, box_obj.name)) else: self.get_game_state().remove_object_by_id( target.id) go.target = None else: # Если это новое дерево, то зомбику нужно поставить что он его рубит, # но эти данные обновятся и так при смене острова go.target = dict2obj({'id': event.targetId}) target = self.get_game_state().get_object_by_id( event.targetId) target.gainStarted = True # Зомбики продолжают работать go.jobStartTime = event.jobStartTime go.jobEndTime = event.jobEndTime else: # Закончили вырубку, освободили мозги и ушли спать go.target = None
def gain_material_event(self, event): go = self.get_game_state().get_object_by_id(event.objId) if not go: return if go.doneCounter != event.doneCounter or go.startCounter != event.startCounter: go.doneCounter = event.doneCounter go.startCounter = event.startCounter if event.action == u'start': if go.target: target = self.get_game_state().get_object_by_id(event.targetId) target.materialCount -= 1 target_obj = self.get_item_reader().get(target.item) go.materials.append(target_obj.material) if not target.materialCount: logger.info(u'Полностью вырубили %s' % target_obj.name) if hasattr(target_obj, 'box'): box_obj = self.get_item_reader().get(target_obj.box) new_obj = dict2obj({ 'item': target_obj.box, 'type': 'pickup', 'id': target.id, 'x': target.x, 'y': target.y }) self.get_game_state().remove_object_by_id(target.id) self.get_game_state().append_object(new_obj) logger.info(u'%s превращён в %s' % (target_obj.name, box_obj.name)) else: self.get_game_state().remove_object_by_id(target.id) go.target = None else: # Если это новое дерево, то зомбику нужно поставить что он его рубит, # но эти данные обновятся и так при смене острова go.target = dict2obj({'id': event.targetId}) target = self.get_game_state().get_object_by_id(event.targetId) target.gainStarted = True # Зомбики продолжают работать go.jobStartTime = event.jobStartTime go.jobEndTime = event.jobEndTime else: # Закончили вырубку, освободили мозги и ушли спать go.target = None
def item_event(self, event): if event.action == u'sendNewYearGift': new_year_object = dict2obj({ u'treeId': event.objId, u'user': event.id }) self.get_game_state().get_state().remoteNewYear.append( new_year_object)
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)
def perform_action(self): if not self.get_params().switch_local_trader_bot: return traders = self.get_game_state().get_objects_by_types([u'traderGrave']) for trader in traders: trader_obj = self.get_item_reader().get(trader.item) if not trader.started: start_evt = StartWorker(objId=trader.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' % (trader_obj.name, trader.id)) trader.started = True # Если не меняется сейчас if not trader.countExchange: if not trader.countCompleted and self.get_params( ).mega_exchanges: mega = self.get_params().mega_exchanges.pop(0) exchange_evt = TradeExchange(objId=trader.id, user=None, give=mega.get('give'), want=mega.get('want')) self.get_events_sender().send_game_events([exchange_evt]) logger.info(u'Установили мега-обмен в %s %i' % (trader_obj.name, trader.id)) old_trader_give = [] old_trader_want = [] # Если уже обменяли if trader.countCompleted: give_str, want_str = u'', u'' old_trader_give = obj2dict(trader.give) for give in trader.give: give_item_obj = self.get_item_reader().get(give.item) give_str = u', %s %i шт' if give_str else u'%s %i шт' give_str = give_str % (give_item_obj.name, give.count) if u'collectionItem' == give_item_obj.type: self.get_game_state().remove_collection_item( give.item, give.count) elif u'collection' == give_item_obj.type: self.get_game_state().remove_collection( give_item_obj.items, give.count) elif u'storage' in give_item_obj.type: self.get_game_state().remove_storage( give.item, give.count) old_trader_want = obj2dict(trader.want) for want in trader.want: want_item_obj = self.get_item_reader().get(want.item) want_str = u', %s %i шт' if want_str else u'%s %i шт' want_str = want_str % (want_item_obj.name, want.count) if u'collectionItem' == want_item_obj.type: self.get_game_state().add_collection_item( want.item, want.count) elif u'collection' == want_item_obj.type: self.get_game_state().add_collection( want_item_obj.items, want.count) elif u'storage' in want_item_obj.type: self.get_game_state().add_storage( want.item, want.count) pick_evt = GameRemotePickItem(trader.id) self.get_events_sender().send_game_events([pick_evt]) logger.info(u'%s %i совершил обмен' % (trader_obj.name, trader.id)) logger.info(u' Отдали %s' % give_str) logger.info(u' Приняли %s' % want_str) trader.countCompleted = 0 old_exchange = { 'gives': old_trader_give, 'wants': old_trader_want } # Кидаем новый обмен exchange = self.select_exchange(old_exchange) if not exchange: continue trader.__setattr__(u'give', []) for my_give in exchange.get(u'gives', []): trader.give.append(dict2obj(my_give)) trader.__setattr__(u'want', []) for my_want in exchange.get(u'wants', []): trader.want.append(dict2obj(my_want)) exchange_evt = TradeExchange(objId=trader.id, user=None, give=exchange.get(u'gives', []), want=exchange.get(u'wants', [])) self.get_events_sender().send_game_events([exchange_evt]) logger.info(u'%s %i обновлен' % (trader_obj.name, trader.id)) trader.countExchange = 1
def perform_action(self): if not self.get_params().switch_local_buff_bot: return # проходим по ним for signal_name in self.buff_dict: # если мы должны его активировать при необходимости if getattr(self.get_params(), signal_name): # считаем что бонус нужно активировать need_buff = True # получаем список возможных бонусов по данному типу buffs = self.buff_dict.get(signal_name) # ищем, есть ли у нас активированный бонус for l in self.get_game_state().get_state().buffs.list: # если он еще активен, то помечаем что данный бонус пока не нужно активировать for buff in buffs: buff_obj = self.get_item_reader().get(buff) if hasattr(buff_obj, 'items'): if buff_obj.items[0].item == l.item: need_buff = self.get_timer().has_elapsed(l.expire.endDate, -10) else: l_obj = self.get_item_reader().get(l.item) if buff_obj.id == l_obj.id: need_buff = self.get_timer().has_elapsed(l.expire.endDate, -10) # если все-таки нужно активировать if need_buff: # если это проездной то ставим сигнал для крафтинга if signal_name == u'travel_buff': self.get_game_state().set_signal(u'travel_buff', True) return # для всех остальных активируем со склада for buff in buffs: # смотрим сколько у нас на складе есть buff_count = self.get_game_state().count_storage(buff) # если есть то активируем if buff_count: buff_obj = self.get_item_reader().get(buff) buff_duration = self.get_item_reader().get(buff_obj.items[0].item).expire.duration buff_type = self.get_item_reader().get(buff_obj.items[0].item).expire.type buff_event = GameUseStorageItem(itemId=buff_obj.id) self.get_events_sender().send_game_events([buff_event]) logger.info(u'Активируем %s' % buff_obj.name) # создаем новый объект-бонус для записи в гейм-стейт expire = dict2obj({ u'endDate': unicode(buff_duration * 1000), u'type': buff_type }) new_buff = dict2obj({ u'item': buff_obj.items[0].item, u'expire': expire }) # записываем в геймстейт новый бонус self.get_game_state().get_state().buffs.list.append(new_buff) break
def perform_action(self): if not self.get_params().switch_local_craft_bot: return # Если нужно крафтить изумрудку if self.get_params().allow_craft_emerald_collection: # Если нашли обсерваторию на острове buildings = self.get_game_state().get_objects_by_items( [u'@B_OBSERVATORY']) if buildings: # Искомая постройка building = buildings[0] building_obj = self.get_item_reader().get(building.item) # Если постройка достроена то идем дальше if hasattr(building_obj, u'upgrades') and building.level == len( building_obj.upgrades): # Проверяем количество бозонов и японки bozon_count = self.get_game_state().count_storage( u'@CR_666') japan_coll_obj = self.get_item_reader().get(u'C_36') japan_count = self.get_game_state().count_collection( japan_coll_obj.items) # Проверяем по таймерам возможность создавать всю коллекцию целиком may_crafted_full_collection = True next_play_times = building.nextPlayTimes.__dict__ for emerald, craft_obj in self.emerald_crafts.items(): craft = building_obj.crafts[craft_obj.get(u'craft_id')] if not self.get_timer().has_elapsed( next_play_times[craft.craftId], 1): may_crafted_full_collection = False # ставим сигнал на крафтинг изумрудки, если есть что создать, и позволяет таймер if min([bozon_count / 5, japan_count / 10 ]) and may_crafted_full_collection: for emerald, craft_obj in self.emerald_crafts.items(): found = False # проходим по этому списку for will_craft in self.get_params().crafts: # если в списке есть эта постройка if will_craft.building == craft_obj.get( u'building'): # и в ней уже задан нужный craft_id или же он пуст, т.е. создается всё возможное if will_craft.craft_id is None or \ will_craft.craft_id == craft_obj.get(u'craft_id'): # отмечаем что нашли такую позицию found = True # смотрим был ли там установлен сигнал для крафтинга. # Если да, то активируем его, если нет то считаем что он и так будет создаваться if will_craft.signal: self.get_game_state().set_signal( will_craft.signal, True) # смотрим был ли там установлен количество крафтинга. # Если да, то ставим нужное количество, # если нет то считаем что создасться максимум will_craft.count = bozon_count / 5 break # если не нашли такой постройки if not found: # создаем сигнал для активации self.get_game_state().set_signal(emerald, True) # создаем новый параметр для крафтинга с нужным нам значением self.get_params().crafts.append( CraftItem( building=craft_obj.get(u'building'), craft_id=craft_obj.get(u'craft_id'), count=1, signal=emerald)) # Список для крафтинга всего остального crafts = self.get_params().crafts for craft_obj in crafts: # Если нет сигнала о том, что нужно создавать if craft_obj.signal is not None and \ not self.get_game_state().get_signal(craft_obj.signal): continue buildings = self.get_game_state().get_objects_by_items( [craft_obj.building]) # Если нет постройки для создания то ищем дальше if not buildings: continue # Искомая постройка building = buildings[0] building_obj = self.get_item_reader().get(building.item) # Если постройка не достроена то идем дальше if hasattr(building_obj, u'upgrades') and building.level < len( building_obj.upgrades): continue # Если не указан craft_id значит создаем все что возможно в постройке if craft_obj.craft_id is not None: crafts_list = [building_obj.crafts[craft_obj.craft_id]] else: crafts_list = building_obj.crafts for craft in crafts_list: craft_events, res = [], [] # Ищем количество которое возможно создать for material in craft.materials: material_obj = self.get_item_reader().get(material.item) if u'collection' in material_obj.type: balance = 0 if craft_obj.count else 300 coll_item_count = \ (self.get_game_state().count_collection_item(material.item) - balance) / material.count coll_item_count = coll_item_count if coll_item_count >= 0 else 0 res.append(coll_item_count) elif u'storage' in material_obj.type: if material_obj.id == u'COINS': coins_item_count = self.get_game_state().get_state( ).gameMoney / material.count res.append(coins_item_count) else: storage_item_count = self.get_game_state( ).count_storage(material.item) / material.count res.append(storage_item_count) # Если мы указали количество создаваемых элементов, то смотрим # можем ли мы создать такое количество # В другом случае создаем максимально возможное значение if craft_obj.count: craft_count = craft_obj.count if min( res) / craft_obj.count else 0 else: craft_count = min(res) # Создаем требуемое количество элементов if craft_count: for i in xrange(craft_count): craft_event = Craft(itemId=craft.id, objId=building.id) craft_events.append(craft_event) self.get_events_sender().send_game_pack_events( craft_events) # Снимаем сигнал к созданию элементов if craft_obj.signal is not None: self.get_game_state().set_signal( craft_obj.signal, False) # Смотрим на результат создания total = craft.resultCount * craft_count craft_result_obj = self.get_item_reader().get(craft.result) logger.info( u'Создали в %s %s %i шт' % (building_obj.name, craft_result_obj.name, total)) # Списываем материал или коллекции for material in craft.materials: material_obj = self.get_item_reader().get( material.item) if u'collection' in material_obj.type: self.get_game_state().remove_collection_item( material.item, material.count * craft_count) elif u'storage' in material_obj.type: if material_obj.id == u'COINS': self.get_game_state().get_state( ).gameMoney -= material.count * craft_count else: self.get_game_state().remove_storage( material.item, material.count * craft_count) # Добавляем результат в коллекции if u'collection' in craft_result_obj.type: self.get_game_state().add_collection_item( craft_result_obj.id, total) # Добавляем результат на склад if u'storage' in craft_result_obj.type: if craft_result_obj.id == u'COINS': self.get_game_state().get_state( ).gameMoney += total else: self.get_game_state().add_storage( craft.result, total) # Добавляем результат в буфф если это проездной if u'travelTicketBuff' in craft_result_obj.type: buff_duration = self.get_item_reader().get( craft_result_obj.id).expire.duration buff_type = self.get_item_reader().get( craft_result_obj.id).expire.type expire = dict2obj({ u'endDate': unicode(buff_duration * 1000), u'type': buff_type }) new_buff = dict2obj({ u'item': '@%s' % craft_result_obj.id, u'expire': expire }) self.get_game_state().get_state().buffs.list.append( new_buff)
def perform_action(self): if not self.get_params().switch_local_trader_bot: return traders = self.get_game_state().get_objects_by_types([u'traderGrave']) for trader in traders: trader_obj = self.get_item_reader().get(trader.item) if not trader.started: start_evt = StartWorker(objId=trader.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' % (trader_obj.name, trader.id)) trader.started = True # Если не меняется сейчас if not trader.countExchange: if not trader.countCompleted and self.get_params().mega_exchanges: mega = self.get_params().mega_exchanges.pop(0) exchange_evt = TradeExchange(objId=trader.id, user=None, give=mega.get('give'), want=mega.get('want')) self.get_events_sender().send_game_events([exchange_evt]) logger.info(u'Установили мега-обмен в %s %i' % (trader_obj.name, trader.id)) old_trader_give = [] old_trader_want = [] # Если уже обменяли if trader.countCompleted: give_str, want_str = u'', u'' old_trader_give = obj2dict(trader.give) for give in trader.give: give_item_obj = self.get_item_reader().get(give.item) give_str = u', %s %i шт' if give_str else u'%s %i шт' give_str = give_str % (give_item_obj.name, give.count) if u'collectionItem' == give_item_obj.type: self.get_game_state().remove_collection_item(give.item, give.count) elif u'collection' == give_item_obj.type: self.get_game_state().remove_collection(give_item_obj.items, give.count) elif u'storage' in give_item_obj.type: self.get_game_state().remove_storage(give.item, give.count) old_trader_want = obj2dict(trader.want) for want in trader.want: want_item_obj = self.get_item_reader().get(want.item) want_str = u', %s %i шт' if want_str else u'%s %i шт' want_str = want_str % (want_item_obj.name, want.count) if u'collectionItem' == want_item_obj.type: self.get_game_state().add_collection_item(want.item, want.count) elif u'collection' == want_item_obj.type: self.get_game_state().add_collection(want_item_obj.items, want.count) elif u'storage' in want_item_obj.type: self.get_game_state().add_storage(want.item, want.count) pick_evt = GameRemotePickItem(trader.id) self.get_events_sender().send_game_events([pick_evt]) logger.info(u'%s %i совершил обмен' % (trader_obj.name, trader.id)) logger.info(u' Отдали %s' % give_str) logger.info(u' Приняли %s' % want_str) trader.countCompleted = 0 old_exchange = { 'gives': old_trader_give, 'wants': old_trader_want } # Кидаем новый обмен exchange = self.select_exchange(old_exchange) if not exchange: continue trader.__setattr__(u'give', []) for my_give in exchange.get(u'gives', []): trader.give.append(dict2obj(my_give)) trader.__setattr__(u'want', []) for my_want in exchange.get(u'wants', []): trader.want.append(dict2obj(my_want)) exchange_evt = TradeExchange(objId=trader.id, user=None, give=exchange.get(u'gives', []), want=exchange.get(u'wants', [])) self.get_events_sender().send_game_events([exchange_evt]) logger.info(u'%s %i обновлен' % (trader_obj.name, trader.id)) trader.countExchange = 1
def perform_action(self): if not self.get_params().switch_local_magic_bot: return current_loc_id = self.get_game_state().get_game_loc().id if current_loc_id not in self.get_params().allow_magic_locations: return # Если уже использовали 500 палочек if self.get_game_state().get_state().magic.used == self.magic_limit: return # Если нет палочек в наличии if not self.get_game_state().count_storage(u'@MAGIC_WAND'): self.get_game_state().set_signal(u'hell_coll', True) return events = [] gain_list = self.get_game_state().get_objects_by_types(['woodTree', 'stone']) for gain_item in gain_list: if not gain_item.gainStarted: magic_obj = self.get_item_reader().get(gain_item.item) logger.info(u'Вырубаем палочками %s(%i) %i (%i, %i)' % (magic_obj.name, gain_item.materialCount, gain_item.id, gain_item.x, gain_item.y)) while gain_item.materialCount: magic_event = Magic(objId=gain_item.id) events.append(magic_event) gain_item.materialCount -= 1 self.get_game_state().get_state().magic.used += 1 self.get_game_state().add_storage(magic_obj.material, 1) self.get_game_state().remove_storage(u'@MAGIC_WAND', 1) # Если уже использовали 500 палочек, то прекращаем вырубку ресурса if self.get_game_state().get_state().magic.used == self.magic_limit: break # Если нет палочек в наличии, то прекращаем вырубку ресурса if not self.get_game_state().count_storage(u'@MAGIC_WAND'): self.get_game_state().set_signal(u'hell_coll', True) break # Если вырубили до конца, то ставим ящик вместо дерева if not gain_item.materialCount: if hasattr(magic_obj, 'box'): box_item = self.get_item_reader().get(magic_obj.box) new_obj = dict2obj({ 'item': magic_obj.box, 'type': 'pickup', 'id': gain_item.id, 'x': gain_item.x, 'y': gain_item.y }) self.get_game_state().remove_object_by_id(gain_item.id) self.get_game_state().append_object(new_obj) logger.info(u'%s превращён в %s' % (magic_obj.name, box_item.name)) else: self.get_game_state().remove_object_by_id(gain_item.id) # Если уже использовали 500 палочек, то прекращаем поиск ресурсов if self.get_game_state().get_state().magic.used == self.magic_limit: break # Если нет палочек в наличии, то прекращаем вырубку ресурса if not self.get_game_state().count_storage(u'@MAGIC_WAND'): self.get_game_state().set_signal(u'hell_coll', True) break self.get_events_sender().send_game_pack_events(events) # Если получен сигнал, что нужны палочки для вырубки, значит обмениваем ад, чтобы на складе if self.get_game_state().get_signal(u'hell_coll'): # Адская коллекция hell_coll = u'C_34' coll_obj = self.get_item_reader().get(hell_coll) # Количество коллекций на складе hell_count = self.get_game_state().count_collection(coll_obj.items) # Необходимое количество коллекций, чтобы добить палочками лимит на сутки hell_need = (self.magic_limit - self.get_game_state().get_state().magic.used - self.get_game_state().count_storage(u'@MAGIC_WAND')) / 15 + 1 # Берем минимум сколько можем обменять: либо сколько надо, либо сколько есть delta = long(min([hell_count, hell_need])) changed_colls = self.get_params().changed_colls # Если у нас задан минимум для это коллекции, то берем с учетом минимума for changed_coll in changed_colls: if changed_coll.name == hell_coll and changed_coll.min < hell_count: delta = long(min([hell_count - changed_coll.min, hell_need])) # Если есть, что менять if delta: logger.info(u'Обменяли %s %i шт' % (coll_obj.name, delta)) exchange_coll_event = GameExchangeCollection(itemId=hell_coll, 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: self.get_game_state().add_storage(prize.item, prize.count * delta) # Снимаем сигнал на создание палочек self.get_game_state().set_signal(u'hell_coll', False)
def perform_action(self): if not self.get_params().switch_local_craft_bot: return # Если нужно крафтить изумрудку if self.get_params().allow_craft_emerald_collection: # Если нашли обсерваторию на острове buildings = self.get_game_state().get_objects_by_items([u'@B_OBSERVATORY']) if buildings: # Искомая постройка building = buildings[0] building_obj = self.get_item_reader().get(building.item) # Если постройка достроена то идем дальше if hasattr(building_obj, u'upgrades') and building.level == len(building_obj.upgrades): # Проверяем количество бозонов и японки bozon_count = self.get_game_state().count_storage(u'@CR_666') japan_coll_obj = self.get_item_reader().get(u'C_36') japan_count = self.get_game_state().count_collection(japan_coll_obj.items) # Проверяем по таймерам возможность создавать всю коллекцию целиком may_crafted_full_collection = True next_play_times = building.nextPlayTimes.__dict__ for emerald, craft_obj in self.emerald_crafts.items(): craft = building_obj.crafts[craft_obj.get(u'craft_id')] if not self.get_timer().has_elapsed(next_play_times[craft.craftId], 1): may_crafted_full_collection = False # ставим сигнал на крафтинг изумрудки, если есть что создать, и позволяет таймер if min([bozon_count / 5, japan_count / 10]) and may_crafted_full_collection: for emerald, craft_obj in self.emerald_crafts.items(): found = False # проходим по этому списку for will_craft in self.get_params().crafts: # если в списке есть эта постройка if will_craft.building == craft_obj.get(u'building'): # и в ней уже задан нужный craft_id или же он пуст, т.е. создается всё возможное if will_craft.craft_id is None or \ will_craft.craft_id == craft_obj.get(u'craft_id'): # отмечаем что нашли такую позицию found = True # смотрим был ли там установлен сигнал для крафтинга. # Если да, то активируем его, если нет то считаем что он и так будет создаваться if will_craft.signal: self.get_game_state().set_signal(will_craft.signal, True) # смотрим был ли там установлен количество крафтинга. # Если да, то ставим нужное количество, # если нет то считаем что создасться максимум will_craft.count = bozon_count / 5 break # если не нашли такой постройки if not found: # создаем сигнал для активации self.get_game_state().set_signal(emerald, True) # создаем новый параметр для крафтинга с нужным нам значением self.get_params().crafts.append(CraftItem( building=craft_obj.get(u'building'), craft_id=craft_obj.get(u'craft_id'), count=1, signal=emerald )) # Список для крафтинга всего остального crafts = self.get_params().crafts for craft_obj in crafts: # Если нет сигнала о том, что нужно создавать if craft_obj.signal is not None and \ not self.get_game_state().get_signal(craft_obj.signal): continue buildings = self.get_game_state().get_objects_by_items([craft_obj.building]) # Если нет постройки для создания то ищем дальше if not buildings: continue # Искомая постройка building = buildings[0] building_obj = self.get_item_reader().get(building.item) # Если постройка не достроена то идем дальше if hasattr(building_obj, u'upgrades') and building.level < len(building_obj.upgrades): continue # Если не указан craft_id значит создаем все что возможно в постройке if craft_obj.craft_id is not None: crafts_list = [building_obj.crafts[craft_obj.craft_id]] else: crafts_list = building_obj.crafts for craft in crafts_list: craft_events, res = [], [] # Ищем количество которое возможно создать for material in craft.materials: material_obj = self.get_item_reader().get(material.item) if u'collection' in material_obj.type: balance = 0 if craft_obj.count else 300 coll_item_count = \ (self.get_game_state().count_collection_item(material.item) - balance) / material.count coll_item_count = coll_item_count if coll_item_count >= 0 else 0 res.append(coll_item_count) elif u'storage' in material_obj.type: if material_obj.id == u'COINS': coins_item_count = self.get_game_state().get_state().gameMoney / material.count res.append(coins_item_count) else: storage_item_count = self.get_game_state().count_storage(material.item) / material.count res.append(storage_item_count) # Если мы указали количество создаваемых элементов, то смотрим # можем ли мы создать такое количество # В другом случае создаем максимально возможное значение if craft_obj.count: craft_count = craft_obj.count if min(res) / craft_obj.count else 0 else: craft_count = min(res) # Создаем требуемое количество элементов if craft_count: for i in xrange(craft_count): craft_event = Craft(itemId=craft.id, objId=building.id) craft_events.append(craft_event) self.get_events_sender().send_game_pack_events(craft_events) # Снимаем сигнал к созданию элементов if craft_obj.signal is not None: self.get_game_state().set_signal(craft_obj.signal, False) # Смотрим на результат создания total = craft.resultCount * craft_count craft_result_obj = self.get_item_reader().get(craft.result) logger.info(u'Создали в %s %s %i шт' % (building_obj.name, craft_result_obj.name, total)) # Списываем материал или коллекции for material in craft.materials: material_obj = self.get_item_reader().get(material.item) if u'collection' in material_obj.type: self.get_game_state().remove_collection_item( material.item, material.count * craft_count) elif u'storage' in material_obj.type: if material_obj.id == u'COINS': self.get_game_state().get_state().gameMoney -= material.count * craft_count else: self.get_game_state().remove_storage(material.item, material.count * craft_count) # Добавляем результат в коллекции if u'collection' in craft_result_obj.type: self.get_game_state().add_collection_item(craft_result_obj.id, total) # Добавляем результат на склад if u'storage' in craft_result_obj.type: if craft_result_obj.id == u'COINS': self.get_game_state().get_state().gameMoney += total else: self.get_game_state().add_storage(craft.result, total) # Добавляем результат в буфф если это проездной if u'travelTicketBuff' in craft_result_obj.type: buff_duration = self.get_item_reader().get(craft_result_obj.id).expire.duration buff_type = self.get_item_reader().get(craft_result_obj.id).expire.type expire = dict2obj({ u'endDate': unicode(buff_duration * 1000), u'type': buff_type }) new_buff = dict2obj({ u'item': '@%s' % craft_result_obj.id, u'expire': expire }) self.get_game_state().get_state().buffs.list.append(new_buff)
def perform_action(self): if not self.get_params().switch_local_buff_bot: return # проходим по ним for signal_name in self.buff_dict: # если мы должны его активировать при необходимости if getattr(self.get_params(), signal_name): # считаем что бонус нужно активировать need_buff = True # получаем список возможных бонусов по данному типу buffs = self.buff_dict.get(signal_name) # ищем, есть ли у нас активированный бонус for l in self.get_game_state().get_state().buffs.list: # если он еще активен, то помечаем что данный бонус пока не нужно активировать for buff in buffs: buff_obj = self.get_item_reader().get(buff) if hasattr(buff_obj, 'items'): if buff_obj.items[0].item == l.item: need_buff = self.get_timer().has_elapsed( l.expire.endDate, -10) else: l_obj = self.get_item_reader().get(l.item) if buff_obj.id == l_obj.id: need_buff = self.get_timer().has_elapsed( l.expire.endDate, -10) # если все-таки нужно активировать if need_buff: # если это проездной то ставим сигнал для крафтинга if signal_name == u'travel_buff': self.get_game_state().set_signal(u'travel_buff', True) return # для всех остальных активируем со склада for buff in buffs: # смотрим сколько у нас на складе есть buff_count = self.get_game_state().count_storage(buff) # если есть то активируем if buff_count: buff_obj = self.get_item_reader().get(buff) buff_duration = self.get_item_reader().get( buff_obj.items[0].item).expire.duration buff_type = self.get_item_reader().get( buff_obj.items[0].item).expire.type buff_event = GameUseStorageItem(itemId=buff_obj.id) self.get_events_sender().send_game_events( [buff_event]) logger.info(u'Активируем %s' % buff_obj.name) # создаем новый объект-бонус для записи в гейм-стейт expire = dict2obj({ u'endDate': unicode(buff_duration * 1000), u'type': buff_type }) new_buff = dict2obj({ u'item': buff_obj.items[0].item, u'expire': expire }) # записываем в геймстейт новый бонус self.get_game_state().get_state( ).buffs.list.append(new_buff) break
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)
def buyed_brains_event(self, event): buyed_brain = dict2obj({ 'count': event.brains.count, 'endTime': event.brains.endTime }) self.get_game_state().get_state().buyedBrains.append(buyed_brain)
def perform_action(self): if not self.get_params().switch_local_place_bot: return current_loc = self.get_game_state().get_game_loc().id if self.get_params().place_items_dict.get(current_loc): place = self.get_params().place_items_dict.get(current_loc) else: place = self.get_params().place_items_dict.get(u'other') if not place: return if self.get_params().allow_clear_location: decor_evts = [] decorations = [] for decor_item in self.get_params().allow_clear_location: decorations += self.get_game_state().get_objects_by_items([decor_item]) for decoration in decorations: evt = GameSellGameObject(objId=decoration.id) decor_evts.append(evt) self.get_game_state().remove_object_by_id(decoration.id) if decor_evts: logger.info(u'Очищаем заданные объекты') self.get_events_sender().send_game_pack_events(decor_evts) place_obj = self.get_item_reader().get(place) # Получаем координаты углов карты и заранее места где нельзя ставить crd_top, bad_crd = self.get_coords(current_loc) if not crd_top and not bad_crd: return # вычисляем координаты которые уже заняты self.parse_bad_coords(bad_crd) evts = [] crd_list = 1 while crd_list: crd_list = self.get_space(place_obj, bad_crd, crd_top) if not crd_list: break next_id = max( [_i.maxGameObjectId for _i in self.get_game_state().get_state().locationInfos] + [_m.id for _m in self.get_game_state().get_state().gameObjects]) + 1 for crd in crd_list: if self.get_game_state().get_state().gameMoney > 1000000: buy_event = GameBuyItem(itemId=place_obj.id, objId=long(next_id), x=long(crd[0]), y=long(crd[1])) evts.append(buy_event) self.get_game_state().get_state().gameMoney -= place_obj.buyCoins self.get_game_state().get_state().gameObjects.append(dict2obj({ u'item': place, u'y': crd[1], u'x': crd[0], u'type': place_obj.type, u'id': next_id })) next_id += 1 if evts: logger.info(u'Ставим %s %i шт' % (place_obj.name, len(evts))) self.get_events_sender().send_game_pack_events(evts)
def buyed_brains_event(self, event): buyed_brain = dict2obj({'count': event.brains.count, 'endTime': event.brains.endTime}) self.get_game_state().get_state().buyedBrains.append(buyed_brain)
def perform_action(self): if not self.get_params().switch_local_magic_bot: return current_loc_id = self.get_game_state().get_game_loc().id if current_loc_id not in self.get_params().allow_magic_locations: return # Если уже использовали 500 палочек if self.get_game_state().get_state().magic.used == self.magic_limit: return # Если нет палочек в наличии if not self.get_game_state().count_storage(u'@MAGIC_WAND'): self.get_game_state().set_signal(u'hell_coll', True) return events = [] gain_list = self.get_game_state().get_objects_by_types( ['woodTree', 'stone']) for gain_item in gain_list: if not gain_item.gainStarted: magic_obj = self.get_item_reader().get(gain_item.item) logger.info(u'Вырубаем палочками %s(%i) %i (%i, %i)' % (magic_obj.name, gain_item.materialCount, gain_item.id, gain_item.x, gain_item.y)) while gain_item.materialCount: magic_event = Magic(objId=gain_item.id) events.append(magic_event) gain_item.materialCount -= 1 self.get_game_state().get_state().magic.used += 1 self.get_game_state().add_storage(magic_obj.material, 1) self.get_game_state().remove_storage(u'@MAGIC_WAND', 1) # Если уже использовали 500 палочек, то прекращаем вырубку ресурса if self.get_game_state().get_state( ).magic.used == self.magic_limit: break # Если нет палочек в наличии, то прекращаем вырубку ресурса if not self.get_game_state().count_storage(u'@MAGIC_WAND'): self.get_game_state().set_signal(u'hell_coll', True) break # Если вырубили до конца, то ставим ящик вместо дерева if not gain_item.materialCount: if hasattr(magic_obj, 'box'): box_item = self.get_item_reader().get(magic_obj.box) new_obj = dict2obj({ 'item': magic_obj.box, 'type': 'pickup', 'id': gain_item.id, 'x': gain_item.x, 'y': gain_item.y }) self.get_game_state().remove_object_by_id(gain_item.id) self.get_game_state().append_object(new_obj) logger.info(u'%s превращён в %s' % (magic_obj.name, box_item.name)) else: self.get_game_state().remove_object_by_id(gain_item.id) # Если уже использовали 500 палочек, то прекращаем поиск ресурсов if self.get_game_state().get_state( ).magic.used == self.magic_limit: break # Если нет палочек в наличии, то прекращаем вырубку ресурса if not self.get_game_state().count_storage(u'@MAGIC_WAND'): self.get_game_state().set_signal(u'hell_coll', True) break self.get_events_sender().send_game_pack_events(events) # Если получен сигнал, что нужны палочки для вырубки, значит обмениваем ад, чтобы на складе if self.get_game_state().get_signal(u'hell_coll'): # Адская коллекция hell_coll = u'C_34' coll_obj = self.get_item_reader().get(hell_coll) # Количество коллекций на складе hell_count = self.get_game_state().count_collection(coll_obj.items) # Необходимое количество коллекций, чтобы добить палочками лимит на сутки hell_need = ( self.magic_limit - self.get_game_state().get_state().magic.used - self.get_game_state().count_storage(u'@MAGIC_WAND')) / 15 + 1 # Берем минимум сколько можем обменять: либо сколько надо, либо сколько есть delta = long(min([hell_count, hell_need])) changed_colls = self.get_params().changed_colls # Если у нас задан минимум для это коллекции, то берем с учетом минимума for changed_coll in changed_colls: if changed_coll.name == hell_coll and changed_coll.min < hell_count: delta = long( min([hell_count - changed_coll.min, hell_need])) # Если есть, что менять if delta: logger.info(u'Обменяли %s %i шт' % (coll_obj.name, delta)) exchange_coll_event = GameExchangeCollection(itemId=hell_coll, 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: self.get_game_state().add_storage(prize.item, prize.count * delta) # Снимаем сигнал на создание палочек self.get_game_state().set_signal(u'hell_coll', False)