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