(08.08.2024 14:32)Berserker Wrote: всё это чёрная магия к костылями )
Да, увы. Приходится изгаляться, т.к. исходных кодов самой игры у моддеров нет.
(08.08.2024 14:32)Berserker Wrote: Хуки делятся на 2 типа: call команда прямо в месте установки или jmp в начале функции.
Да больше их, минимум раза в 2. Тифон может ставить хуки на любое место, где происходит переход:
1. Вызов функции
2. Длинный прыжок
3. Длинный прыжок с условиями (после проверок чего-либо) - только в Патчере-форке, который так и не выложили, т.к. пилили уже участники HotA Crew под себя, естественно в era.dll этого нет
4. Хук непосредственно на таблицу с адресами кейсов - подмена как конкретного адреса на функцию, так и всего кейса целиком - Бараторч не стал переносить это в Патчер, а выполняет средствами самого HD-мода. В era.dll такое извращение вряд ли появится, поэтому Тифон производит подобные хуки самостоятельно.
(08.08.2024 14:32)Berserker Wrote: Вторая — это высокоуровневая замена всей оригинальной функции.
Это как раз и ломает совместимость. Бараторч уж очень любит переносить функции целиком, в итоге - костыли, костыли и ещё раз костыли, чтобы Тифон мог поменять что-либо в перенесённых HD-модом функциях игры. Под ЭРУ такой вид перехвата кода - очевидное зло.
(08.08.2024 14:32)Berserker Wrote: Обработчики перехватов соответственно тоже бывают двух типов: первые получают указатель на контекст (регистры, адрес возврата на момент вызова хука) и возвращают флаг того, нужно ли выполнить затёртый код. Второй тип обработчиков — это новая реализация функции. У них stdcall соглашение и все те же аргументы, что и у оригинальной функции, но первый аргумент — адрес моста к оригинальной функции, то есть как бы адрес оригинальной функции, который можно использовать для её вызова.
В Тифоне каждый хук подгоняется вручную под конкретное место. То, что делает Патчер после хука, не контролируется моддером, я же привык знать то, превратится код в тыкву после установки хука или нет. Тем более Тифон должен иметь доступ ко всем данным в самом хуке - к стеку и регистрам БЕЗ каких-либо переходников, чтобы код в самом хуке выглядел бы 1 в 1 так же как если бы он находился в коде игры без хука.
(08.08.2024 14:32)Berserker Wrote: Тебе двух функций HookCode/Splice хватило бы почти на все нужды, при том, что они умеют строить мосты и выполнять затёртый код.
Вообще не хватит. Тифон иногда вообще выкидывает затёртый код, подменяя фрагметы содовского кода. Да что там. Есть содовские функции, у которых Тифон полностью убирает начало, есть функции, у которых Тифон деляет из 1 начала несколько разных начал (совпадают только концовки) и весь этот бепредел творится в содовском коде только ради того, чтобы не переписывать портянки ассемблерного кода. В коде Тифона тонна низкоуровневых извращений. А переписывать с 0 более 500 тифоновских хуков я точно не буду.
А самое главное - СКОРОСТЬ хуков Патчера. Хуки Тифона выполняются напрямую без посредников, ставятся максимально быстро, содержат в себе готовый затёртый код без необходимости его генерировать при каждом запуске игры и нопить код после хука (Тифон оставляет там нечитабельную кашу, т.к. этот мусор никогда не исполняется). Особенно критично в работе геройского ИИ, который на XXXL-картах сам по себе жутко тормозной. Те же участники HotA Crew делали форк Патчера для внутреннего использования с реализацией ускоренных хуков, но в свет эта инициатива так не вышла - Патчер как был медленным, так медленным и остаётся, особенно на моём старом ПК, где всё это очень заметно, несмотря на низкие системные требования оригинальной игры (имено поэтому Тифон подменяет/убирает кучу тормозящих игру воговских и эровских хуков во время игрового сражения на поле боя, чтобы не было 1-5 секундных задержек во время действий отрядов, т.к. комфорт от игрового процесса для меня важнее, чем сторонний функционал, который всё равно в ERA+ никак не используется - часть ERM-триггеров принесены в жертву ради производительности в ERA+, увы).
(08.08.2024 14:32)Berserker Wrote: У меня такое ощущение, что автор плагина не знал, как это сделать корректно и потому влез внутрь поста splice-перехвата Эры. А нужно было всего-то установить другой Splice перехват поверх оригинального. В этом и высокоуровневость, что одну и ту же функцию, можно перехватить несчётное количество раз.
Да, Тифон никогда не лезет в чужие splice-перехваты, т.к. это небезопасно - любое обновление может испортить код. Тифон действует по-разному, в зависимости от места splice-перехвата, часто Тифон просто выполяет свой код на 1 шаг в коде раньше или позже, чем запускается splice-перехват Патчера. Особенно печально бывает, когда кто-то перехватывает сразу первый байт функции, а сама функция вызывается плагинами - тут уже приходится применять костыли, включая перенос кода из самих плагинов непосредственно в Тифон, чтобы он исполнялся вместе с Тифоном, т.к. ассемлерного доступа к Патчеру на базе Тифона увы нет.
(08.08.2024 14:32)Berserker Wrote: ибо костыли потом аукаются всем )
Да, конфликтые участки кода между разными dll часто решаются в одностороннем порядке. Т.к. ждать обновлений со стороны других авторов dll - слишком долго. Люди могут месяцами не выходить на связь, тот же Игрик, например, давно не появляется - его плагины в случае чего обновить будет некому.