Huitaarva 18 #226822 Posted November 4, 2014 (edited) Ничего не понял... ( Ребят, ну объясните нормально, в личку напишите, если тут не можете.Учить весь Питон ради поменять себе пару параметров не айс. А Макс просит нереальные деньги за замену двух строк и компиляцию, до 2к цена доходит... Edited November 4, 2014 by Huitaarva 1 1 Quote Share this post Link to post Short link Share on other sites
o-0-0-0 77 #227072 Posted November 4, 2014 Нагородил-то )))) Там достаточно принт в нужном месте поставить и код сам расшифруется )))) Неа принт не катит , что то ещё нужно 1 2 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #227764 Posted November 5, 2014 В репозитарий Decompile_WOT залил также zip-архивы cо скриптами клиента - тыц. Скачать, кто не знает, очень просто. Жмякаете на название архива, затем на ссылку "...view the full file." и архив скачивается. Quote Share this post Link to post Short link Share on other sites
ZorroJan 17 #228131 Posted November 5, 2014 При запуске реплея выскакивает вот такая чтука: Traceback (most recent call last):*** File "", line 4, in bootstrap*** File "c:\p27\hooks.py", line 204, in import_module_hook*** File "", line 26, in <module>*** ImportError: cannot import name Requester Не плохо бы ещё ExpressScript уметь запускать в клиенте. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #228173 Posted November 6, 2014 При запуске реплея выскакивает вот такая чтука: Traceback (most recent call last): *** File "", line 4, in bootstrap *** File "c:\p27\hooks.py", line 204, in import_module_hook *** File "", line 26, in <module> *** ImportError: cannot import name Requester Чаво? Не плохо бы ещё ExpressScript уметь запускать в клиенте. Чаво? Чаво? Quote Share this post Link to post Short link Share on other sites
coJlHe4Hblu_noH4uk 141 #228449 Posted November 6, 2014 Оффтоп: Захотел тут посмотреть, что и в каких ситуациях вызывается из clientchat - модифицировал его, закинул назад. Не грузит клиент. Немодифицированный, но перекомпиленный файл тоже не кушает. Что я делаю не так и как мне добиться поставленной цели? Quote Share this post Link to post Short link Share on other sites
MakcT40 331 #228467 Posted November 6, 2014 перекомпиленный файл тоже не кушаетМожет с приложенным файлом получится?clientchat094.7z 1 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #228486 Posted November 6, 2014 Оффтоп: Захотел тут посмотреть, что и в каких ситуациях вызывается из clientchat - модифицировал его, закинул назад. Не грузит клиент. Немодифицированный, но перекомпиленный файл тоже не кушает. Что я делаю не так и как мне добиться поставленной цели? Вообще такое надо делать аналитически, а не перекомпиливая исходники, так как декомпиляторы могут портить код. Бери скачай архив с исходниками открывай в Notepad++ всю корневую папку за раз и поиском по всем файлам смотри что где вызывается. Такой метод лучше. 2 Quote Share this post Link to post Short link Share on other sites
coJlHe4Hblu_noH4uk 141 #228487 Posted November 6, 2014 (edited) Может с приложенным файлом получится? return'ы и assert так влияют? Почему? P.S. помогло, да, только в чем именно затык был? Такой метод лучше. А если исходная цепочка вызовов идет из флэша, как такое отловить? Декомпилить еще и флэш? Edited November 6, 2014 by DotNetFramework Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #228492 Posted November 6, 2014 return'ы и assert так влияют? Почему? Ретурны тут не причем, проблема тут скорее всего: raise isinstance(self, BigWorld.Entity) or AssertionError Quote Share this post Link to post Short link Share on other sites
coJlHe4Hblu_noH4uk 141 #228493 Posted November 6, 2014 (edited) Вообще такое надо делать аналитически хреновый из меня реверсер :( Архив уже давно есть, отдельное спасибо за гитхаб. UPD. Чтобы программно создать приватный канал нужно вызвать createPrivate(friendID: обычный_id_юзера, friendName: имя_юзера), это понятно. А вот сделать туда broadcast(channelId, 'Бла-бла-бла') - споткнулся на том, откуда брать channelId? Edited November 6, 2014 by DotNetFramework Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #228640 Posted November 6, 2014 (edited) А вот сделать туда broadcast(channelId, 'Бла-бла-бла') - споткнулся на том, откуда брать channelId?Подробно опиши какие модули используешь, что и как вызываешь. Upd. Нашел твою команду... ИД чата напрямую запросом не возвращается, значит его надо запрашивать (искать по критерию)... Upd2. def new_ChatCommandsController_sendChatCommand(self, command): #this method is called without calling original method, this method sends a message! No double message! from messenger import MessengerEntry from messenger.proto.bw.find_criteria import BWPrbChannelFindCriteria, BWBattleTeamChannelFindCriteria from constants import PREBATTLE_TYPE controls = MessengerEntry.g_instance.gui.channelsCtrl criteria = BWPrbChannelFindCriteria(PREBATTLE_TYPE.SQUAD) if _config_['modActivated'] else BWBattleTeamChannelFindCriteria() controller = controls.getControllerByCriteria(criteria) if controller is not None: controller.sendCommand(command) returnЭтот кусок кода из разработки "Взводные команды" Файлы для изучения: scripts/client/messenger/m_constants.py scripts/client/messenger/proto/bw/find_criteria.py scripts/common/chat_shared.py scripts/client/ChatManager.py scripts/client/messenger/gui/Scaleform/channels/bw/factories.py Upd3. Еще до кучи туда же scripts/client/messenger/gui/Scaleform/view/SimpleChannelWindow.py scripts/client/messenger/gui/Scaleform/view/LobbyChannelWindow.py scripts/client/messenger/gui/Scaleform/data/ChannelsCarouselHandler.py Тут инфа по участникам чата есть.. scripts/client/messenger/gui/Scaleform/channels/_layout.py Сюда она наследуется... scripts/client/messenger/gui/Scaleform/channels/bw_chat2/lobby_controllers.py а там... class UnitChannelController... интуиция подсказывает, что scripts/common/constants.py -> PREBATTLE_TYPE.UNIT И из вариантов PREBATTLE_TYPE больше ничего не подходит... Данные по составлению критерия брать здесь scripts/client/messenger/proto/bw/find_criteria.py scripts/client/messenger/proto/bw_chat2/find_criteria.py Не забыть, что PROTO_TYPE.BW_CHAT2 или PROTO_TYPE.BW Типа чат версии 2 как я понял... Тут класс, объект которого возвращается MessengerEntry.g_instance.gui.channelsCtrl scripts/client/messenger/gui/Scaleform/channels/__init__.py В принципе, достаточно получить контроллер чата по схеме выше (скрипт), и вызвать команду типа sendMessage У контроллера должна быть подобная команда. Копай дальше сам) Edited November 6, 2014 by GPCracker 1 Quote Share this post Link to post Short link Share on other sites
coJlHe4Hblu_noH4uk 141 #228658 Posted November 6, 2014 (edited) @GPCracker, спасибо. UPD. И почему бы WG не сделать что-то типа "CreateChannel", возвращающий id диалога... Навертели жесть. Edited November 7, 2014 by DotNetFramework Quote Share this post Link to post Short link Share on other sites
ZorroJan 17 #229297 Posted November 8, 2014 (edited) Значит им не нать ;) Edited November 8, 2014 by ZorroJan Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #229318 Posted November 8, 2014 (edited) UPD. И почему бы WG не сделать что-то типа "CreateChannel", возвращающий id диалога... Навертели жесть.Потому что код создания диалога не создает его по всей видимости, а только запрашивает у сервера создание диалога. В случае успешной операции список клиентских чатов обновляется. Если я правильно понял километры картошкинского индусского кода. Там едет явное обращение к base, а эта часть написана на C, скорее всего все операции связи с сервером написаны на сях. З.Ы. , удается находить нужный чат? Edited November 8, 2014 by GPCracker Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,212 #229350 Posted November 8, 2014 (edited) ZorroJan, я так понимаю, дружище, ты программист-юморист? )))))))))))) Такие перлы выдаешь, что прям хоть заламинировать и на доску ))) Кодировка Маршалом работает, но вот не совсем корректно. Орион ставит строку выполнения в скобки, выходит типа: exec (zlib.decompress(base64.b64decode('eNokm8duxNqxRefvK+7MBmiY=='))) а должно быть: exec zlib.decompress(base64.b64decode('eNokm8duxNqxRefvK+7MBmiY==')) и в логе танков потом читаем вот что: <string>: inconsistent use of tabs and spaces in indentation При запуске реплея выскакивает вот такая чтука: Traceback (most recent call last): *** File "", line 4, in bootstrap *** File "c:\p27\hooks.py", line 204, in import_module_hook *** File "", line 26, in *** ImportError: cannot import name Requester Не плохо бы ещё ExpressScript уметь запускать в клиенте. Потому что код создания диалога не создает его по всей видимости, а только запрашивает у сервера создание диалога. В случае успешной операции список клиентских чатов обновляется. Если я правильно понял километры картошкинского индусского кода. Там едет явное обращение к base, а эта часть написана на C, скорее всего все операции связи с сервером написаны на сях. З.Ы. , удается находить нужный чат? А чего это все вдруг в эти чаты кинулись? Вчера ProstoNoob тоже про чаты всё писал. Эпидемия какая-то.... Edited November 8, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
o-0-0-0 77 #229646 Posted November 8, 2014 Грядёт обновление , все в Орионе ))))))) Quote Share this post Link to post Short link Share on other sites
coJlHe4Hblu_noH4uk 141 #229742 Posted November 8, 2014 З.Ы. DotNetFramework, удается находить нужный чат? Не, еще больше запутался пока что) Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #230267 Posted November 10, 2014 Столкнулся с необходимостью установить хук на classmethod. Думаю начинающим мододелам будет полезно. Некоторым бывалым возможно тоже. "Установка хуков на методы различного типа" class cla: @classmethod def mc(sc): print sc return 'ret' @staticmethod def ms(): print 'stat' return 'ret' def mp(self): print self return 'ret' #we have class, and we need to set hooks on it's three different type methods #we create a instance of this class and see what we have got at the end obj = cla() #since object created, we starting to set hooks #ooooh, we have forgot to define hook functions... def new_cla_mc(sc): print 'hook' return old_cla_mc(sc) def new_cla_ms(): print 'hook' return old_cla_ms() def new_cla_mp(self): print 'hook' return old_cla_mp(self) #here all hooks is called before originals, if you need to call origin first use #def hk(*args, **kwargs): # result = orig(*args, **kwargs) # <todo> # return result #Attention! If you are not 100% sure that function returns nothing (None) you SHOULD specify a return, otherwise hook MAY NOT WORK properly #Even if function returns None, specified return will work properly, when not specified may not. #In this examples return stays unchanged and pass through hook, ie, changed method will return the same as unchanged. #Don't forget, that you can change return as you wish, it's useful sometimes! #Important! #We can not define methods directly, outside of class we can only operate with functions. #So, we should get a method from class, transform it into function #then create our wrapper function, transform wrapper in a correct bounding form and bound it to class. #Looking forward, when you assign class property value and value is function type, python bounds it to class #If you just assign a function, it becomes a instance-bounding method #If you transform it to a class method, it becomes a class-bounded method #If you transform it to a static method, it becomes a static method #Returning to hooks set... #The last is the simplest old_cla_mp = cla.mp #we have got an instance-bounding method, when it was got from class, it is unbound and can be used as function #but this construction will work too old_cla_mp = cla.mp.__func__ #now we need to implant our wrapper cla.mp = new_cla_mp #Simple! #Lets handle with static method #Now getting an origin old_cla_ms = cla.ms #static method is a function already, epic! #Now implanting an wrapper cla.ms = staticmethod(new_cla_ms) #A bit harder... #Lets handle with last class method #Gettting an origin old_cla_mc = cla.mc.__func__ #Here transform is STRICTLY required, because you have got an BOUNDED method, but you need unbounded or function #Implanting an wrapper cla.mc = classmethod(new_cla_mc) #Just nothing to do! #Let's see what we have got print obj.mc() print '---' print obj.ms() print '---' print obj.mp() print '---' ''' Results here: hook __main__.cla ret --- hook stat ret --- hook <__main__.cla instance at 0x028A0170> ret --- Exactly, what we need! ''' Кому понравилось, ставьте лайк, будет много лайков, разберу property.) 6 Quote Share this post Link to post Short link Share on other sites
coJlHe4Hblu_noH4uk 141 #230310 Posted November 10, 2014 понравилось Понравилось, но сразу вопрос! А как выяснить последовательность цепочки вызовов функций, не роняя последнюю для создания ошибки? Quote Share this post Link to post Short link Share on other sites