Suft, раньше я конвертировал разные видео в файлы формата "mp4" в "bik". Не было свечения кнопок.
Скинь мне оригинальный видео файл
(08.08.2024 00:31)Berserker Wrote: Нельзя писать внутрь моста/переходника хука. Для установки перехвата можно использовать HiHook патчера patcher_x86.dll или API из Эры:
Я не собираюсь модифицировать в era.dll. Мой плагин на ассемблер только берёт недокументированные функции вызова из ERA.DLL. Чтобы плагин легко вызывал функции era.dll.
Как прям проникновение в era.dll, еще глубже в функции и запоминает адрес процедур
.
(08.08.2024 00:31)Berserker Wrote: function Splice (OrigFunc, HandlerFunc: pointer; CallingConv: integer; NumArgs: integer; {n} CustomParam: pinteger; {n} AppliedPatch: ppointer): pointer; stdcall;
Original function address (OpenBik first command address)
Your handler address
Calling convention of OpenBik function:
// Left-to-right
CONV_PASCAL = CONV_LAST,
// Left-to-right, first three arguments in EAX, EDX, ECX
CONV_REGISTER = -102,
// Right-to-left, caller clean-up
CONV_CDECL = -103,
// Right-to-left
CONV_STDCALL = -104,
// Right-to-left, first argument in ECX
CONV_THISCALL = -105,
// Right-to-left, first two arguments in ECX, EDX
CONV_FASTCALL = -106,
Number of original function arguments, including those in registers
Two NULL arguments
Your handler must have STDCALL convention and accept void* OrigFunc argument + all other arguments in the same way, as original function would accept
"Splice" нет описания и примеров с результатами. Большая проблема, что вы написали полностью на английском документации, а не на русском языке. Отечественные Моддеры могут не владеть английском языком.
(08.08.2024 14:32)Berserker Wrote: Ассемблер здесь не помеха. Я скоро выпущу 3.9.16 с изменённым исправленным HookCode. Тебе двух функций HookCode/Splice хватило бы почти на все нужды, при том, что они умеют строить мосты и выполнять затёртый код. У меня такое ощущение, что автор плагина не знал, как это сделать корректно и потому влез внутрь поста splice-перехвата Эры. А нужно было всего-то установить другой Splice перехват поверх оригинального. В этом и высокоуровневость, что одну и ту же функцию, можно перехватить несчётное количество раз.
В общем, не стесняйтесь детально спрашивать, ибо костыли потом аукаются всем )
Помни, известно, что "работает - не трогай!", чтобы плагин работал. Но, вы пытаетесь рефакторинг кода, ради поменять старую функцию хука "Core.Hook" на новый хук "ApiJack.HookCode". Эта вызывает несовместимость плагина, из-за не сталкивания с ассемблер, для входа внутрь и глубже. Вот появился плагин новой версии 1.6, где добавлена поддержка платформы Эра новой версии и добавлена проверка на некорректность, вызывает вызов "MessageBox", а затем вызов ассемблера "INT 3".
(25.07.2024 11:46)XEPOMAHT Wrote: Вчерашняя версия era.dll 3.9.15 портит (или не даёт записывать) структуру видеоролика по адресу 694D00h из-за чего становится невозможно воспроизведение вступительных роликов перед главным меню (т.к. исходных кодов от плагина Video playback in BIK format.dll у меня нет, чтобы исправить конфликт хуков с era.dll). В общем опять ERA+ остётся на era.dll версии 3.9.14.
(30.07.2024 01:10)Berserker Wrote: Плагин вылетает на последней Эре (буквально стало на 3.9.15), но причину с ходу не вижу.
Последняя dll Эры:
https://dropmefiles.com/wMjRO
(08.08.2024 17:18)XEPOMAHT Wrote: (08.08.2024 14:32)Berserker Wrote: ибо костыли потом аукаются всем )
Да, конфликтые участки кода между разными dll часто решаются в одностороннем порядке. Т.к. ждать обновлений со стороны других авторов dll - слишком долго. Люди могут месяцами не выходить на связь, тот же Игрик, например, давно не появляется - его плагины в случае чего обновить будет некому.
Никому не пришло в голову, что главная причина в замене хука. Надо было откат на старый хук ""Core.Hook"" и проверить, что плагин заработал.
(08.08.2024 17:18)XEPOMAHT Wrote: Особенно критично в работе геройского ИИ, который на XXXL-картах сам по себе жутко тормозной. Те же участники HotA Crew делали форк Патчера для внутреннего использования с реализацией ускоренных хуков, но в свет эта инициатива так не вышла - Патчер как был медленным, так медленным и остаётся, особенно на моём старом ПК, где всё это очень заметно, несмотря на низкие системные требования оригинальной игры (имено поэтому Тифон подменяет/убирает кучу тормозящих игру воговских и эровских хуков во время игрового сражения на поле боя, чтобы не было 1-5 секундных задержек во время действий отрядов, т.к. комфорт от игрового процесса для меня важнее, чем сторонний функционал, который всё равно в ERA+ никак не используется - часть ERM-триггеров принесены в жертву ради производительности в ERA+, увы).
Насчет, у ИИ очень медленный ход действий: вы посмотрите мой подпись "ИИ ускорение", но, там первая версия.
В МоР 3.15 последней версии есть кнопка на два режима "ИИ ускорение" и "ИИ турбо".
В "ИИ турбо" вырезал цикл, стало очень шустрее и у ИИ без изменений поведений. В прошлом году, в феврале, я поделился патчингом с "daemon_n", чтобы он создал плагин и в сборке "HoMM3 ERA Launcher Edition". Он сказал, что "это функция виртуальных битв ИИ".
Значит, причина в ИИ, очень долго думает из-за "виртуальных битв ИИ".
---
Насчет, остальной задержки во время игрового сражения: попробуй закрыть браузер и дискорд, плюс антивирус, они жрут кеш-память процессора и ОЗУ.
Давно, помню, было в Cosmic Forgre -> Редакторе Локации при нажатии элемента для триггера всплывалось окно, но задержка на 2 секунды. Решил выложить видео в youtube, в комментариях писали, что на старом компьютере Windows XP, при нажатии элемента - мгновенно открывается окно "динамический триггер".
Не может быть, я решил у себя исследовать, пробовал закрыть программу "Диспетчер Задач", "Opera". Пробовал нажать элемент и окно "Динамический объект триггер" всплывалось за 0.1 секунду, чудо!. А затем, через несколько дней, снова повторилась проблема. Снова пробовал закрыть Opera, не помогло. Закрыл "диспетчер задач" - помогло. А потом, снова, не помню, закрыл "диспетчер задач" - не помогло, и закрыл еще "Opera" - помогло. Похоже программа кушает слишком много кеш-память процессора.
У меня Windows 7 использую "Гибернации".
(09.08.2024 11:14)XEPOMAHT Wrote: (08.08.2024 21:36)Berserker Wrote: Адреса функций получать у тебя ведь выходит через GetProcAddr?
Нет, не знаю как этим поьзоваться. Доступ к другим dll в Тифоне работает только через секцию import:
Code:
import era,\
GetVersion, 'GetVersion'
;RedirectMemoryBlock, 'RedirectMemoryBlock'
import patcher,\
GetPatcher, '_GetPatcherX86@0'
У меня плагин "Воспроизведение видео в формате BIK", использую вызов сначала GetModuleHandleA, а потом GetProcAddress:
поделюсь исходным кодом на ассемблере
Code:
mov eax,dword[63A230h];GetModuleHandleA
.if eax
push String_era_dll;db 'era.dll',0
call eax
.if eax
mov ecx,dword[63A22Ch];GetProcAddress
.if ecx
push StringGetERA_API_ReadStrFromIni;db 'ReadStrFromIni',0
push eax
call ecx
.if eax
sub esp,400h
mov edx,esp
push edx
push edx;ADDRES
push Stringheroes3_INI;"heroes3.ini"
push StringSettings;Settings
push StringBinkSoundType;SHOWINTRO
call eax
pop eax
add esp,400h
.if word[eax] = 31h; 1
mov dword[BinkSoundType_Bool],1
.endif;
.endif;eax
.endif;ecx
.endif;eax
.endif;eax