Перейти к содержимому
Для публикации в этом разделе необходимо провести 1 боёв.
MatroseFuchs

[UB] Пример использования Unbound. (How-To)

В этой теме 1 комментарий

Рекомендуемые комментарии

4 885
[LESTA]
Разработчик
1 206 публикаций
6 871 бой

Разберем создание модификаций с использованием Unbound на примере мода, отражающего наш процент побед в каруселе кораблей.

 

Для создания модификации нам нужно решить три основные задачи:

  1. Получить нужные данные;
  2. Правильно обработать эти данные;
  3. Отобразить результат.

Данную статистику мы можем наблюдать в клиенте игры в порту в разделе «Профиль» → «Сводка»:

Скрытый текст

winRate_base.png

 

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

Теперь разберёмся, как получить эти данные.

Для работы с файлами клиента игры, необходимо распаковать их при помощи утилиты. Для нашего мода распакуем директорию res\gui\unbound. Распакованные файлы будут лежать в “..\World_of_Warships\res_unpack\gui\unbound”. В полученных файлах нам нужно найти те, которые работают со статистикой процента побед. Зададим в поиск по всем файлам наиболее близкое по смыслу слово “victory” и посмотрим на результат:

Скрытый текст

search_victory.png

 

По полученным совпадениям увидим файл dock.xml, он же наш порт, а также наиболее близкое по значению совпадение. Так как наш профиль находится в порту, то логично начать поиски в этом файле. Откроем dock.xml и исследуем место совпадения поиска. Тут мы обнаруживаем строкой выше атрибут winRate:

Скрытый текст

find_winRate.png

 

Вероятно, это то, что нам нужно. Как видим, этот параметр содержится в поле statData; теперь посмотрим, где оно находится. Поднявшись немного вверх, обнаружим что statData инициализируется в основном блоке <block className="PlayerSummary">,

Скрытый текст

statData.png

 

а также является свойством компонента dataComponent, который, в свою очередь, содержится в сущности statDataEntity.

Посмотрим на содержимое statData. К сожалению, при работе с XML-файлами нет возможности использовать инструменты отладки, поэтому для отображения содержимого создадим обычный текстовый блок. Сразу добавим стилевой класс, чтобы текст выводился белым, а не чёрным, как по умолчанию:

Скрытый текст

statData_debug_code.png

 

Так как некоторые параметры могут содержать в себе информацию не только в виде строковых или численных значений, но и в формате объекта, то для корректного отображения желаемого параметра используем метод reflect(), который аналогичен функции rtrace() в AS3. Т.к. этот блок будет выводить текст черным цветом, то рекомендую для удобства трассировки добавить в блок класс textDefault, который сделает цвет текста белым с контуром.

 

Обратите внимание!

Чтобы вносимые нами изменения в XML-файл отображались в клиенте игры, необходимо собрать SWF-файл и положить его в «World_of_Warships\res_mods\<Версия игры>\gui\flash», рядом положить USSExpressionsLoader.xml, в котором добавим путь к нашему SWF-файлу, а измененный XML — в «World_of_Warships\res_mods\<Версия игры>\gui\unbound» и запустить игру. После каждого изменения делаем новую сборку SWF-файла.

 

Перейдя на вкладку «Профиль → Сводка» (мы помним, что статистика отображается в сводке профиля игрока), мы увидим, что отобразилось содержимое statData:

Скрытый текст

statData_profile.png

 

Если мы изменим тип боя для отображения статистики в профиле, то можем увидеть, что и в statData произошли изменения: теперь данные отображаются по выбранному типу боя.

Среди полученных данных найдём shipsList, состоящий из словарей с полями по каждому кораблю, среди которых есть и winRate. В dock.xml можем также заметить, что shipsList тоже содержится в dataComponent и уже объявлен в отдельной переменной.

Скрытый текст

trace_info_xml.png

 

Можем считать, что первую задачу мы выполнили: теперь мы знаем, что процент побед по каждому кораблю содержится в shipsList в компоненте dataComponent.

Теперь разберёмся, как получить те же данные, но для карусели кораблей.

Начнем с того, что нам нужно отображать статистику по выбранному типу боя, который выбирается рядом с кнопкой входа в бой. Найдем этот параметр в коде. Как видим ниже, за тип боя отвечает переменная battleType:

Скрытый текст

battleType_code.png

 

Можем предположить, что эта переменная, или что-то похожее на неё, будет располагаться также в блоке рядом с элементом кнопки «В БОЙ!». Попробуем найти элемент этой кнопки; поищем в коде что-нибудь, связанное с “button” и “battle”. Обнаружим вот такие элементы: StartBattleButtonBig и StartBattleButtonSmall, а ниже — BattleTypeChooser:

Скрытый текст

BattleButonBig.png

 

Скрытый текст

BattleButonSmall.png

 

Скрытый текст

BattleTypeChooser.png

 

Это похоже на то, что нам нужно. Исследуем эти элементы и вот что наблюдаем:

Скрытый текст

selectedBattle_code.png

 

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

Теперь разберёмся, как получить shipsList по выбранному типу боя. Мы уже знаем, что dataComponent содержится в statDataEntity. Посмотрим, что там полезного для нас найдётся:

Скрытый текст

statDataEntity.png

 

В процессе поиска shipsList мы могли заметить, что сущность (Entity) statDataEntity является элементом коллекции statDataEntities. Заглянув в эту коллекцию, обнаружим, что она состоит из одного элемента и содержит компоненты dataComponent и rankedSeasonHistory. Если взять энтити с другим компонентом и так же содержащий компонент dataComponent, и заглянуть в нее, то обнаружим, что компонент dataComponent этой энтити содержит информацию, относящуюся к выбранному компоненту. Можем заметить, что компонент rankedSeasonHistory содержит поле gameType, которое отвечает за тип боя. Следовательно, если мы зададим этому компоненту тип выбранного нами боя, то можем получить из dataComponent список shipsList с нужным процентом побед. Теперь проверим нашу гипотезу.

Стоит заметить, что обращение к полю объекта осуществляется через точку (“object.field”) как к его свойству в AS3.

В коде ниже можем заметить связку, которая даёт нам сущность с отфильтрованным компонентом по требуемому полю:

Скрытый текст

rankedSeasonHistory_filter.png

 

Воспользуемся этим. Теперь получим значение выбранного типа боя: возьмем сущность, содержащую компонент rankedSeasonHistory с выбранным типом боя, а из компонента dataComponent (который, как мы уже знаем, будет у нашей сущности) получим shipsList и выведем на экран:

Скрытый текст

trace_info.png

 

Итак, мы видим список имеющихся у нас кораблей по выбранному типу боя с полями процента побед (строковое представление – winRate, числовое представление – winRateNum). Выберем другой тип боя и увидим, что в shipsList теперь отражаются данные по кораблям, которыми мы играли в этом типе боя. Можно считать, что и вторую задачу мы выполнили.

Теперь перейдём к визуализации результата. Прежде всего, нам нужно найти тот элемент, в котором мы будем выводить наш процент побед. Искать будем карусель кораблей, и в ней — слот корабля. Поиск карусели по всем XML файлам выдаст большое количество совпадений, но если приглядеться, то обнаружим среди файлов наш dock.xml.

Немного поискав и используя в качестве инструмента отладки обычный текстовый блок со значением “Hello World!” (см. документацию, раздел «Блоки»), обнаружим основной элемент карусели CarouselItem:

Скрытый текст

CarouselItem.png

CarouselItem_dock.png

 

Тут можно обработать наш список кораблей и получить процент побед для каждого корабля в отдельности. Для начала получим отфильтрованный список по типу боя:

Скрытый текст

CarouselItem_shipsList_byType.png

 

При работе со списком воспользуемся связкой indexOf, которая позволит получить элемент списка для текущего слота корабля. Очевидно, что для каждого слота карусели будет определяться свой корабль с различными свойствами, среди которых может быть и его идентификатор (id). Пролистав немного ниже, убедимся, что так и есть:

Скрытый текст

CarouselItem_shipId.png

 

Воспользуемся связкой indexOf, получим индекс элемента списка для текущего слота корабля и возьмем значение winRate. Взглянем на результат:

Скрытый текст

CarouselItem_shipWinRate.png

Doc_carousel_winRate.png

 

Как видим, у нас отображается процент побед по каждому кораблю в зависимости от выбранного типа боя. Пойдем дальше: найдем элемент самого слота, большого и маленького, чтобы разместить процент побед внутри самого слота. Продолжив поиски, найдем ShipCarouselDefaultSlot – слот обычного размера,

Скрытый текст

DefaultSlot_code.png

DefaultSlot_port.png

 

а ниже — элемент слота маленького размера ShipCarouselSmallSlot. Разберёмся, как передаются данные в слот — например, уровень корабля, и какие связки при этом используются. В элементе слота найдём блок, отвечающий за размещение значения уровня корабля:

Скрытый текст

block_shipLevel.png

 

 

Здесь же видим, какой используется стиль текста, а также стиль расположения блока внутри элемента. Теперь посмотрим, как этот параметр передаётся в элемент слота:

Скрытый текст

slotWrapper.png

levelRome.png

 

Передадим наше значение процента побед аналогичным способом:

Скрытый текст

slotWrapper_addWinRate.png

 

Далее добавим блок для отображения значения с такими же отступами сверху и справа, и со стилем текста, аналогичным уровню корабля, чтобы все элементы слота визуально сочетались между собой:

Скрытый текст

block_winRate.png

dock_winRate.png

 

Добавим последние штрихи, а именно — цветовую градацию процента побед аналогично танковому моду, и зададим условие: при отсутствии винрейта текстовый блок будет пустым. Для этого возьмём уже числовое представление процента побед, а для изменения цвета текста – связку <bind name="style" value="'textColor'; …”>:

Скрытый текст

final_block_winRate.png

final_dock_winRate.png

 

Продублируем блок для маленького слота:

Скрытый текст

smallSlot_winRate.png

 

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

 

П.С.

Не забываем после каждого изменения XML-документа пересобрать SWF-файл мода и заменить файлы в соответствующих папках в res_mods.

 

  • Плюс 2
  • Круто 1

Рассказать о публикации


Ссылка на публикацию
Гость
Эта тема закрыта для публикации новых ответов.

×