Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlinefeanor  
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 15 мар 2016, 16:23
Пол: Не указан
Поблагодарили: 15 раз.

Re: Как создать плагин для HD мода

Сообщение feanor » 28 янв 2019, 14:47

Цитата:
Похоже, все возможности Комплита (SoD+AB) были заложены уже в содовский экзешник.

Угу, это было сделано для того, чтобы если поставить честно купленный SoD на не менее честно купленный AB, то можно было бы играть и с Конфлюксом, и со сборниками. Плюс с двойным набором кампаний.
В реальности блокируемый ABшный контент разлачивается просто созданием файла h3blade.exe в папке героев, так что о том, что Сод бывает и просто Сод, все уже и думать забыли.

А так - да, и Хота, и Вог базируются на SoD 3.2, Комплит по какой-то причине оказался тупиковой ветвью.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 28 янв 2019, 19:12

feanor писал(а):

В реальности блокируемый ABшный контент разлачивается просто созданием файла h3blade.exe в папке героев, так что о том, что Сод бывает и просто Сод, все уже и думать забыли.


Да, только поиск по IDA почему-то не дает H3Blade нигде.

feanor писал(а):

А так - да, и Хота, и Вог базируются на SoD 3.2, Комплит по какой-то причине оказался тупиковой ветвью.


Тут все очевидно, если вспомнить, что писал Слава Сальников в одном из README, что у него есть Дыхание, но нет Клинка (а Комплита никакого еще не было). Слава начал исследования экзешника, а все, что после было обнаружено по Героям - продолжение исследований Славы.

Самое интересное, что из содовского экзешника можно сделать даже AB (не СоД+AB, то есть Комплит, а именно AB). Собственно, уже проверил, выставив нужную константу в 1. В СоД карты играть не хочет :), ров у Цитадели не создает, урон от мин Башни меньше, лорд Хаарт доступен в выборе для рандомных карт. Все как положено.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 28 янв 2019, 19:23

feanor писал(а):

А так - да, и Хота, и Вог базируются на SoD 3.2


И HD мод тоже. Версия 4.0 у экзешника не должна вводить в заблуждение. Видимо, Бараторч 3.2 исправил на 4.0. Меня это когда-то сбило с толку.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 01 фев 2019, 12:34

Хотел бы попросить помощи в реализации интерфейсных плюшек, которые есть в Хоте, но которых совершенно незаслуженно лишены игроки в СОД:
1. Обмен между героями в городе, без кнопки в интерфейсе, просто по горячей клавише "E"
2. Отображение количества охраны при атаке улья.
3. В бою, в окне состояния, пересчет урона в количество существ, в скобках.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 01 фев 2019, 13:44

Все три пункта довольно легко реализуются. Самый "сложный" - это первый. А вот на пунктах 2 и 3 Вы бы и сами могли потренироваться в написании плагинов :smile1:
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 01 фев 2019, 14:30

AlexSpl писал(а):

А вот на пунктах 2 и 3 Вы бы и сами могли потренироваться в написании плагинов :smile1:


Очень бы этого хотелось, но к сожалению, я как та собака в анекдоте - чужой код понимаю, а свой писать не могу.
Я все еще не понимаю простейшие вещи:
а) Как найти адрес на который ставить хук
б) Как получить нужные значения, например, описание охраны для банка в текстовом или числовом виде
в) Как изменить текст диалога?
и т.д. и т.п.

Могу только протестировать и отладить код(псевдокод).
Все-таки сказывается что я не совсем программист :).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 01 фев 2019, 16:32

Посмотрел код. В HD моде обработку нажатия на клавишу в окне города выполняет функция из HD_SOD.dll, поэтому снова нужно писать код, который бы патчил dll. Можно, например, воспользоваться хуком из примера выше (тот, который патчил HW_SOD.dll). Что нужно: добавить новую проверку на нажатие клавиши "Е" и показать диалог встречи героев. igrik уже показывал, как это сделать с помощью ERM. Из его кода берём необходимые адреса для нашего плагина.

Вот код, который проверяет нажатие на клавишу:

Изображение

Нужно:
1. Добавить сюда новое условие (проверку на нажатие клавиши "E");
2. Вызвать диалог Грамотности;
3. Вызвать диалог встречи героев.

Героев получаем из _TownMgr_ (town->up_hero_id, town->down_hero_id).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 01 фев 2019, 18:17

Короче, есть ещё один нюанс: функция встречи героев есть метод класса advManager и после закрытия диалога она возвращает на экран приключений (естественно, с багами), поэтому с ней тоже что-то делать нужно (самому писать аналогичную? если кто уже сталкивался, подскажите). Не всё так просто, как казалось на первый взгляд :smile5:

 
Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "HotA\homm3.h"

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

int __stdcall newTownShortcut(LoHook* h, HookContext* c)
{
    if ( c->edx == 0x12 ) {
        _Hero_* hero1 = o_GameMgr->GetHero(o_TownMgr->town->up_hero_id);
        _Hero_* hero2 = o_GameMgr->GetHero(o_TownMgr->town->down_hero_id);
       
        if ( *(int*)hero1 && *(int*)hero2 ) {
            CALL_2(int, __fastcall, 0x4A25B0, hero1, hero2);
            CALL_3(int, __thiscall, 0x4AAA60, o_AdvMgr, hero1, hero2); 
        }
    }

    return EXEC_DEFAULT;
}

int __stdcall patchDll(LoHook* h, HookContext* c)
{
    _PI->WriteLoHook((int)GetModuleHandleA("HD_SOD.dll") + 0x10FDC, newTownShortcut);
   
    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = 1;
            _P = GetPatcher();
            _PI = _P->CreateInstance("HD.Plugin.NewTownShortcut");

            _PI->WriteLoHook(0x598510, patchDll);
        }
    }

    return TRUE;
}

* * *
Пока такой "костыль" получился:

 
Код: Выделить всё
int __stdcall newTownShortcut(LoHook* h, HookContext* c)
{
    if ( c->edx == 0x12 ) {
        _Hero_* hero1 = o_GameMgr->GetHero(o_TownMgr->town->up_hero_id);
        _Hero_* hero2 = o_GameMgr->GetHero(o_TownMgr->town->down_hero_id);

        if ( *(int*)hero1 && *(int*)hero2 ) {
            CALL_2(int, __fastcall, 0x4A25B0, hero1, hero2); // Показываем диалог Грамотности
            CALL_1(int, __thiscall, 0x5C75B0, o_TownMgr); // Выходим из города (ExitTownScreen)
            CALL_3(int, __thiscall, 0x4AAA60, o_AdvMgr, hero1, hero2); // Показываем диалог встречи героев
            CALL_2(int, __thiscall, 0x5C67C0, o_TownMgr, 0); // Снова заходим в город (EnterTownScreen)
        }
    }

    return EXEC_DEFAULT;
}
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 02 фев 2019, 06:20

AlexSpl писал(а):

Короче, есть ещё один нюанс: функция встречи героев есть метод класса advManager и после закрытия диалога она возвращает на экран приключений (естественно, с багами), поэтому с ней тоже что-то делать нужно (самому писать аналогичную? если кто уже сталкивался, подскажите). Не всё так просто, как казалось на первый взгляд :smile5:

 
Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "HotA\homm3.h"

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

int __stdcall newTownShortcut(LoHook* h, HookContext* c)
{
    if ( c->edx == 0x12 ) {
        _Hero_* hero1 = o_GameMgr->GetHero(o_TownMgr->town->up_hero_id);
        _Hero_* hero2 = o_GameMgr->GetHero(o_TownMgr->town->down_hero_id);
       
        if ( *(int*)hero1 && *(int*)hero2 ) {
            CALL_2(int, __fastcall, 0x4A25B0, hero1, hero2);
            CALL_3(int, __thiscall, 0x4AAA60, o_AdvMgr, hero1, hero2); 
        }
    }

    return EXEC_DEFAULT;
}

int __stdcall patchDll(LoHook* h, HookContext* c)
{
    _PI->WriteLoHook((int)GetModuleHandleA("HD_SOD.dll") + 0x10FDC, newTownShortcut);
   
    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = 1;
            _P = GetPatcher();
            _PI = _P->CreateInstance("HD.Plugin.NewTownShortcut");

            _PI->WriteLoHook(0x598510, patchDll);
        }
    }

    return TRUE;
}

* * *
Пока такой "костыль" получился:

 
Код: Выделить всё
int __stdcall newTownShortcut(LoHook* h, HookContext* c)
{
    if ( c->edx == 0x12 ) {
        _Hero_* hero1 = o_GameMgr->GetHero(o_TownMgr->town->up_hero_id);
        _Hero_* hero2 = o_GameMgr->GetHero(o_TownMgr->town->down_hero_id);

        if ( *(int*)hero1 && *(int*)hero2 ) {
            CALL_2(int, __fastcall, 0x4A25B0, hero1, hero2); // Показываем диалог Грамотности
            CALL_1(int, __thiscall, 0x5C75B0, o_TownMgr); // Выходим из города (ExitTownScreen)
            CALL_3(int, __thiscall, 0x4AAA60, o_AdvMgr, hero1, hero2); // Показываем диалог встречи героев
            CALL_2(int, __thiscall, 0x5C67C0, o_TownMgr, 0); // Снова заходим в город (EnterTownScreen)
        }
    }

    return EXEC_DEFAULT;
}


Проверил, работает! Единственное, конечно, мелькает экран - заметно выход из город и вход, но это уже мелочи.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 02 фев 2019, 10:27

Есть ещё вариант не обновлять карту приключений после выхода из диалога, тогда мелькание исчезнет, но появится другая проблема: карта при повторном заходе в город будет затеняться. В Хоте функция встречи героев по-любому переписана, т.к. при вызове диалога встречи в городе становятся неактивными кнопки "выбрать левого/правого героя".
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4