Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от zloy_gnom_2012
Люди, как заставить бота брать "actor" из сеттинс?
settings доступны только из game_engine.Game и ниже по иерархии вложения, тем, кому Game их отдают
self.__settings - это экземпляр класса Settings , описанного в settings.py
Как взять параметр из .ini ? А как это сделано? Берём и смотрим.
Поэтому просто достаточно взять в Game
self.__settings.get_user_setting('actor')
Он вернёт строку, убеждаемся, что он вернул не None, после этого её можно кормить функции eval, если нужно
А что требуется? Тоже запарило лазить каждый раз править game_engine.py ? Я так его вообще не закрываю :))
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от megabyte0
settings доступны только из game_engine.Game и ниже по иерархии вложения, тем, кому Game их отдают
self.__settings - это экземпляр класса Settings , описанного в settings.py
Как взять параметр из .ini ? А как это сделано? Берём и смотрим.
Поэтому просто достаточно взять в Game
self.__settings.get_user_setting('actor')
Он вернёт строку, убеждаемся, что он вернул не None, после этого её можно кормить функции eval, если нужно
А что требуется? Тоже запарило лазить каждый раз править game_engine.py ? Я так его вообще не закрываю )
та у меня одна из первых версий Рейдана, я её модифицырую по немногу...
она более стабильна в отличии от новых версий ботов)
поэтому нужны новые фичи)
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от megabyte0
...
А что требуется? Тоже запарило лазить каждый раз править game_engine.py ? Я так его вообще не закрываю )
Та же картина. А так не будешь закрывать ещё и settings
Не вижу смысла. При активных правках-добавлениях от game_engine никуда не деться, а проблем возрастёт (к game_engine + settings.py + settings.ini
P.S. Пути относительные, всё работает.
Цитата:
Сообщение от zloy_gnom_2012
та у меня одна из первых версий Рейдана, я её модифицырую по немногу...
она более стабильна в отличии от новых версий ботов)
поэтому нужны новые фичи)
Тоже преобразую её перетянув всё вкусное и дописывая. А "более новые" версии уже довольно старые.
В копателе DreamerAG имхо, чуть перемудрили. Там неудобно.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось vintets; 13.08.2014 в 11:01.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Ничего полезного я там не прочитал. А только создал в папке lib папку vkontakte и поместил туда содержимое архива, затем заменил настройщика GUI на свежую версию Zombot GUI ver. 1.0.3 все вбил выставил и стало теперь выскакивать следующее
[Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось j0rac0rnev; 13.08.2014 в 12:18.
Причина: Добавлено сообщение
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от j0rac0rnev
Ничего полезного я там не прочитал. А только создал в папке lib папку vkontakte и поместил туда содержимое архива, затем заменил настройщика GUI на свежую версию Zombot GUI ver. 1.0.3 все вбил выставил и стало теперь выскакивать следующее
[Ссылки могут видеть только зарегистрированные пользователи. ]
Сделал поменял значения в файле game_engine ничего все равно не работает. Может я что то не установил для нормальной работы питона или самого бота? спасибо
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от j0rac0rnev
Сделал поменял значения в файле game_engine ничего все равно не работает. Может я что то не установил для нормальной работы питона или самого бота? спасибо
Выполнить нужно ВСЁ! По всем ссылкам в сообщении. Под катом последний вариант кода.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от vintets
Та же картина. А так не будешь закрывать ещё и settings
Не вижу смысла. При активных правках-добавлениях от game_engine никуда не деться
Я уже от второго человека встречаю это мнение. И я не понимаю, почему люди, программисты, рассматривают проект "как есть" а не "как оно должно быть". Ведь хорошо сделана идея модульности, только недоделана слегка.
Итак, я предлагаю не лазить в game_engine совсем. Что происходит: Всё, что написано ниже, делается 1 раз и навсегда.
Во-первых, будет новый конфиг - с подсекцией на каждое расширение. Все расширения будут сканиться из конфига. Да, он будет длиннее, может быть, менее удобный слегка, но зато расширяемость бота сильно повысится, без правок game_engine. пример конфига
for actor_class in actor_classes:
self.__actors.append(
actor_class(item_reader, game_state, events_sender, timer,
options))
на
Код:
for actor_class_str in self.__settings.extensions:
subsection = self.__settings._currentUser+'.'+actor_class_str
options=dict(self.__settings.parser.items(subsection))
if 'require_friends' in options:
options['friends']=self.__friendsid
source = options['source'] if 'source' in options else actor_class_str.lower()
eval('from game_actors_and_handlers.' + source +' import '+ actor_class_str)
#сюда же можно впихнуть и проверку enabled/disabled
if ('enabled' in options and options['enabled']='false') or
('disabled' in options and options['disabled']='true'):
continue
self.__actors.append(
eval(actor_class_str+'(item_reader, game_state, events_sender, timer,
options)')
@property
def extensions(self):
return [s.split('.',1)[1] for s in self.parser.sections() if s.startswith(self._currentUser+'.')]
def getUsers(self):
return filter(lambda s: s != 'global_settings' and not '.' in s, self.parser.sections())
Дальше - больше, избавляемся от портянки кода в handleEvent
Код:
def handleEvent(self, event_to_handle):
if event_to_handle.action == 'addGift':
AddGiftEventHandler(self.get_game_state(),self.__itemReader).handle(event_to_handle)
elif event_to_handle.action == 'add' and event_to_handle.type == 'pickup':
AddPickupHandler(self.__itemReader, self.get_game_loc(),self.__game_state_,self.__setting_view).handle(event_to_handle)
elif event_to_handle.action == 'ping1':
self.__game_events_sender.send_game_events()
elif event_to_handle.action == 'ping2':
time.sleep(1)
self.__game_events_sender.send_game_events()
else:
flag=False
for key,handle in self._event_handlers:
applyable=False
try:
applyable=key(event_to_handle)
except KeyError, AttributeError:
pass
except:
raise
if applyable:
handle(event_to_handle)
flag=True
if not flag:
self.logUnknownEvent(event_to_handle)
self.__game_events_sender.remove_game_event(event_to_handle)
def addEventHandler(self,key,handle):
for k,h in self._event_handlers:
if h == handle:
break
else:
self._event_handlers.append((key,handle))
#logger.info("Повешан обработчик %s"%handle)
#logger.info("%s"%self._event_handlers)
def removeEventHandler(self,key,handle):
for i,(k,h) in enumerate(self._event_handlers):
if h == handle:
del self._event_handlers[i]
return True
break
else:
return False
Как видите, добавлено 2 новых метода, их сейчас надо "прокинуть" в BaseActor
# coding=utf-8
import logging
from game_actors_and_handlers.base import BaseActor
import game_engine #нагло, не правда ли :)
from collections import defaultdict
logger = logging.getLogger(__name__)
class Knocker(BaseActor):
def perform_action(self):
if not hasattr(self,'friends'):
#logger.info("%s"%self._get_options()['friends'])
self.friends=self._get_options()['friends']
#logger.info("%s"%self.friends)
if not hasattr(self,'remoteNewYear'):
self.remoteNewYear=defaultdict(list)
for treeId_user in self._get_game_state().get_state().remoteNewYear:
if not self.remoteNewYear.has_key(treeId_user.user):
self.remoteNewYear[treeId_user.user]=[treeId_user.treeId]
else:
self.remoteNewYear[treeId_user.user].append(treeId_user.treeId)
self.new_year_gifts_left = 150 - sum(len(v) for k,v in self.remoteNewYear.iteritems())
if self.new_year_gifts_left <= 0:
return
self.removeEventHandler(lambda(e):e.type == 'gameState',self.visitHandler)
if self.friends:
self.visitingUser = str(self.friends.pop(0))
self.addEventHandler(lambda(e):e.type == 'gameState',self.visitHandler)
logger.info(u'Идём к %s'%self.visitingUser)
self.visit(self.visitingUser)
def visitHandler(self,event):
self.removeEventHandler(lambda(e):e.type == 'gameState',self.visitHandler)
logger.info(u"Пришли (%s)"%self.visitingUser)
self.game_loc = game_engine.GameLocation(self._get_item_reader(),event.location,event.gameObjects)
new_year_trees = self.game_loc.get_all_objects_by_items(['B_SPRUCE_SMOLL','B_SPRUCE_MIDDLE','B_SPRUCE_BIG'])
new_year_trees = filter(lambda(obj):obj.level==2 and
len(obj.users)<self._get_item_reader().get(obj.item).placesCount and
not (self.remoteNewYear.has_key(self.visitingUser) and
obj.id in self.remoteNewYear[self.visitingUser]),
new_year_trees)
new_year_trees = new_year_trees[:self.new_year_gifts_left]
if new_year_trees == []:
return
logger.info(u"Обкладываем ёлочки %s"%(', '.join([str(obj.id) for obj in new_year_trees])) )
sending_events=[{"action":"remoteNewYear",
"objId":obj.id,
#"id":60,
"itemId":"CAKE_PACK_FREE1",
"type":"item"} for obj in new_year_trees]
self.remoteNewYear[self.visitingUser]+=[obj.id for obj in new_year_trees]
if sending_events:
self.send(sending_events)
del self.game_loc
def visit(self,user_id):
self.send([{"user":str(user_id),
"travelId":0,
#"id":58,
"type":"gameState",
"action":"gameState",
"locationId":"main",
"objId":None}])
Всё, что выше - это только наброски, написанные тут же "на коленке" и не тестенные, хотя стучалка у меня работает и я ей стучу, названия методов там всё равно слегка не те.
ВСЕМ: Если Вы хоть что-то не понимаете, не лезьте менять свой код, всё равно работать не будет.
P.S. class ConfigParser.ConfigParser
Changed in version 2.7: The default dict_type is collections.OrderedDict , то есть актооры будут браться в том же порядке, что в конфиге
Последний раз редактировалось megabyte0; 13.08.2014 в 21:27.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от megabyte0
Я уже от второго человека встречаю это мнение. И я не понимаю, почему люди, программисты, рассматривают проект "как есть" а не "как оно должно быть". Ведь хорошо сделана идея модульности, только недоделана слегка.
Многие и так знают как сделать. Вариантов несколько. И так правят под себя. Я тоже порывался вынести настройки в сеттингс и даже начинал. Не сделал, т.к. на то время были более насущные правки и вопросы.
Ещё подумал такую вещь:
1. Мне удобно и так, даже добавляется оперативности при добавлении новых модулей.
2. Вот именно, что не все соображают что где править, поэтому вариант или только для себя любимого или будь готов тратить месяцы жизни на правку другим. Ну или добиться распространённости твоей версии преобладающей над уже используемыми, на что многие не пойдут.
3. Опять же версий основных несколько, отличия бывают значительные, в каждой разбираться для правки - жизни не хватит.
4. Вынос выключателя и параметров актёров в сеттингс тянет за собой изменение GUI. Для меня это было одно из главных условий. Если я питон переправлю довольно быстро, то с GUI мороки много и нужно его изменять часто и оперативно на что тупо не хватит времени. Без GUI можно, но копание в сеттинге мало отличается от копания в энжине.
5. Опять же кто как использует. Я например использую много фейков. Они поделены по группам у каждой свой бот. Второстепенные фейки (большинство) запускаю пачками, редактирование редкое. Основные настройки через GUI.
Портянку сеттингса сделать не проблема, а теперь умножь её на сотню... Хотя можно конечно придумать костыли из общих подразделов.
6. И самое главное, в свете недавних событий, когда БАН может прилететь в лоб в любую секунду делать все эти глобальные перестановки это просто не жалеть своё время. Только если для практики.
Посмотри на последние страницы. Маленькая правка, расписанная по шагам, но только со своими путями, вызывает уйму вопросов, на которые просто не в состоянии отвечать по 100 раз.
Ты или должен исправить сам и раздавать в готовом виде просящим, либо делать только для себя и ограниченного числа лиц. Мне только для себя не интересно.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).