Jump to content
Korean Random
█XlebniDizele4ku

Гайд по редактированию логики swf файлов

Recommended Posts

Приветствую.

 

* Код XVM-a, начиная с 4.0.0 имеет немного другой механизм инжекта своего кода



Вот гайд по зашиванию своего кода в swf. Такой способ используется при разработке XVM.
Для обычных пользователей гайд не подходит. Надо уметь кодить. Под кодером я понимаю человека, который не по наслышке знает что такое IDE, ООП, командная строка.

1) Ищем и вытаскиваем пациента.

Весь интерфейс WoT написан на Actionscript 2 в Flash 8. Старый Scaleform GUI движок. Нам только наруку. AS2 проще расковыривать, насколько знаю.

Для начала нужно разобраться с каким swf из файлов нужно работать.

- Идём в WoT\res\packages.
- Открываем gui.pkg посредством архиватора, умеющего в zip. Например с помощью контектсного меню 7zip от правой мышки по файлу выбрать открыть как zip.
- Внутри архива идём по gui/flash.
- Выдёргиваем интересующий файл. Для примера будет TeamBasesPanel.swf - полоса захвата базы.

Из названия флеш файлов можно что-то понять о их назначении. Если непонятно какой файл дёргать, то следует, либо у кого-то узнавать\гуглить, либо по одному доставать и каждый смотреть индивидуально по именам, похожим на интересующую тему.

2) Обзор внутренностей.

- Декомпилируем.

Файл декомпим чем удобно. Я пользую Sothink SWF Decompiler. Версия, думаю, не очень важна.
Из Sothink лучше экпортировать проект в папку. Так проще найти код и иметь уже что-то под рукой, а не каждй раз мучить декомпилер.
Можно посмотреть файл проекта в каком-нибудь не очень свежем Adobe Flash CS*. По вшитым спрайтам\изображениям, возможно, получится представить назначение swf файла. К спрайтам может быть привязан какой-то код.

post-6681-0-38774100-1353622606_thumb.jpg

- Изучаем классы.

В экспортированной папке классы основной функциональности лежат в \net\wargaming\ingame.
Для TeamBasesPanel это
CaptureBar.as
TeamBasesPanel.as


Классы в других папках-пакаджах вспомогательные и прикрепляются ко всем подряд swf файлам из под WoT. Они нас совершенно не интересуют.

Какой-то из классов в проекте будет "пограничным" между игровой логикой Python и Flash частью интерфейса.
Для TeamBasesPanel этот крайний класс в TeamBasesPanel.as.
Python логика передёргивает в нём многие методы. add, remove, updatePoints, setCaptured и т.д.
TeamBasesPanel уже передёргивает методы в CaptureBar.as.

Здесь то как раз и следует разобраться чего хотелось бы поменять или добавить новое.

3) Подмена вызова класса.

Разобрались с интересующим классом. Далее для изменения\добавления кода необходимо вызов этого класса в swf подменить на свой, который расширяет первый.
Таким образом любое поведение перезаписывается. Натуральный override с наследованием.
) Старый класс остаётся на своём месте в swf файле.
) Наш новый класс, расширяющий старый, добавляется в файл.
) Вызов старого класса подменяется новым.
Этот способ часто срабатывает, но не всегда.

* Я не разобрался почему код из всех файлов дублируется в battle.swf. Белорусская магия.

Что бы подменить вызов класса нужно дизассемблировать swf файл. Например с помощью swfmill. Можно и по-проще инструмент, да с GUI. SWiX какой-нибудь. Выбор инструмента за вами.
Для swfmill понадобится libiconv-2.dll.

- В cygwin или терминале Windows перейти в директорию с файлом и выполнить:
swfmill.exe swf2xml TeamBasesPanel.swf TeamBasesPanel.xml

- Поиск вхождения строки "net.wargaming.ingame.TeamBasesPanel" в полученном xml файле.
XML код будет похож на
<DoInitAction sprite="28">
<actions>
<PushData>
<items>
<StackString value="net.wargaming.ingame.TeamBasesPanel"/>
</items>
</PushData>


- Подменить строку вызова интересующего класса на новый класс.
с <StackString value="net.wargaming.ingame.TeamBasesPanel"/>
на <StackString value="wot.TeamBasesPanel.TeamBasesPanel"/>
net.wargaming.ingame это оригинальный варгейминговй флешовый package.
wot.TeamBasesPanel это новый package. Какой угодно можно придумать. Главное реализовать его.

- После внесения измений XML файл надо обратно собрать в исполняемый флеш файл.
swfmill.exe xml2swf TeamBasesPanel.xml TeamBasesPanel.swf

Сборка может ломаться на всяких <String value="/>. Это строки от вшитого JSON парсера. Конкретно те строки на которые идёт ругань можно подчистить. В Notepad++ можно подробнее увидеть символ какого кода ломает сборку swfmill.
Вот пример того что может понадобится подчистить http://code.google.c...Panel.xml.patch

4) Добавление класса.

- Для добавления нового класса в swf файл следует скачать, поставить, пользоваться IDE FlashDevelop.
Другой среды, способной работать с AS2 и при этом уметь инжектить, не знаю.

- В опциях проекта надо явно указать, что код проекта необходимо инжектить в уже существующий swf файл.

post-6681-0-53242100-1353675552_thumb.jpg

- Дополнительные опции.

post-6681-0-72139500-1353675574_thumb.jpg

- Добавить новый класс в проект который указали при подмене. Поставить его always compile в проекте.

post-6681-0-28638700-1353675579_thumb.jpg

- Поставить расширение нового класса от старого вшитого.

post-6681-0-91998600-1353675582_thumb.jpg

- Объявить старый вшитый класс в FD проекте как intrinsic. Эдакая обещалка, что класс в файле инжекта уже есть и что в нём точно будет.
Расширять наш intrinsic от intrinsic gfx.core.UIComponent и объявлять его, думаю необязательно.

post-6681-0-02926100-1353675587_thumb.jpg

5) Сборка.
Build проекта зашьёт новый класс в swf файл. Всё. Положить в res_mods.

6) Дебаг.

Попробуйте писать в temp файл. Не знаю получится ли. Пишите, кто попробует.

Можно использовать xvm-stat и его xvm.log для этих целей.
import wot.utils.Logger со всеми нашими шмотками.

 

function fooMethod()
{
...
bar+= 1;
Logger.add("bar = " + bar);
...


--

Вопросы приветствую. Ответы тут всё равно рано или поздно пригодятся всем интересующимся.

XVM мод как пример. http://code.google.c...n/trunk/src/xvm
Рек-ю выгрузить по svn. Барахла очень много, конечно, но так всё-таки удобнее смотреть изучать готовое решение.

Edited by █XlebniDizele4ku
  • Upvote 16

Share this post


Link to post

Short link
Share on other sites
Очищено от устаревших сообщений, закреплено.

Share this post


Link to post

Short link
Share on other sites

Извиняюсь за нубский вопрос:

Из swf файла элемента интерфейса можно читать текстовые файлы, а можно ли их писать? То есть, есть ли возможность создавать или изменять файлы из элемента интерфейса?

Share this post


Link to post

Short link
Share on other sites

@Malok, да. Именно так XVM и вынужден общаться с внешним. Не знаю где в XVM можно подсмотреть что-то конкретное. Вопрос адресуньте Sirmax-у.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
@Malok, да. Именно так XVM и вынужден общаться с внешним. Не знаю где в XVM можно подсмотреть что-то конкретное. Вопрос адресуньте Sirmax-у.

Хм... Поофтопю...

Из разных фраз разработчиков XVM я сделал вывод, что информация передаётся не через файл, а через попытку открыть несуществующий файл с названием, в котором находится запрос. Модуль статистики, используя Докан, засекает попытку чтения файла, вытаскивает из имени файла запрос, и передаёт данные swf-ке.

 

Я глубоко заблуждаюсь? Просто большинство модов (если не все) способно хранить информацию только в течении одной сессии, и возникает вопрос:

 

 Авторам просто лень заморачиваться, операция записи в файл реализуется через костыль и очень "дорога", или писать файл только средствами флэшки интерфейса в принципе не возможно?

Share this post


Link to post

Short link
Share on other sites

Приветствую. Мне всё не дает покоя идея вывести нужную технику для достижения "Эксперт" в уши. Всмысле подсветить цветом в списке команды противника ту самую технику. Мне думается, что гайд будет полезен для этого. Надо только класс отыскать. Так вот, есть ли другой способ зачитать эту инфу? 

Share this post


Link to post

Short link
Share on other sites

Другой относительно чего?

другой относительно вытащить из класса

Share this post


Link to post

Short link
Share on other sites

XlebniDizele4ku, ты случаем не ковырял Achievements.swf? Там есть класс ToolTipManager, который похоже зачитывает достижения. Подскажи, если использовать trace() в этом классе, то выведится ли эта инфа в клиенте?

Share this post


Link to post

Short link
Share on other sites

Отличный гайд, благодарю.

Насчет разных Trace и флешкуков - пробовал, положительного результата не добился, в итоге дебаг-инфо выводил в текстбокс прямо в игру.

Надо будет попробовать с логом ХВМ это дело спарить.

Хотя может кто-то таки прочел маны к скалеформу и знает как это сделать более цивилизованно чтобы работало чисто средствами игры без хвм-стат.

Куда писать - всёравно, пусть даже в тотже python.log

Share this post


Link to post

Short link
Share on other sites

C trace() это я ступил, это на уровне отладки используется в среде разработки, в ролик не выведится. Thunderbo1t, а ты что коыврял, какие файлы?

Share this post


Link to post

Short link
Share on other sites

>C trace() это я ступил, это на уровне отладки используется в среде разработки, в ролик не выведится. Thunderbo1t, а ты что коыврял, какие файлы?

Дамагпанель, адобфлешем.

Когда не вышло - сделал просто отладочное текстовое поле на полэкрана куда выводил мелким шрифтом то что нужно (список объектов флеша доступных из дамагпанели).

Share this post


Link to post

Short link
Share on other sites

Вот недавний коммит с успешным инжектом в рамках ХВМ-а. Минимум отвлекающего кода.

 

http://code.google.com/p/wot-xvm/source/detail?r=1445



Пробуем делать мод на горячую.

 

http://www.koreanrandom.com/forum/topic/2905-%D0%BE%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F-%D1%82%D0%B0%D0%BD%D0%BA%D0%B0-%D0%B2-%D0%BE%D0%BA%D0%BD%D0%B5-%D0%B2%D0%B7%D0%B2%D0%BE%D0%B4%D0%B0/

Edited by █XlebniDizele4ku

Share this post


Link to post

Short link
Share on other sites

@sirmax, а функцию Utils.GetClanName то не видно:) И вообще пространство Utils наглядности требует, если для начинающих мододелов.

Edited by MrA
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

такой вопрос,я нашел swf-файл,который хочу изменить и вроде нашел что изменить,но строки находятся в скрипте в флешке,декомпилировать у меня получилось и скрипт в принципе не сложный,заменил 2 строки. а вот как обратно компилировать,чтоб получилась такая же флешка,только с измененым скриптом?

Edited by пломбер

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...