Jump to content
Alloder.pro  about Allods with love 😱
Search In
  • More options...
Find results that contain...
Find results in...

Servers monitoring and the Addons Editor

We present you two legends. All dreams come true.

Servers monitoring The Addons Editor

Digest April

We talk about what was done and updated in the past month. We help keep abreast of events.

Read more

Game tooltips

Tooltips provide a way for 3rd party fansites and extensions to display detailed information on mouseover.

Read more

[1.0.07.7] Использование аддонов "старого" типа


Guest wait
 Share

Recommended Posts

Чтобы пост не потерялся в недрах форума - создам новую тему.

История

Итак, после патча перестал работать ставший уже привычным способ подгрузки аддонов, о чем нам любезно сообщил SLA в теме Больше не работают аддоны старого типа. Но (к счастью?!) он немного ошибся :)

Новичкам на форуме напомню: сам способ заключался в подмене оригинальных скриптов их модифицированными копиями при помощи архивации их в *.pak (PK-zip) архив по адресу Allods Online\data\Packs

Начиная с патча 1.0.07.7, Нивал (или уже модно говорить Мейл.ру) выложил АПИ для разработчиков аддонов, а так же перестал работать вышеупомянутый способ.

К сожалению, АПИ не предоставляет возможностей работы с оригинальными скриптами игры, поэтому такие аддоны как TabSelector, jCritVisuator или поколение Highlight'еров умирают. А жаль... :)

Исправляем упущенное

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

Способ 1.

Основной принцип прост, покажу его на примере своего же скрипта OwnInternalContextActions для отключения контекстных кнопок сталкера, например.

Узнаем (сами :)) какой скрипт (или группу скриптов) нам нужно изменить и находим его в

Quote:
Allods Online\data\Packs\LuaCompiledIngame.pak\Interface\Ingame

В моем случае это

Quote:
Allods Online\data\Packs\LuaCompiledIngame.pak\Interface\IngameInternalContextActions\Script.lua

В клиенте он находится в прекомпиленном состоянии (ртфм луа-референс), поэтому придется его сначала декомпилировать, либо найти его уже декомпилированным =)

В моем случае для правильной работы нужна целая группа файлов. По сути все файлы, кроме основного (в котором ведется редактирование) можно было оставить в прекомпиленном состоянии, но я - задро... упорный и декомпильнул их все. Ради интереса - что же там изменилось :)

Далее, пересохраним его уже как аддон с любым именем (я назову OwnInternalContextActions).

В разделе инициализации нашего основного скрипта выгрузим оригинальный InternalContextActions:

Code:
common.StateUnloadManagedAddon( "InternalContextActions" )

Внесем необходимые изменения в сам скрипт и сохранимся -)

Далее создаем AddonDesc.(UIAddon).xdb, заполняем его.

Tip: Не забываем в поле ScriptFileRefs перечислить все файлы в правильной последовательности, помятуя что в каком порядке они идут в списке - в таком порядке и будут грузиться.

Финиш прост - устанавливаем как обычный аддон и радуемся отсутствию надоедливой перезарядки стрел.

Тем кто ничего не понял: вы можете порадоваться по адресу OwnInternalContextActions :))

Я уже пророчу появление декомпиленных TabSelector 'ов с измененным FILTER_DISTANCE на 120 и добавленной строкой common.StateUnloadManagedAddon( "TabSelector" ) в инит-функцию :))))

Способ 2.

Луа-движок при исполнении скрипта по дефолту ищет прекомпиленные скрипты с расширением *.luac по адресу

Quote:
Allods Online\data\Interface\Ingame
и исполняет его вместо *.lua

Таким образом, скомпилировав (lua 5.0.3) основной файл моего примера из 1ого способа в Script.luac и положив его по адресу

Quote:
Allods Online\data\Interface\Ingame\InternalContextActions

Вы добьетесь того же результата.

Но нам же так не интересно, правда?! ;)

Upd: в связи с тем, что движок луа автоматически распознает прекомпилированный ли файл или нет, и работает с ним соотвествующе - достаточно просто переименовать *.lua в *.luac

LUA&HEX

"Так, положено проводить тех. подготовку. Но это тоска зеленая. Как насчет предмета повеселей? Начнем с рукопашной." © The Matrix

Скрестим предыдущий раздел с навыками использования хекс-редактора -)

Вытаскиваем

Quote:
LuaCompiledIngame.pak\Interface\Ingame\TabSelector\ScriptTabSelector.lua

Открываем каким-нибудь WinHex'ом и ищем то что хотим изменить, а именно максимальную дистанцию фильтра таба - FILTER_DISTANCE

В оригинале она выглядела так

Quote:
Global ( "FILTER_DISTANCE", 40 )

А у нас она будет выглядеть так :) Поиском остановимся тут: на букве F, опкоде 46, оффсет 4B

Code:
00000040   6C 6F 62 61 6C 00 04 10  00 00 00 46 49 4C 54 45   lobal......FILTE

00000050   52 5F 44 49 53 54 41 4E  43 45 00 03 00 00 00 00   R_DISTANCE......

00000060   00 00 44 40 04 0D 00 00  00 57 4F 52 53 54 5F 57   [email protected]_W

Итак, объясняю как ЛУА хранит константы в памяти:

(byte) тип константы (оффсет 46 - 0x04 aka string)

(int) длина строковой константы (оффсет 47 - 0x00000010 - не забываем переворачивать, литтл индиан все же =))

(string) сама строковая константа c НУЛЕМ на конце! (оффсет 4B - FILTER_DISTANCE aka 46 49 4C 54 45 52 5F 44 49 53 54 41 4E 43 45 00)

у нас же идет запись в Global, поэтому далее идет значение ей соответствующее

(byte) тип константы (оффсет 5B - 0x03 aka number)

(double) значение number константы, обычно IEEE 754 64-битный double (оффсет 5С - 00 00 00 00 00 00 44 40)

Итого, встаем ВинХексом по адресу 5С и в дата интерпретере видим

Quote:
double: 4,0e+1

что и означает 40 -)) прямо здесь же записываем 120 =))

В окне хекса 00 00 00 00 00 00 44 40 изменится на 00 00 00 00 00 00 5E 40, что символизирует об успешной замене.

Теперь согласно "Способ 2." сохраняем файл в

Quote:
Allods Online\data\Interface\Ingame\TabSelector\ScriptTabSelector.luaс

Угадайте что дальше? Правильно, радоваться жизни.

Кому нравится копаться в ВМ-инструкциях ЛУА рекомендую погуглить на тему "A No-Frills Introduction to Lua 5.0.2 VM Instructions" - много полезного.

З.Ы. Способ пользуется мной с ЗБТ =))

Домашнее задание

1. Декомпилировать все скрипты связанные со старыми аддонами и переписать нужные аддоны из них -)

1.а способом №1

1.б способом №2

2. Переписать ScriptContextPlates.lua и ScriptContextTooltipTemplates.lua сделав MAX_LEVEL_DIFFERENCE == 40 методом правки хекса и подсовывания 2ым способом -)

3. Сказать спасибо, если оказалось нужным.

З.З.Ы. GO, PHANTASMAGOR, GO!

Link to comment
Share on other sites

Guest Phantasmagor

Во первых - спасибо!

Во вторых.. Хм... интересненько. Будем пробовать.

Однако касательно серии HighlightX наводит на плохие мысли возможность подгрузки иконок из клиента...

P.S. Run Forrest, Run... Это АЖ надо говорить, мля.

Link to comment
Share on other sites

Ап! :))

Во-первых, Wait, спасибо за интересное исследование и полезную статью :)

Эх, я думал больше не придётся декомпилировать скрипты... Но, вижу, никто не горит желанием воскресить jCritVisuator и TabSelector? Тогда придётся сделать это самому :)

P.S. "A No-Frills Introduction to Lua 5.0.2 VM Instructions" и вправду очень полезный документ, я бы без него не разобрался с декомпиляцией :)

Link to comment
Share on other sites

в связи с тем, что движок луа автоматически распознает прекомпилированный ли файл или нет, и работает с ним соотвествующе (© lua help) - достаточно просто переименовать *.lua в *.luac.

Link to comment
Share on other sites

  • 6 months later...
Guest Stemnickiy

ктонибудь может сказать по простому что надо сделать, объясните ламеру)

Link to comment
Share on other sites

Guest Pampuchka

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

Link to comment
Share on other sites

Эх, тема, конечно, интересная была, но уже не актуальна. Оба способа уже давно не работают:

Второй способ, как Wait написал выше, был запилен практически сразу, ещё в дремучей АО 1.0.7.14.

Первый способ предлагает выделять скрипт разработчиков в обычный пользовательский аддон. Это тоже не будет работать (кроме самых примитивных и неинтересных случаев), т.к. в пользовательских аддонах, "из соображений безопасности", отключены очень многие функции, которыми пользуются разработчики игры в своих скриптах.

Такие, вот, пироги...

Link to comment
Share on other sites

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  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.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use