 |
Zombot (Клиент для игры Зомби ферма) [Обсуждение] - Свободное обсуждение - Ваши идеи, вопросы и ответы на тему браузерных игр и социальных сетей |
11.01.2015, 17:28
|
#3826
|
|
|
|
Разведчик
|
 Регистрация: 04.02.2013
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Ребят, А подскажите адресок compositions.soc для фейсбука?
Код:
https://zombie-fb.shadowlands.ru/zombiefb-res/res/compositions.soc
не подходит.
Думал, что там по аналогии с итемсами
|
|
|
11.01.2015, 17:29
|
#3827
|
|
|
|
Разведчик
|
 Регистрация: 25.02.2013
 Сообщений: 1
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
'http://vizorfb-a.akamaihd.net/zombiefb-res/res/compositions.soc'
|
|
|
11.01.2015, 21:56
|
#3828
|
|
|
|
Разведчик
|
 Регистрация: 22.03.2012
 Сообщений: 3
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
Можете пояснить, чем именно? Это тот же dict |
|
 |
|
 |
|
Считаю, что костыльность dict as obj в том, что можно перекрыть родные методы словаря, хотя если быть аккуратным, то все ок. Но позже об этом можно забыть и получить неделю веселого дебага )))
 |
Цитата: |
 |
|
|
|
|
|
|
|
Keep-alive будет? |
|
 |
|
 |
|
не понял, если честно, мне requests понравился тем, что не надо самому возиться с куками, кодировками, распаковкой контента и т.п.
 |
Цитата: |
 |
|
|
|
|
|
|
|
Ну Вы опять на C/php пишете? На питоне короче:
Код:
plants=filter(lambda(x):x['type'] == u'plant',objects) |
|
 |
|
 |
|
Насчет моего 4х-строчного куска кода и вашего 1х-строчного: да, питон я почти не знаю, делаю по наитию, я сам сишник. Ваш вариант мне понятен, но лямбда и длинная строка режет глаза. Согласитесь, что мой вариант читабельнее для незнакомого с питоном человека?
 |
Цитата: |
 |
|
|
|
|
|
|
|
И гляньте потом на game_engine.Game.handle_event ? Очень хочется перенести необходимость изменений оттуда в сами реализации потомков BaseActor. |
|
 |
|
 |
|
до него доберусь
Последний раз редактировалось ruslanische; 11.01.2015 в 22:02.
|
|
|
13.01.2015, 10:13
|
#3829
|
|
|
|
Разведчик
|
 Регистрация: 29.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 8 раз(а) в 5 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
можно перекрыть родные методы словаря
|
|
 |
|
 |
|
Если правильно понял, то ничего против не имею. Тем более,
Код:
def __getattr__(self, key): # этот метод будет вызван, если атрибут
# с именем key не будет найден у экземпляра класса
То есть это, похоже, не перегрузка, а дополнение, я не пробовал ещё. Тем более, у самого dict довольно мало свойств/методов, чтобы перепутать их со значениями ключей. Ну, и в конце, я думал, чем этот подход будет неудобен -- тем, что json.loads отдаёт таки list/dict , а выше пример использует наследованный от dict класс, что приводит к требованию преобразования после json.loads , а это опять процессорное время. Или есть возможность перегрузить напрямую класс dict?  Повторюсь, не пробовал.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
и получить неделю веселого дебага
|
|
 |
|
 |
|
Да ну уж не неделю, с локаклизацией места ошибки, даже если забыть, час-два. А забыть будет проблемно, потому что в dictе ставим точки, вместо [' ']
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
не понял, если честно
|
|
 |
|
 |
|
Нынешний вариант бота, в отличие от swf-клиента, шлёт connection:close; в заголовках запроса, что приводит к переполнению connection pool в XP после где-то около 60 часов работы бота, у меня, и приходится перезагружать систему. connection:keep-alive; было бы куда приятнее в этом плане, хотя, висящие открытыми сокеты тогда могли бы, возможно, каким-либо нехорошим образом сказаться на возможности подключиться к серверу. Всё равно, в connection:close; для себя я вижу проблему, поэтому keep-alive был бы приятнее.
И да, стандартными питоновскими средствами keep-alive , вроде, не реализуем, а в requests он встроен, в этом я вижу большой плюс requests .
И я сишник, будем знакомы
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
длинная строка режет глаза
|
|
 |
|
 |
|
Это правда, мне тоже. Тогда так: ?
Код:
plants=[obj for obj in objects if obj['type'] == u'plant']
, без лямбды, но ещё длиннее...
Тогда и до передачи параметров в потомки BaseActor , там то же. Вроде больше претензий по сути у меня к "фреймворку бота" не было
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
да, питон я почти не знаю
|
|
 |
|
 |
|
Ну, Вы же собираетесь поддерживать проект после тотального рефакторинга? Или уйдёте, как anonproger(VanVan) и Redyan? Придёт. Я и сам смотрю на то, что писал в начале на pythonе, с изрядной долей критики.
Что сильно нравится в python -- костыли не надо прогать. Всё, что можно подумать, из элементарных конструкций, так или иначе уже есть. Тот же defauldict взять, к примеру. Я видел его реализацию (не использование) в боте 
Что не устраивает - на нём надо писать просто. Если на C я могу написать тут же, как подумал, то на pythonе надо ещё подумать, как это написать просто.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
для незнакомого с питоном человека
|
|
 |
|
 |
|
Я почему-то считал, что не стоит заморачиваться с поддержкой не-питонщиками бота на питоне, по крайней мере, фреймворка. Наверно, был неправ. Хотя
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Ваш вариант мне понятен,
|
|
 |
|
 |
|
, и это уже красиво, с точки зрения реализации.
Всё равно я считаю главной целью своих воздействий на бот, кроме оптимизации времени исполнения, максимальную простоту написания конечных модулей, которые и правда могут разрабатываться кем угодно. Чтобы народ не просил "а дайте модуль для крафта %1", а написал self.craft( ,
чтобы не было ответов "для расстановки рыбаков можете поменять модуль для посадки деревьев" - зачем нам дублирование кода? Проще:
to_buy = "SC_FISHER"
for place in self.places(to_buy):
self.buy(to_buy)
self.send() , либо, более с пониманием, что происходит:
to_buy = "SC_FISHER"
buy=[]
for place in self.places(to_buy):
buy.append(self.buy(to_buy))
self.send(buy)
, а в buy уже упихать всевозможные проверки: есть ли монеты/зб, есть ли место,
всевозможные модификации game_state: вычитание монет, постановку рыбака. Причём написать это всё во фреймворке максимально расширяемо.
Да, я за бОльшую популяризацию бота, таким образом, и меня пинали, что это неправильно. Всё равно так красивее 
Или что Вы имели в виду?
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
трудно добавлять новый функционал
|
|
 |
|
 |
|
Последний раз редактировалось megabyte0; 13.01.2015 в 11:57.
|
|
|
13.01.2015, 11:31
|
#3830
|
|
|
|
Разведчик
|
 Регистрация: 22.03.2012
 Сообщений: 3
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Это правда, мне тоже. Тогда так: ?
Код:
plants=[obj for obj in objects if obj['type'] == u'plant']
, без лямбды, но ещё длиннее...
|
|
 |
|
 |
|
Вроде это генератором списка называется, не проверял, что быстрее работает, filter или генератор. А так, конечно приятнее смотрится, именно так и пишу.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
у, Вы же собираетесь поддерживать проект после тотального рефакторинга?
|
|
 |
|
 |
|
Сейчас пока время есть, а там посмотрим, сама игра мне конечно не интересна, точнее хочу построить карусель за 2 лярда для опыта + у меня куча непринятых подарков типа супер-повара, супер-добыча  А так, улучшу бота, придется, конечно, все модули переделывать, но может кому будет лучше на него перейти.
|
|
|
13.01.2015, 12:03
|
#3831
|
|
|
|
Разведчик
|
 Регистрация: 29.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 8 раз(а) в 5 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
сама игра мне конечно не интересна
|
|
 |
|
 |
|
Игра сгнила, это правда. Разве что, на фейсбуке что нормальное осталось.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
хочу построить карусель за 2 лярда для опыта
|
|
 |
|
 |
|
Открываете все острова, берёте супервырубку и 28+ мозгов из останкино, вырубаете всё за сутки, и на 3000 грядок розами/лилиями около 600 000 урожая/день. На карусель надо всего 1 500 000 урожая, это 2.5 дня. Вроде несложно?  Ну, как вариант, как можно сделать, не как совет сделать именно так, конечно
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
+ у меня куча непринятых подарков типа супер-повара, супер-добыча
|
|
 |
|
 |
|
Они при превращении полностью заполненного достроенными розовыми клубками острова лысой горы падают, настолько пачками, что их больше гораздо, чем можно захотеть использовать.
То есть подарочные нужны разве что "для старта" и/или достижения 63 уровня для рамбутана для дерева любви. Впрочем, я рамбутан за зб открывал.
Последний раз редактировалось megabyte0; 13.01.2015 в 12:16.
|
|
|
13.01.2015, 12:28
|
#3832
|
|
|
|
Разведчик
|
 Регистрация: 22.03.2012
 Сообщений: 3
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
megabyte0
Кстати, зачем "Initial time offset 6858ms"? Это то самое self._client_time = long(random.randrange(2800, 4000))? Я его пока выпилил...
|
|
|
13.01.2015, 13:57
|
#3833
|
|
|
|
Разведчик
|
 Регистрация: 29.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 8 раз(а) в 5 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Да, я хотел Вам на этот вопрос ответить, тем более, что и сам заинтересован в правильной обработке времени. Но, к сожалению, именно_моя обработка времени иногда падает с ingame error на сборе недозревшего_на_сервере урожая, поэтому как правильно это делать, я бы сказать не смог. Впрочем, как правильно это делать, мне отвечали, я всё равно сделал, как мне понятнее.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
random.randrange(2800, 4000)
|
|
 |
|
 |
|
Это уже неправильно (раньше было правильно), и по этому признаку можно выловить ботоводов, кроме того, что они не просят &gz=y в запросе. Сейчас на сервер swf-клиентом посылается в первых 2 запросах (TIME и START) время в миллисекундах от запуска флешки. У меня около 13с первое и около 45с второе, если swfки грузятся не из кеша браузера.
А ответ, как правильно, похоже, вот: http://zhyk.ru/forum/showpost.php?p=...postcount=3106
Если кто знает, как правильнее, поправьте, пожалуйста...
Последний раз редактировалось megabyte0; 13.01.2015 в 14:02.
|
|
|
13.01.2015, 19:35
|
#3834
|
|
|
|
Разведчик
|
 Регистрация: 22.03.2012
 Сообщений: 3
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Объясните, пожалуйста, зачем нужен gz=y? То, что ответ приходит упакованный, но тип octet чего-то там, это я понял.
Добавлено через 3 минуты
И еще, кто-нибудь проверял, сортируются ли данные в запросах к серверу? В оригинальном боте сортировались, я посчитал это черной магией, т.к. json и есть json, нафига там что сортировать.... А щас глянул, и вроде клиент игры отправляет не сортированный запрос.
Добавлено через 11 минут
И почему могут забанить, если не слать в запросах gz=y?
Последний раз редактировалось ruslanische; 13.01.2015 в 19:46.
Причина: Добавлено сообщение
|
|
|
13.01.2015, 20:10
|
#3835
|
|
|
|
Разведчик
|
 Регистрация: 29.07.2014
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 8 раз(а) в 5 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
И почему могут забанить, если не слать в запросах gz=y
|
|
 |
|
 |
|
Потому что то бот, разумеется, кто не шлёт. А боты официально запрещены, вкладка "правила игры". Оригинальный клиент всегда шлёт, за исключением, может быть, запроса TIME.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Объясните, пожалуйста, зачем нужен gz=y?
|
|
 |
|
 |
|
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
То, что ответ приходит упакованный
|
|
 |
|
 |
|
Иногда в 10 раз, это существенно.
Ну, для снижения инет-нагрузки на сервер, например. Сравните
bash.im/quote/404955
Последний раз редактировалось megabyte0; 13.01.2015 в 20:19.
|
|
|
13.01.2015, 20:40
|
#3836
|
|
|
|
Разведчик
|
 Регистрация: 22.03.2012
 Сообщений: 3
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Поправил своего бота, чтобы понимал данные пришедшие от запроса с флагом gz=y, костыль, но пока так...
Добавлено через 16 часов 21 минуту
Потратил немножко времени на изучение как отправляется время клиента:
1. загружается preload.swf
(овца с колокольчиком и прогресс баром)
время время старта вроде считается со старта этой swf-ки, но пруф в ее сорцах не нашел
строится ссылка на актуальную версию игры
2. загружается и запускается zombiefarm.swf (10-20 секунд)
(заставка с прогресс баром)
3. загружается контент игры (10-20 секунд)
4. инициализируется игра (10-20 секунд)
отправляется запрос TIME со временем загрузки zombiefarm.swf
отправляется запрос START уже с временем клиента (к этому времени оно уже 30-60 секунд)
Добавлено через 17 часов 52 минуты
Кстати, все получают упакованный items.txt?
Код:
import zlib
...
def load_items(self):
logger.info(u'Загружаем словарь объектов...')
items_compressed_raw = Connection(u'http://java.shadowlands.ru/zombievk/items').download_raw(data={u'compress': u'true', u'lang': 'ru'})
items_raw = zlib.decompress(items_compressed_raw)
items = json.loads(items_raw)
with open(self.settings.user_data + u'/items.txt', u'w') as f:
f.write(items_raw)
return items
...
У меня скорость загрузки уменьшилась в разы, а то так бесило при отладке.
Последний раз редактировалось ruslanische; 14.01.2015 в 15:47.
Причина: Добавлено сообщение
|
|
|
14.01.2015, 19:51
|
#3837
|
|
|
|
Пехотинец
|
 Регистрация: 01.08.2012
 Сообщений: 95
 Популярность: 255
 Сказал(а) спасибо: 28
Поблагодарили 54 раз(а) в 38 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
А можно download_raw ?
В принципе и так не напрягает. Получает раз в сутки при первом запуске.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
14.01.2015, 20:49
|
#3838
|
|
|
|
Разведчик
|
 Регистрация: 22.03.2012
 Сообщений: 3
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
vintets
У меня connection.py совсем другой, вам надо видимо сделать так, в items_reader.py заменить
Код:
data = Connection(url).getChangedDocument(
data={'lang': 'ru'},
last_client_time=last_modified_time
)
на
Код:
data_compressed = Connection(url).getChangedDocument(
data={u'compress': u'true', u'lang': 'ru'},
last_client_time=last_modified_time
)
data = zlib.decompress(data_compressed)
и в начало не забыть
|
|
|
14.01.2015, 21:01
|
#3839
|
|
|
|
Разведчик
|
 Регистрация: 09.07.2011
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Всем привет! А дарение по БП вконтакте из этого поста zhyk.ru/forum/showpost.php?p=5392029&postcount=2305 еще актуально ? а то ни как не получается настроить бот вылетает с ошибкой.
|
|
|
15.01.2015, 02:07
|
#3840
|
|
|
|
Разведчик
|
 Регистрация: 04.02.2013
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Ребята! Как исправить ошибку?
Screenshot_1.jpg
PHP код:
# coding=utf-8
import logging
from game_state.game_types import GameWoodGrave, GameWoodGraveDouble,\
GamePickItem, GameWoodTree, GameStone, GameGainItem, GamePickup
from game_state.game_event import dict2obj, obj2dict
from game_actors_and_handlers.base import BaseActor
logger = logging.getLogger(__name__)
class PirateTreeCut(BaseActor):
def get_object_type(self):
return "chop"
def perform_action(self):
options = [
#u'вскрытие сокровищ'
]
resources = self._get_game_location().get_all_objects_by_type(
self.get_object_type()
)
enemies = self._get_game_location().get_all_objects_by_type("pirateEnemy")
# пиратские острова : Остров сокровищ , Таинственный , Жуткий , Северный полюс , Остров сокровищ , Древний
pirate_locs_id = ["exploration_isle1_random","exploration_isle2_random","exploration_isle3_random","exploration_snow1","exploration_isle1_1","exploration_isle4_random"]
instruments = [] # переменная для инструментов
_loc = self._get_game_state().get_game_loc().get_location_id() # текущая локация
if resources:
if _loc not in pirate_locs_id:
st_items = self._get_game_state().get_state().storageItems # Предметы на складе
for item in list(st_items):
if hasattr(item, "item"):
if item.item == ('@CHOP_MACHETE'): #мачете
instruments.append(dict2obj({"item":"@CHOP_MACHETE", "count": item.count}))
if item.item == ('@CHOP_AXE'): #топор
instruments.append(dict2obj({"item":"@CHOP_AXE", "count": item.count}))
if item.item == ('@CHOP_HAMMER'): #кирка
instruments.append(dict2obj({"item":"@CHOP_HAMMER", "count": item.count}))
if item.item == ('@CHOP_TRIDENT'): #Трезубец
instruments.append(dict2obj({"item":"@CHOP_TRIDENT", "count": item.count}))
if item.item == ('@CHOP_TRIDENT_GOLDEN'): #Золотой Трезубец
instruments.append(dict2obj({"item":"@CHOP_TRIDENT_GOLDEN", "count": item.count}))
else: instruments = self._get_game_state().get_state().pirate.instruments
resources_dict = {resource : resource.x for resource in resources}
resources_order = resources_dict.items() # ресурсы отсортированные по X
resources_order.sort(key=lambda x: x[::-1], reverse=True)
#print resources_order
for resource in resources_order:
resource = resource[0]
#print 'resource ', resource,' ', resource.x
#print obj2dict(resource)
tool_needed = resource.chopCount
type_of_res = resource.item
type_of_instrument = self._get_item_reader().get(type_of_res).chopInstrumentType
for tool in instruments:
#print "self._get_item_reader().get(tool.item).chopInstrumentType", self._get_item_reader().get(tool.item).chopInstrumentType
#print "type_of_instrument", type_of_instrument
if self._get_item_reader().get(tool.item).chopInstrumentType == type_of_instrument and tool.count >= tool_needed:
enemy_here = 0
if enemies:
for enemy in enemies:
if(((enemy.x - resource.x)**2+(enemy.y - resource.y)**2)**0.5 < 16):
enemy_here = 1
break
if(enemy_here == 1):
self._get_game_location().remove_object_by_id(resource.id)
logger.info("Сильвер мешает вырубке "+str(resource.id))
break
#print 'tool.count ', tool.count, ', tool_needed ', tool_needed
if tool_needed == 100:
tool_needed = 50
print 'tool_needed Set 50'
#print "resource ", str(obj2dict(resource))
gain_event = {"type":"chop","objId":resource.id,"instruments":{self._get_item_reader().get(tool.item).id:tool_needed},"action":"chop"}
logger.info(u"Рубим " + str(type_of_instrument)+u' instruments:'+str(self._get_item_reader().get(tool.item).id)+', '+str(tool_needed)+u'L, id '+str(gain_event['objId']))
self._get_events_sender().send_game_events( [gain_event] )
if resource.chopCount == tool_needed:
self._get_game_location().remove_object_by_id(resource.id)
else:
resource.chopCount -= tool_needed
tool.count -= tool_needed
break
else:
logger.info("Не осталось ресурсов для добычи")
if u'вскрытие сокровищ' in options:
resources = self._get_game_location().get_all_objects_by_type("pirateCaptureObject")
if resources:
for resource in resources:
enemy_here = 0
if enemies:
for enemy in enemies:
if(((enemy.x - resource.x)**2+(enemy.y - resource.y)**2)**0.5 < 15):
enemy_here = 1
break
if(enemy_here == 1):
self._get_game_location().remove_object_by_id(resource.id)
logger.info("Сильвер мешает взять "+str(resource.id))
continue
gain_event = {"type":"pirateCapture","objId":resource.id,"action":"capture"}
print gain_event
logger.info("Открываем " + str(resource.id))
self._get_events_sender().send_game_events( [gain_event] )
self._get_game_location().remove_object_by_id(resource.id)
else:
logger.info("Нет неоткрытых сокровищ")
Заранее спасибо!
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 17:02.
|
 |