Wake of Gods Forum | Форум Во Имя Богов

Full Version: Typhon v. 2.9
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
Mahno, в настоящее время никак. В Эре 2.9.4 через !!RD нужно будет реализовать свой алгоритм работы с альтерветками или использовать готовый мод, который постараемся сделать.
(28.12.2019 23:52)Berserker Wrote: [ -> ]Mahno, в настоящее время никак. В Эре 2.9.4 через !!RD нужно будет реализовать свой алгоритм работы с альтерветками или использовать готовый мод, который постараемся сделать.

Лучше буду ждать готовый мод)А то мне многое не понятно, а у вас голова сильно варит
Berserker, я уже не первый раз слышу про !!RD и !?FU(OnOpenRecruitDlg); и иже с ним, но так и не нашёл по ним документации.
Есть где-нибудь по ним небольшая справка?
Первая мысль, что пришла в голову с предполагаемым новым !!RD, так это сделать окно найма для 3 или 4 существ для тех существ, которые будут именть несколько апгрейдов с некоторыми скриптами, в т.ч. и оригинальными воговскими.
daemon_n, в era changelog.txt всё, что в Help\Era manual. В 2.9.3 вылетает, где-то я недавно загружал обновлённую dll.
Berserker, да в чейнджлогп видел, но так и не понял, если честно. Видимо, пока не моё)
Лол) колесуны))) вспомнили же)
Эра 2.9.4 конфликтует по отзывам с Тифоном: не отображается плата в ресурсах у монстров. МОР, не подскажешь, где мы разминулись?

    ApiJack.StdSplice(Ptr($4B0770), @Hook_OpenRecruitMonsDlg, ApiJack.CONV_THISCALL, 1);
    ApiJack.HookCode(Ptr($70DD4A), @Hook_OpenTownDwelling);
    // Prevent ESI (PTown) := EAX override. Exchange ESI, EAX instead
    Core.p.WriteDataPatch(Ptr($51FB9F), ['9690']);
    ApiJack.HookCode(Ptr($51FBB5), @Hook_OpenTownDwellingFromKingdomOverview);
    ApiJack.HookCode(Ptr($5DD2FC), @Hook_OpenTownHallDwelling);
    ApiJack.HookCode(Ptr($5D4271), @Hook_OpenTownHordeDwelling);
    ApiJack.HookCode(Ptr($5510D2), @Hook_UpdateAdvMapInRecruitMonsDlg);
    ApiJack.HookCode(Ptr($550EB7), @Hook_RecruitMonsDlgMouseClick);
    ApiJack.HookCode(Ptr($5DD3C8), @Hook_TownHallMouseClick);
    ApiJack.HookCode(Ptr($550860), @Hook_RecruitDlgRecalc);
    ApiJack.HookCode(Ptr($551089), @Hook_RecruitDlgAction);
    ApiJack.HookCode(Ptr($550989), @Hook_AllowZeroCost);
    ApiJack.HookCode(Ptr($5509A4), @Hook_AllowZeroResourceCost);
(28.12.2019 23:15)Mahno Wrote: [ -> ]Как открыть окно найма кликом на такой-то области?В Эре в версии 2.9.3. с тифоном не работают клики на найм существ в форте и выбор веток существ

Исправлено костылём. Просьба к Берсеркеру в следующих версиях эры перехват на все воговские триггеры больше не изменять.

(14.01.2020 01:51)Berserker Wrote: [ -> ]Эра 2.9.4 конфликтует по отзывам с Тифоном: не отображается плата в ресурсах у монстров. МОР, не подскажешь, где мы разминулись?

В течении дня попробую поискать.
Дедовский способ: беру первые четыре цифры из адреса твоего хука и ищу в файле Тифона.
Единственный близкий результат - ChangeNumMon, один из адресов - 550826h. Близко к
Quote:ApiJack.HookCode(Ptr($550860), @Hook_RecruitDlgRecalc)
Но всё равно далековато. Эры последней нет, посмотреть не могу. Если не оно - не знаю.
XEPOMAHT, зачем Тифон перехватывает ProcessErm? В Эре она вся переписана. Полностью замещена. Это же ядро движка.
MOP, понял, спасибо большое в любом случае.
(14.01.2020 15:33)Berserker Wrote: [ -> ]зачем Тифон перехватывает ProcessErm? В Эре она вся переписана. Полностью замещена. Это же ядро движка.

Чтобы на воговских триггерах исполнять код Тифона. Сама Эра при этом не перехватывается, ничего в ней Тифон не изменяет, т.к. это и не нужно.
XEPOMAHT, в Эре это не так делается. Да и вообще в любом расширяемом программном продукте. Вместо таких перехватов используется подписка на события. Скажем, в Эре это RegisterHandler (адрес функции, 'название события') и обработчик stdcall, принимающий один указатель на непрозрачную структуру данных. Всё. Подписались на событие такое-то, скажем OnHeroScreenMouseClick, выполнили код. Или можешь подробнее описать, что ещё нужно Тифону?

Причём обработчики плагинов выполняются до ЕРМ, можно что угодно перезаписать. Не хочется именованных событий и хочется старые триггеры по номерам?

RegisterHandler(обработчик, 'OnTrigger 30303'); например.
Чтобы получить адрес экспортируемой era.dll функции нужно вызвать LoadLibrary('era.dll') и затем GetProcAddress(дескриптор библиотеки era.dll, имя функции).
(14.01.2020 16:13)Berserker Wrote: [ -> ]RegisterHandler(обработчик, 'OnTrigger 30303'); например.
Чтобы получить адрес экспортируемой era.dll функции нужно вызвать LoadLibrary('era.dll') и затем GetProcAddress(дескриптор библиотеки era.dll, имя функции).

Готового кода под эту вещь у меня нету, использую только то, что есть (не программист я, не потянуть с нуля создание функций LoadLibrary и GetProcAddress, примерно-похожего кода по которым у меня всё равно нету - в движке Третьих Героев это не используется, да и ЭРА списки адресов своих функций не записывает в статическую память, где бы их легко можно было бы читать без всяких лишних вызовов LoadLibrary и GetProcAddress).

(14.01.2020 01:51)Berserker Wrote: [ -> ]    ApiJack.StdSplice(Ptr($4B0770), @Hook_OpenRecruitMonsDlg, ApiJack.CONV_THISCALL, 1);

Пока что единственное решение вышеупомянутого бага в Тифоне - убирать данный перехват для восстановления показов ресурса в окне найма, больше ничего найти не удалось. Оригинальная функция по номеру монстра берёт из структуры стоимость ресурса, но заменённая функция из ERA имеет абсолютно другой вид и не использует вызовов родных геройских функций (по крайней мере таких я там не нашёл, так только пробежался отладчиком по коду - а он не маленький, без бутылки не разберёшься).
Quote:Пока что единственное решение вышеупомянутого бага в Тифоне - убирать данный перехват для восстановления показов ресурса в окне найма, больше ничего найти не удалось. Оригинальная функция по номеру монстра берёт из структуры стоимость ресурса
Уже теплее.

Как я понял, Тифон структуру с информацией о монстрах расширил. Всё, что нужно сделать, это один раз вызвать функцию из era.dll: RedirectMemoryBlock(7D0C90, старый размер массива с инфой о монстрах, новый адрес массива).

MonTable rb sizeof._Creature_*MonNum; структура существ (главная)
Вот эта таблица в тифоне.

В самом же коде Тифона MOP импортирует много функций.

data import
; Импортируемые процедуры
    library kernel32,'kernel32.dll'

    import kernel32,\
CreateFileA,'CreateFileA',\
GetFileSize, 'GetFileSize',\
VirtualAlloc, 'VirtualAlloc',\
ReadFile, 'ReadFile',\
CloseHandle, 'CloseHandle',\
VirtualFree, 'VirtualFree',\
WriteFile, 'WriteFile'

end data

Точно также можно импортировать из Эры несколько функций.
Попробуй

library era, 'era.dll'
import era, RegisterHandler, 'RegisterHandler', RedirectMemoryBlock, 'RedirectMemoryBlock'

А в functions.asm в ; ГЛАВНАЯ ПРОЦЕДУРА
нужно будет сделать так:

; Уведомляем Эру о том, что таблица существ перенесена
push MonTable
push sizeof._Creature_*197
push 7D0C90
call RedirectMemoryBlock

; Вместо хука на ProcessErm нужно подписаться на событие, но это уже позже, давай для начала с этим багом разберёмся.
(14.01.2020 19:46)Berserker Wrote: [ -> ]; Уведомляем Эру о том, что таблица существ перенесена
push MonTable
push sizeof._Creature_*197
push 7D0C90
call RedirectMemoryBlock

Не работает. Тифон от такого вызова падает при загрузке игры:

Code:
Failed to write data at 230390.
EIP: Typhon.BD0E8. Code: C0000005

> Registers
EAX: 00000000 (int: 0)
ECX: 0022FFB0 (int: 2293680, pint: 0x773D208B = 2000494731)
EDC: Ntdll.E4F4 (int: 2089870580, pint: 0x24A48DC3 = 614763971)
EBX: 7FFD9000 (int: 2147323904, pint: 0x00000000)
ESP: 0022FFB4 (int: 2293684, pint: 0x0D171819 = 219617305)
EBP: 0022FFF0 (int: 2293744, pint: 0x00000000)
ESI: 00000000 (int: 0)
EDI: 00000000 (int: 0)

Но если эровский хук на 4B0770 убрать, то падения уже нет. В общем пока проблема с Hook_OpenRecruitMonsDlg не будет решена, Тифон будет отключать Hook_OpenRecruitMonsDlg.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
Reference URL's