Guest wait Posted February 25, 2010 Share Posted February 25, 2010 Чтобы пост не потерялся в недрах форума - создам новую тему. История Итак, после патча перестал работать ставший уже привычным способ подгрузки аддонов, о чем нам любезно сообщил 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......FILTE00000050 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! Quote Link to comment Share on other sites More sharing options...
Guest Phantasmagor Posted February 25, 2010 Share Posted February 25, 2010 Во первых - спасибо! Во вторых.. Хм... интересненько. Будем пробовать. Однако касательно серии HighlightX наводит на плохие мысли возможность подгрузки иконок из клиента... P.S. Run Forrest, Run... Это АЖ надо говорить, мля. Quote Link to comment Share on other sites More sharing options...
SLA Posted February 28, 2010 Share Posted February 28, 2010 Ап! ) Во-первых, Wait, спасибо за интересное исследование и полезную статью Эх, я думал больше не придётся декомпилировать скрипты... Но, вижу, никто не горит желанием воскресить jCritVisuator и TabSelector? Тогда придётся сделать это самому P.S. "A No-Frills Introduction to Lua 5.0.2 VM Instructions" и вправду очень полезный документ, я бы без него не разобрался с декомпиляцией Quote Link to comment Share on other sites More sharing options...
kosh Posted March 1, 2010 Share Posted March 1, 2010 надо бы СВНчик все же пустить в оборот... Quote Link to comment Share on other sites More sharing options...
Guest wait Posted March 1, 2010 Share Posted March 1, 2010 в связи с тем, что движок луа автоматически распознает прекомпилированный ли файл или нет, и работает с ним соотвествующе (© lua help) - достаточно просто переименовать *.lua в *.luac. Quote Link to comment Share on other sites More sharing options...
merlok Posted March 2, 2010 Share Posted March 2, 2010 чето у меня способ 2 неработает (способ 1 для меня неактуален после нового патча) у когото работает? Quote Link to comment Share on other sites More sharing options...
Guest wait Posted March 2, 2010 Share Posted March 2, 2010 оба работают, лично пользуюсь. Quote Link to comment Share on other sites More sharing options...
Guest wait Posted March 9, 2010 Share Posted March 9, 2010 Способ 2 пофикшен патчем 1.0.7.14. Quote Link to comment Share on other sites More sharing options...
Guest Stemnickiy Posted October 1, 2010 Share Posted October 1, 2010 ктонибудь может сказать по простому что надо сделать, объясните ламеру) Quote Link to comment Share on other sites More sharing options...
Guest Pampuchka Posted October 1, 2010 Share Posted October 1, 2010 тема стара как мир, многое уже поменялось, но если вдруг, есть даже призрачная надежда возродить старые моды(а вместе с ними и русик для иностранных версий ), то это будет не просто здорово, а очень очень восхитительно Quote Link to comment Share on other sites More sharing options...
SLA Posted October 2, 2010 Share Posted October 2, 2010 Эх, тема, конечно, интересная была, но уже не актуальна. Оба способа уже давно не работают: Второй способ, как Wait написал выше, был запилен практически сразу, ещё в дремучей АО 1.0.7.14. Первый способ предлагает выделять скрипт разработчиков в обычный пользовательский аддон. Это тоже не будет работать (кроме самых примитивных и неинтересных случаев), т.к. в пользовательских аддонах, "из соображений безопасности", отключены очень многие функции, которыми пользуются разработчики игры в своих скриптах. Такие, вот, пироги... Quote Link to comment Share on other sites More sharing options...
Guest Pampuchka Posted October 3, 2010 Share Posted October 3, 2010 жалко, очень жалко(( Ну что ж надежда умирает последней Quote Link to comment Share on other sites More sharing options...
Recommended Posts