Berserker
Posts: 16657
|
До сих пор проблема сделать патчинг в AfterWoG?
Code:
; Code section
section '.code' code readable executable
rd 500; для антивирусов
_OnAfterWoG db 'OnAfterWoG', 0
_OnCustomDialogEvent db 'OnCustomDialogEvent', 0
_OnBeforeBattleAction db 'OnBeforeBattleAction', 0
_OnAfterBattleAction db 'OnAfterBattleAction', 0
_OnBeforeErmInstructions db 'OnBeforeErmInstructions', 0
DLL_PROCESS_ATTACH = 1
match =FALSE, COPYMODE
{
proc TYPHON, hDll, Reason, Reserved
; только при подключении dll к процессу, не к потокам
.if dword [Reason] = DLL_PROCESS_ATTACH
; регистрируем обработчики событий
stdcall [RegisterHandler], OnAfterWoG, _OnAfterWoG
Code:
; ГЛАВНАЯ ПРОЦЕДУРА
proc OnAfterWoG uses esi edi ebx, Event ; после инициализации WoG
; ставим хуки
mov esi, Table_Hooks
.LoopHooks:
mov al, [esi+8]
mov ecx, [esi+4]; тифон
mov edx, [esi]; ориг
mov [edx], al
lea eax, [edx+5]
sub ecx, eax
mov [edx+1], ecx
add esi, 9
cmp esi, End_Table_Hooks
jl .LoopHooks
; Меняем допустимое кол-во существ:
mov esi, ChangeNumMon; таблица адресов
@@:
lodsd
mov dword [eax], MonNum
cmp esi, EndChangeNumMon
jnz @b
; изменения для случайной генерации
mov dword [541159h+1], MonNum-1
mov eax, -0FB0h;
mov dword [541013h+2], 0FB0h
mov [54106Bh+2], eax
mov [54109Ch+3], eax
mov [5410E1h+3], eax
mov [541174h+3], eax
; переносим структур MonNum
mov eax, MonNamesERM; таблица имён и описаний для ERM
mov [733390h], eax
mov [7333C3h], eax
mov [7514F4h], eax
mov [752185h], eax
mov [7521F1h], eax
mov [752F35h], eax
mov eax, 12*MonNum; размер таблицы
mov [7514EFh], eax
mov [75217Ch], eax
; Переносим таблицу ссылок на имена существ и способност
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
23.11.2022 15:44 |
|
XEPOMAHT
Posts: 2356
|
(23.11.2022 15:44)Berserker Wrote: До сих пор проблема сделать патчинг в AfterWoG?
Да. В AfterWoG нет порядка и хуки Тифона могут быть случайно перекрыты любым сторонним кодом из AfterWoG от другого плагина, что небезопасно (особенно когда Патчер или сама ЭРА пытаются ставить свои высокоуровневые хуки поверх тифоновских не понимая, что при забивании нопами испорченного хуком кода портится чуть ли не половина функции, т.к. патчеру или ЭРЕ нельзя сказать, что код испорчен - анализатор кода патчера всегда пытается найти место выхода из хука, перенеся и выполнив при этом затёртый код вместо программиста невзирая ни на что, в итоге приводит к ошибкам в игре, т.к. патчер не видит "грязные" хуки, ему только чистый код подавай, спасибо на том, что патчеру просто можно в той же "грязной" форме сказать, что в этом месте Тифон что-то меняет, но это больше для тех, кто занимается совместимостью с ERA+, а не для самого патчера, память которого наборот забивается несуществующими патчами, о которых патчер только знает, но которые никогда не выполняются). Тем более сейчас, когда в эровском AfterWoG участвуют добрая пловина плагинов к ЭРЕ и будут участвовать ещё и будущие плагины. Отдельный хук после AfterWoG на все тифоновские патчи геройских структур был сделан в Тифоне Мастером ещё начиная с версии 1.0, и все патчи в версии 3.ХХ написаны именно под этот адрес хука, а не под AfterWoG, просто страшно, что ту гиганскую портянку придётся адаптировать под AfterWoG - это ~3300 ассемблерных команд, вручную всё это проверять (тем более, когда многие команды затрагивают саму ЭРУ и HD-мод) - самоубийство для проекта ERA+. Лично я предпочитаю делать по принципу "написал->работает->не трогай", т.к. времени, которое я могу уделять на развитие ERA+, стало не так много.
(This post was last modified: 23.11.2022 16:18 by XEPOMAHT.)
|
|
23.11.2022 16:05 |
|
Berserker
Posts: 16657
|
1) Код Эры выполняется ДО кода всех плагинов. Иными словами, все обработчики OnAfterWoG Эры выполняются ДО любых обработчиков OnAfterWoG плагинов. Перепроверять особо ничего не нужно.
Quote: Отдельный хук после AfterWoG на все тифоновские патчи геройских структур был сделан в Тифоне Мастером ещё начиная с версии 1.0
2) Это костыльный вариант. В TyphonZ я сразу же заменил его на нормальную подписку на события. А игра в кто первее пропатчит одно и то же место обречена на провал. Два плагина, переносящие одну и ту же структуру, и так несовместимы.
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
23.11.2022 16:55 |
|
XEPOMAHT
Posts: 2356
|
(23.11.2022 16:55)Berserker Wrote: Два плагина, переносящие одну и ту же структуру, и так несовместимы.
Хорошо, пример: Тифон подменяет некоторые кривые хуки Эмерала на артефакты. Так же Тифон подменяет хуки например от buttons.era, затирает кое-что из game bug fixes extended.dll, wog_native_dialogs.era, да простит меня Игрик.... Более того, манипуляции Тифона происходят и с HD_WOG.dll. Именно ради совместимости с плагинами Тифон должен выполняться на 100% после ВСЕХ плагинов, устанавливающих хуки в AfterWoG, иначе Тифон не сможет контролировать эти хуки. Да, в чистом безкостыльном виде typnon.dll вообще ни с чем практически несовместим так же точно как в среде ЭРЫ и эровских плагинов не сможет выполнится HotA.dll с просто гигантским количеством изменений в коде игры несмотря даже на все ухищрения патчера.
Если функционал всех плагинов, входящих в базовую комплектацию ЭРЫ и ЭРЫ+, добавить непосредственно в typhon.dll, тогда да - можно будет безболезненно перенести установку всех патчей и хуков в эровкий AfterWoG.
Собственно AfterWoG - для небольших плагинов. Глобальные плагины должны использовать аналог AfterWoG, чтобы работать независимо от того винегрета, который исполняется в AfterWoG и с которым у Тифона всегда будут конфликты. Авторы плагинов не могут/не хотят заниматься совместимостью с ЭРА+ (исключение - Игрик), их не мало, со всеми договориться просто не реально (пишут плагины и программисты из Кореи например), поэтому совместимость приходится делать только в рамках самой ЭРЫ+ с отдельными dll. AfterWoG для этого совершенно не годится в виду своей безконтрольности.
(This post was last modified: 23.11.2022 17:19 by XEPOMAHT.)
|
|
23.11.2022 17:18 |
|
Berserker
Posts: 16657
|
|
24.11.2022 07:29 |
|
Berserker
Posts: 16657
|
|
24.11.2022 07:47 |
|
XEPOMAHT
Posts: 2356
|
(24.11.2022 07:47)Berserker Wrote: у Эра+, как ты сам заметил, по умолчанию слабая совместимость с плагинами и ты тщательно их отбираешь сам.
Пользователей Эра+ это не останавливает. Кто-то например захочет доложить в мод новейший плагин от daemon_n, кто-то может написать свой собственный конкретно под Эру+. Тем более в составе Эры+ есть редакторы монстров и заклинаний, а в будущем возможно будет и редактор городов, что так же привлекает некоторых энтузиастов.
(24.11.2022 07:47)Berserker Wrote: Потому как быстрое и простое решение — вполне. Могу альтернативно сделать просто приватное событие для Era+ вместо AfterWoG. Это мне пара строк кода.
Лично я не понимаю, чем новое эровское событие, которое будет добавлено исключительно для Тифона, будет лучше хука? В данный момент эровские события в Тифоне не используются вообще никак. А "import era" в импортируемых процедурах закомментирован до лучших времён.
|
|
24.11.2022 08:32 |
|
Berserker
Posts: 16657
|
|
24.11.2022 08:53 |
|
XEPOMAHT
Posts: 2356
|
(24.11.2022 08:53)Berserker Wrote: Потому что оно сработает до OnAfterStructsRelocations. А в том событии все структуру уже должны быть перенесены.
Там прикол был в том, что с той же структурой монстров RedirectMemoryBlock не срабатывал из AfterWoG, поэтому у меня нет доверия к эровскому AfterWoG, слишком много уже с этим намучался. RedirectMemoryBlock корректно работал только в момент инициализации самой dll и больше нигде. Причины неизвестны, возможно, что ЭРА всё же копирует адрес на структуру монстров где-то до AfterWoG, а где-то - после, поэтому в эровском диалоге найма монстров не отображались ресурсы, хотя всё остальное - работало, та же самая ситуация была у Маячка в феаноровском плагине на новых монстров, не знаю, как он её разрулил.
Проще уж применять в era.dll результаты RedirectMemoryBlock где-нибудь перед главным меню игры, когда все структуры уже пропатчены. Без специальных событий для плагинов, глобально меняющих структуры игры.
|
|
24.11.2022 09:18 |
|
Berserker
Posts: 16657
|
|
24.11.2022 13:17 |
|
Berserker
Posts: 16657
|
Прямо сейчас для тестов тебе подходит OnReportVersion.
Порядок:
Code:
VfsImport.RunVfs(VfsImport.SORT_FIFO);
VfsImport.RunWatcherA(pchar(GameDir + '\Mods'), 250);
EventMan.GetInstance.Fire('OnAfterVfsInit', NO_EVENT_DATA, 0);
LoadPlugins('era');
EventMan.GetInstance.Fire('OnBeforeWoG', NO_EVENT_DATA, 0);
BinPatching.ApplyPatches(GameDir + '\' + PATCHES_PATH + '\BeforeWoG');
InitWoG;
LoadPlugins('dll');
EventMan.GetInstance.Fire('OnAfterWoG', NO_EVENT_DATA, 0);
BinPatching.ApplyPatches(GameDir + '\' + PATCHES_PATH + '\AfterWoG');
EventMan.GetInstance.On('OnGenerateDebugInfo', OnGenerateDebugInfo);
EventMan.GetInstance.Fire('OnReportVersion');
AssignVersionsInfoToCredits;
EventMan.GetInstance.Fire('OnAfterStructRelocations');
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
24.11.2022 16:34 |
|
Archer30
Posts: 1175
|
|
17.12.2022 10:20 |
|
Berserker
Posts: 16657
|
|
17.12.2022 21:16 |
|