Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Люди, очень прошу, дайте пожалуйста код , для смены острова при походе к друзьям, чтоб ходил на тот остров , на который я ему скажу, и желательно чтоб id друзей для похода можно было вбивать)
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
все рулетки крутятся, а маяк выдает ingame error
{"action":"play","type":"game","objId":91,"extraId ":"B_LIGHTHOUSE_ROULETTE_1"}
в чем может быть ошибка?
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от dreamerag2
все рулетки крутятся, а маяк выдает ingame error
{"action":"play","type":"game","objId":91,"extraId ":"B_LIGHTHOUSE_ROULETTE_1"}
в чем может быть ошибка?
ну никто не в курсе как ты решил реализовать свои рулетки , проверка на достроеность есть ?(именно рулетки а не постройки)
Они пройдут без ошибки, даже если ты уберёшь id из сообщения. Флеш отправляет id не только при кручении рулеток, а в каждом непустом сообщении. Бот же этого не делает.
Насколько я помню, бот это делает. Просто ID добавляется, если не ошибаюсь, в message_factory. Если игра (сервер) получает пакет с повторным ID или с "беспорядочным" (например, один пакет потерялся), это дает ingame error. Так бывает, например, если события идут слишком часто, а Интернет медленный. И ответ на запрос приходит именно с тем же ID (например, именно так флэш отслеживает клады).
Цитата:
Сообщение от vintets
Это не тот id. Есть общая нумерация всех эвентов. А есть нумерация внутри эвента, она только у запросов требующих обязательного ответа, после которых могут всплыть таблички: закопали на..., всё выкопано, вышел лимит медведя/пряников/стуков, выпал дроп...
Про этот ID тут немножко по-другому. Возьмем пример елки. У тебя под ней лежит пять пряников. Ты можешь принять пряник №3. Для этого и будет использоваться ID внутри объекта. Если хочешь принять пряники не выборочно, то нужно принимать "пряник №1" пока они не кончатся, иначе выдает ingame error (так же, как если послать запрос на прием пряника вообще без ID).
Последний раз редактировалось mike4kz; 06.12.2014 в 20:38.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
я так понял, ingame error может вылетать из за часто отправляемых ивентах. я других вариантов не вижу. я знаю что рулетка готова, ивент составлен правильно, а ошибка всё равно вылетает((
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
из за часто отправляемых ивентах. я других вариантов не вижу. я знаю что рулетка готова, ивент составлен правильно, а ошибка всё равно вылетает((
покажи хоть код (если здесь не хочешь давай в личке), не может быть чтобы все нормально крутились а склеп в ошибку уходил(у меня тоже рулетки переделаны, и никакой проблемы не наблюдаю также посылаю ивенты от всех рулеток кучей) трудно оценивать твою ситуацию в слепую))
Честно говоря, это что-то новенькое. Зачем - пока не понятно. На всякий случай нужно будет добавить параметры в своего бота...
PS. ПоЧарлил несколько переходов... Помимо "внешнего" ID, при походе по друзьям еще идет свой "внутренний" ID (внутри секции event). При каждом переходе, при каждой "удаленной операции" (копание, оставление пряника) этот ID увеличивается на единицу. В общем, нужно будет делать какой-то дополнительный "счетчик", и при каждой операции его увеличивать.
PPS. Сейчас поЧарлил все с нуля... Внутри events ввели ID, который начинается с единицы, и увеличивается с КАЖДЫМ пакетом, содержащим event, не только с копанием (кроме "пустых событий" в виде ответа на входящее событие PING). Так что нужно будет мудрить, возможно в том же message_factory...
Добавлено через 2 часа 33 минуты
В общих чертах идея есть, нужна помощь с реализацией...
1. В файле game_engine нужно (можно) модифицировать процедуру send_game_event(), чтобы каждый раз, когда отправляется событие, увеличивался счетчик.
2. Возможно (вероятно) нужно увеличивать счетчик на КАЖДОЕ событие (то есть если копается 100 грядок, то счетчик должен увеличиться на 100).
Последний раз редактировалось mike4kz; 09.12.2014 в 07:28.
Причина: Добавлено сообщение
# coding=utf-8
import logging
from game_state.game_types import GameBuilding, GamePlayGame, DailyBonus
from game_actors_and_handlers.base import BaseActor
from game_state.game_event import obj2dict
logger = logging.getLogger(__name__)
class FrutRouletteRoller(BaseActor):
def perform_action(self):
# '@R_56' Компот
# '@R_57' Вишнёвый джем
# '@R_58' Лимонный микс
# '@R_59' Мармелад
# '@R_60' Глазной суп
# '@S_53' Мандарин
# '@S_52' Вишня
# '@S_51' Красные яблоки
# '@S_55' Глазное яблоко
# '@S_54' Лимон
#ftut_ids = ['@R_56','@R_57']
ftut_ids = {'@R_57'}
for fr in ftut_ids:
frut_count=self._get_game_state().count_in_storage(fr)
if frut_count==0: break
buildings = self._get_game_location().get_all_objects_by_type(
GameBuilding.type)
for building in list(buildings):
building_item = self._get_item_reader().get(building.item)
for game in building_item.games:
game_id = game.id
play_cost = None
if hasattr(game, 'playCost'):
play_cost = game.playCost.item
next_play = None
next_play_times = building.nextPlayTimes.__dict__
if game_id in next_play_times:
next_play = int(next_play_times[game_id])
if (
next_play and
self._get_timer().has_elapsed(next_play) and
play_cost == fr
):
countR=0
for i in range(frut_count):
roll = GamePlayGame(building.id, game_id)
self._get_events_sender().send_game_events([roll])
countR+=1
self._get_game_state().remove_from_storage(fr,1)
logger.info(u"Крутим рулетку %d раз в '%s' %d по координатам (%d,%d)"%(countR,building_item.name,building.id,building.x,building.y))
class RouletteRoller(BaseActor):
def perform_action(self):
buildings = self._get_game_location().get_all_objects_by_type(
GameBuilding.type)
for building in list(buildings):
building_item = self._get_item_reader().get(building.item)
for game in building_item.games:
game_id = game.id
play_cost = None
if hasattr(game, 'playCost'):
play_cost = game.playCost
next_play = None
next_play_times = building.nextPlayTimes.__dict__
if game_id in next_play_times:
next_play = int(next_play_times[game_id])
if next_play is None: get_next_play = False
else: get_next_play = self._get_timer().has_elapsed(next_play)
if game_id == "B_TAVERNA_ROULETTE_1":
pirate_box = 0
for _obj in list(self._get_game_state().get_state().storageGameObjects):
if _obj.item == '@PIRATE_BOX' or '@PIRATE_BOX_2': pirate_box = 1
if pirate_box!=1 and (self._get_game_state().get_state().pirate.state != 'PIRATE'): play_cost = None
else: play_cost = game.unconditionalPlayCost
# Крутить рулетку в адмирал за глазной суп
item_count=self._get_game_state().count_in_storage('@R_60')
if building_item.id == 'B_SOLDIER' and game_id == 'B_SOLDIER_ROULETTE' and item_count>=1:
self._get_game_state().remove_from_storage('@R_60',1)
play_cost = None
# Конец адмирала
# Крутить рулетку в аисте за 25 малины
item_count=self._get_game_state().count_in_storage('@S_57')
if building_item.id == 'B_TREE_STORK' and game_id == 'B_TREE_STORK_ROULETTE' and item_count>=25:
self._get_game_state().remove_from_storage('@S_57',25)
play_cost = None
# Конец аиста
# Крутить рулетку в казино если фишек = 0
item_count=self._get_game_state().count_in_storage("@O_CHIPS")
if (building_item.name==u'Казино'):
if (item_count==0) and (not next_play):
play_cost = None
else:
play_cost = 'Nul'
# Конец казино
# Зомби фортуна за 5 фишек
if (building_item.name==u'Зомби-фортуна') and (game_id == 'B_SLOT_B_ROULETTE1') and item_count>=5:
self._get_game_state().remove_from_storage('@O_CHIPS',5)
play_cost = None
next_play = False
# Конец зомби фортуны
# Рулетки с лимитом
if hasattr(game, 'playsCount'):
Play_Count=building.playsCounts.__dict__
if game_id in Play_Count:
play_Count = int(building.playsCounts.__dict__[game_id])
if play_Count<game.playsCount:play_cost = None
else:play_cost = 'Nul'
if (
next_play and
self._get_timer().has_elapsed(next_play) and
play_cost is None
):
logger.info(
u"Крутим рулетку в '" +
building_item.name + "' " +
str(building.id) +
u" по координатам (" +
str(building.x) + u", " + str(building.y) + u")")
roll = GamePlayGame(building.id, game_id)
self._get_events_sender().send_game_events([roll])
# coding=utf-8
import logging
from game_state.game_types import GameBuilding, GamePlayGame, DailyBonus
from game_actors_and_handlers.base import BaseActor
from game_state.game_event import obj2dict
logger = logging.getLogger(__name__)
class FrutRouletteRoller(BaseActor):
def perform_action(self):
# '@R_56' Компот
# '@R_57' Вишнёвый джем
# '@R_58' Лимонный микс
# '@R_59' Мармелад
# '@R_60' Глазной суп
# '@S_53' Мандарин
# '@S_52' Вишня
# '@S_51' Красные яблоки
# '@S_55' Глазное яблоко
# '@S_54' Лимон
#ftut_ids = ['@R_56','@R_57']
ftut_ids = {'@R_57'}
for fr in ftut_ids:
frut_count=self._get_game_state().count_in_storage(fr)
if frut_count==0: break
buildings = self._get_game_location().get_all_objects_by_type(
GameBuilding.type)
for building in list(buildings):
building_item = self._get_item_reader().get(building.item)
for game in building_item.games:
game_id = game.id
play_cost = None
if hasattr(game, 'playCost'):
play_cost = game.playCost.item
next_play = None
next_play_times = building.nextPlayTimes.__dict__
if game_id in next_play_times:
next_play = int(next_play_times[game_id])
if (
next_play and
self._get_timer().has_elapsed(next_play) and
play_cost == fr
):
countR=0
for i in range(frut_count):
roll = GamePlayGame(building.id, game_id)
self._get_events_sender().send_game_events([roll])
countR+=1
self._get_game_state().remove_from_storage(fr,1)
logger.info(u"Крутим рулетку %d раз в '%s' %d по координатам (%d,%d)"%(countR,building_item.name,building.id,building.x,building.y))
class RouletteRoller(BaseActor):
def perform_action(self):
buildings = self._get_game_location().get_all_objects_by_type(
GameBuilding.type)
for building in list(buildings):
building_item = self._get_item_reader().get(building.item)
for game in building_item.games:
game_id = game.id
play_cost = None
if hasattr(game, 'playCost'):
play_cost = game.playCost
next_play = None
next_play_times = building.nextPlayTimes.__dict__
if game_id in next_play_times:
next_play = int(next_play_times[game_id])
if next_play is None: get_next_play = False
else: get_next_play = self._get_timer().has_elapsed(next_play)
if game_id == "B_TAVERNA_ROULETTE_1":
pirate_box = 0
for _obj in list(self._get_game_state().get_state().storageGameObjects):
if _obj.item == '@PIRATE_BOX' or '@PIRATE_BOX_2': pirate_box = 1
if pirate_box!=1 and (self._get_game_state().get_state().pirate.state != 'PIRATE'): play_cost = None
else: play_cost = game.unconditionalPlayCost
# Крутить рулетку в адмирал за глазной суп
item_count=self._get_game_state().count_in_storage('@R_60')
if building_item.id == 'B_SOLDIER' and game_id == 'B_SOLDIER_ROULETTE' and item_count>=1:
self._get_game_state().remove_from_storage('@R_60',1)
play_cost = None
# Конец адмирала
# Крутить рулетку в аисте за 25 малины
item_count=self._get_game_state().count_in_storage('@S_57')
if building_item.id == 'B_TREE_STORK' and game_id == 'B_TREE_STORK_ROULETTE' and item_count>=25:
self._get_game_state().remove_from_storage('@S_57',25)
play_cost = None
# Конец аиста
# Крутить рулетку в казино если фишек = 0
item_count=self._get_game_state().count_in_storage("@O_CHIPS")
if (building_item.name==u'Казино'):
if (item_count==0) and (not next_play):
play_cost = None
else:
play_cost = 'Nul'
# Конец казино
# Зомби фортуна за 5 фишек
if (building_item.name==u'Зомби-фортуна') and (game_id == 'B_SLOT_B_ROULETTE1') and item_count>=5:
self._get_game_state().remove_from_storage('@O_CHIPS',5)
play_cost = None
next_play = False
# Конец зомби фортуны
# Рулетки с лимитом
if hasattr(game, 'playsCount'):
Play_Count=building.playsCounts.__dict__
if game_id in Play_Count:
play_Count = int(building.playsCounts.__dict__[game_id])
if play_Count<game.playsCount:play_cost = None
else:play_cost = 'Nul'
if (
next_play and
self._get_timer().has_elapsed(next_play) and
play_cost is None
):
logger.info(
u"Крутим рулетку в '" +
building_item.name + "' " +
str(building.id) +
u" по координатам (" +
str(building.x) + u", " + str(building.y) + u")")
roll = GamePlayGame(building.id, game_id)
self._get_events_sender().send_game_events([roll])
def handle(self, event_to_handle):
nextPlayDate = event_to_handle.nextPlayDate
extraId = event_to_handle.extraId
obj_id = event_to_handle.objId
gameObject = self.__game_location.get_object_by_id(obj_id)
if gameObject is None:
logger.critical("OMG! No such object")
return
else:
gameObject.nextPlayTimes.__setattr__(extraId, nextPlayDate)
building = self.__item_reader.get(gameObject.item)
for game in building.games:
if game.id == extraId:
game_prize = None
if hasattr(event_to_handle.result, 'pos'):
prize_pos = event_to_handle.result.pos
game_prize = game.prizes[prize_pos]
elif hasattr(event_to_handle.result, 'won'):
prize_pos = event_to_handle.result.won
if prize_pos is not None:
game_prize = game.combinations[prize_pos].prize
if game_prize:
prize_item = game_prize.item
prize = self.__item_reader.get(prize_item)
count = game_prize.count
#print 'Rollets'
#print prize_item
self.__game_state_.add_from_storage(prize_item,count)
logger.info(u'Вы выиграли ' + prize.name +
u'(' + str(count) + u' шт.)')
else:
logger.info('Вы ничего не выиграли.')
if hasattr(game, 'playsCount'):
if game_id in Play_Count:
if play_Count<game.playsCount:play_Count += 1
else:continue
count_last=game.playsCount-play_Count
self.cprint(u"7 Кручу рулетку в^6_'%s'^2_оталось^7_%d/%d"%(building_item.name,count_last,game.playsCount))
building.playsCounts.__dict__[game_id]=dict2obj(play_Count)
else:self.cprint(u"7 Кручу рулетку в^6_'%s'^2_"%building_item.name)
else:self.cprint(u"7 Кручу рулетку в^6_'%s'^2_"%building_item.name)
roll = GamePlayGame(building.id, game_id)
self._get_events_sender().send_game_events([roll])
Можно ли это вылечить?
Для начала вылечи сообщение и ссылки.
По скрину ошибки (ты на него не смотришь?) - в "последнее время" ты всунул туда часть кода который использует цветной лог cprint, но всё нужное не добавил. Или добавляй или поменяй на logger.info
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
В файле game_engine нужно (можно) модифицировать процедуру send_game_event(), чтобы каждый раз, когда отправляется событие, увеличивался счетчик.
Добавить ключ "id" в event не проблема. Проблема в том, что не в каждом event он присутствует. Например собирая урожай, копая грядки id не отправляется. Отправляется при переходе на остров, отправке подарков, может ещё где-то. Нужно выяснять, когда отправляется, может зависит от ключа 'type' в events, я не знаю.