Current time: 22.11.2024, 02:06 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
ERA III
Author Message
Berserker Offline
Administrators

Posts: 16657
Post: #2116

До сих пор проблема сделать патчинг в 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
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #2117

(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
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #2118

1) Код Эры выполняется ДО кода всех плагинов. Иными словами, все обработчики OnAfterWoG Эры выполняются ДО любых обработчиков OnAfterWoG плагинов. Перепроверять особо ничего не нужно.

Quote: Отдельный хук после AfterWoG на все тифоновские патчи геройских структур был сделан в Тифоне Мастером ещё начиная с версии 1.0
2) Это костыльный вариант. В TyphonZ я сразу же заменил его на нормальную подписку на события. А игра в кто первее пропатчит одно и то же место обречена на провал. Два плагина, переносящие одну и ту же структуру, и так несовместимы.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
23.11.2022 16:55
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #2119

(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
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #2120

XEPOMAHT, плагины ведь грузятся в порядке сортировки по алфавиту. Почему бы не назвать typhon.dll ztyphon.dll или zztyphon.dll? )


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
24.11.2022 07:29
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #2121

(24.11.2022 07:29)Berserker Wrote:  Почему бы не назвать typhon.dll ztyphon.dll или zztyphon.dll? )

Ну вдруг кто-то захочет добавить плагин с именем zzzzz.dll? Или плагин на русском/японском/китайском языке, который может грузится ещё позже? Было бы что-то аналога list.txt, в котором содержался бы список совместимых с модом плагинов в соответствующем порядке загрузки, но это во первых неудобно, во вторых вряд ли стоит ради одного единственного typhon.dll. Ну или создать новую папку или расширение для плагина, который будет гарантированно на все 100% выполнять код в AfterWoG после любых *.dll и *.era. Правда тоже зачем? Лучше оставить как есть - в тифоновском хуке сразу после AfterWoG.
(This post was last modified: 24.11.2022 07:43 by XEPOMAHT.)
24.11.2022 07:42
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #2122

XEPOMAHT, у Эра+, как ты сам заметил, по умолчанию слабая совместимость с плагинами и ты тщательно их отбираешь сам. Потому как быстрое и простое решение — вполне. Могу альтернативно сделать просто приватное событие для Era+ вместо AfterWoG. Это мне пара строк кода.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
24.11.2022 07:47
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #2123

(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
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #2124

Потому что оно сработает до OnAfterStructsRelocations. А в том событии все структуру уже должны быть перенесены.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
24.11.2022 08:53
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #2125

(24.11.2022 08:53)Berserker Wrote:  Потому что оно сработает до OnAfterStructsRelocations. А в том событии все структуру уже должны быть перенесены.

Там прикол был в том, что с той же структурой монстров RedirectMemoryBlock не срабатывал из AfterWoG, поэтому у меня нет доверия к эровскому AfterWoG, слишком много уже с этим намучался. RedirectMemoryBlock корректно работал только в момент инициализации самой dll и больше нигде. Причины неизвестны, возможно, что ЭРА всё же копирует адрес на структуру монстров где-то до AfterWoG, а где-то - после, поэтому в эровском диалоге найма монстров не отображались ресурсы, хотя всё остальное - работало, та же самая ситуация была у Маячка в феаноровском плагине на новых монстров, не знаю, как он её разрулил.

Проще уж применять в era.dll результаты RedirectMemoryBlock где-нибудь перед главным меню игры, когда все структуры уже пропатчены. Без специальных событий для плагинов, глобально меняющих структуры игры.
24.11.2022 09:18
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #2126

Да работает он, работает. Сразу после вызова по функции GetRealAddr можно проверить. Предлагаю всё же выделенное событие. Тебе там правок-то буквально строк 5.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
24.11.2022 13:17
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #2127

(24.11.2022 13:17)Berserker Wrote:  Предлагаю всё же выделенное событие. Тебе там правок-то буквально строк 5.

Если такое событие появится в следующей версии ЭРЫ, то можно будет попробовать.
24.11.2022 15:51
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #2128

Прямо сейчас для тестов тебе подходит 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
Find all posts by this user Quote this message in a reply
Archer30 Offline
Moderators

Posts: 1175
Post: #2129

Some mod makers are asking for a correction for the non-working !?FU(OnKeyPressed)&i^key^=(KEY_F12) Rolleyes


Latest ERA mods and scripts in development - My GitHub
17.12.2022 10:20
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #2130

F12 and F11 have special meaning and are handled by ERA for reload scripts and extract scripts feature.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
17.12.2022 21:16
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group