Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

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


Гость wait

Рекомендуемые сообщения

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

История

Итак, после патча перестал работать ставший уже привычным способ подгрузки аддонов, о чем нам любезно сообщил 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!

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

Ап! :))

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

чето у меня способ 2 неработает

(способ 1 для меня неактуален после нового патча)

у когото работает?

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

жалко, очень жалко(( Ну что ж надежда умирает последней :)

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования