Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
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 » 06 авг 2021, 11:33

Посмотрел, как в HotA реализовано. Там без звука.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 06 авг 2021, 12:50

Потестил Ваши два варианта увольнения героя. Не знаю какой из них лучше, отрабатывают примерно одинаково. С карты удаляет прекрасно, а вот в городе...

Я так понял, что ваша идея при удалении героя в городе состоит в том, чтобы выйти из города, удалить героя с карты, и потом зайти обратно в город. Если все эти действия получиться умело скрыть без последствий, чтобы игрок ничего не заметил, тогда все ок. Не знаю, какой подход по решению этой задачи в HotA, но там все красиво смотрится.

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

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 » 06 авг 2021, 13:09

Я почти закончил плагин. Осталось нормально обновлять экран города. Всё работает, как в HotA, но я заметил, что там неидеальная реализация. Например, если поместить героя в гарнизон, выйти из города, снова зайти в город, то в правом нижнем углу будет отображена армия героя (там где анимация нового дня). Теперь если удалить героя, в том окошке армия останется до выхода из города. Аналогично с героем-гостем: если его уволить, список героев не обновляется до выхода из города.

Но это мелочи. Типа проблемы несоответствия размеров экрана города размеру экрана игры (поэтому экран игры и затемняется). Сделаю, как в HotA.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 06 авг 2021, 13:48

AlexSpl писал(а):

Всё работает, как в HotA, но я заметил, что там неидеальная реализация. Например, если поместить героя в гарнизон, выйти из города, снова зайти в город, то в правом нижнем углу будет отображена армия героя (там где анимация нового дня). Теперь если удалить героя, в том окошке армия останется до выхода из города. Аналогично с героем-гостем: если его уволить, список героев не обновляется до выхода из города.

Ну, не знаю. По-моему, так и должно быть. Например, запустите оригинал с HD-модом, переместите героя в гарнизон и разделите его армию. Все изменения, которые вы сделаете с существами героя в гарнизоне в городе отобразятся в окошке на карте приключений только после выхода из города. То есть когда активной станет карта, а не город.

AlexSpl писал(а):

Но это мелочи. Типа проблемы несоответствия размеров экрана города размеру экрана игры (поэтому экран игры и затемняется).

Скорей не проблема, а особенности HD-мода. В HD же только карта, а окно города и боя в оригинальном разрешении 800х600 под которое все рисовалось и адаптировалось (иначе бы пришлось перерисовывать кучу всего). Если мы сделаем в лаунчере оригинальное разрешении игры 800х600, карта станет равна по размеру окну города и все, что находится на карте, когда мы находимся в городе, мы просто не увидим.
Вернуться к началу

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 » 06 авг 2021, 13:58

Пока так:

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

Patcher* _P;
PatcherInstance* _PI;

int __stdcall enableDismissHero(LoHook* h, HookContext* c)
{
    _Dlg_* dlg = *(_Dlg_**)0x698AC8;
    _DlgItem_* button = dlg->GetItem(0x81);

    if (button)
    {
        button->SendCommand(5, 6);
        button->SendCommand(6, 0x1000);
    }
   
    return EXEC_DEFAULT;
}

int __stdcall processDismissHeroA(LoHook* h, HookContext* c)
{
    if (o_TownMgr->dlg)
    {
        c->return_address = 0x4DA28E;
        return NO_EXEC_DEFAULT;
    }
    return EXEC_DEFAULT;
}

int __stdcall processDismissHeroB(LoHook* h, HookContext* c)
{
    if (o_TownMgr->dlg)
    {
        c->return_address = 0x4E1C6E;
        return NO_EXEC_DEFAULT;
    }
    return EXEC_DEFAULT;
}

int __stdcall processDismissHeroC(LoHook* h, HookContext* c)
{
    if (o_TownMgr->dlg)
    {
        o_TownMgr->CreateNewGarriBars();
        o_TownMgr->dlg->Redraw();
       
        c->return_address = 0x4DA406;
        return NO_EXEC_DEFAULT;
    }
    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    static bool plugin_On = false;

    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = true;
            _P = GetPatcher();
            _PI = _P->CreateInstance((char*)"HD.Plugin.DismissHeroesInTowns");
           
            _PI->WriteLoHook(0x4E1BF1, enableDismissHero);
            _PI->WriteLoHook(0x4DA238, processDismissHeroA);
            _PI->WriteLoHook(0x4E1C37, processDismissHeroB);
            _PI->WriteLoHook(0x4DA3F3, processDismissHeroC);
        }
    }

    return TRUE;
}

Три хука нужны, так как функция увольнения то и дело норовит заапдейтить что-то на карте приключений.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 06 авг 2021, 14:09

AlexSpl писал(а):

Три хука нужны, так как функция увольнения то и дело норовит заапдейтить что-то на карте приключений.

У Вас, вроде, аж 4 хука. Поподробней, что не так, какие проблемы есть?
Вернуться к началу

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 » 06 авг 2021, 14:11

Проблем пока не обнаружено. Может, Вы найдёте. Меньшим числом обойтись нельзя, если не переписывать вообще функцию увольнения.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 06 авг 2021, 14:16

Ок, будем тестировать. Просто я не совсем понял смысл той приписки под кодом ... норовит заапдейтить что-то ...

***

Ага, я понял. Вы просто с предыдущего плаина хук showUpgradeCost забыли убрать.
Вернуться к началу

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 » 06 авг 2021, 14:22

Так в оригинале так и есть: апдейтится карта, список героев, армия и т.п. А нам этого не нужно, т.к. мы в городе. Пока нашёл только один нюанс: после увольнения героя и выхода из города показывается анимация дня, т.к. ни один герой или город неактивен. В HotA при выходе становится активным город, из которого уволили героя. Но нужно же, чтобы чем-то плагины отличались? Пусть будет фишкой :smile12:

* *
Ещё, по всей видимости, нужно добавить o_TownMgr->DeleteGarriBars(); перед созданием новых во избежание утечки памяти:

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

Patcher* _P;
PatcherInstance* _PI;

int __stdcall showUpgradeCost(LoHook* h, HookContext* c)
{
    _Dlg_* dlg = (_Dlg_*)c->ebx;
    _DlgItem_* button = dlg->GetItem(0x12C);

    if (button)
    {
        int x, y;
        CALL_2(void, __stdcall, 0x50D700, &x, &y);
        if (x - dlg->x >= button->x && x - dlg->x < button->x + button->width &&
            y - dlg->y >= button->y && y - dlg->y < button->y + button->height)
        {
          char* str = *(char**)(0xD * 8 + 0x6A74C0); // Оригинальное сообщение

          sprintf(o_TextBuffer, "%s %s", str, "test");
          c->edi = (int)o_TextBuffer;
        }
    }
   
    return EXEC_DEFAULT;
}

int __stdcall enableDismissHero(LoHook* h, HookContext* c)
{
    _Dlg_* dlg = *(_Dlg_**)0x698AC8;
    _DlgItem_* button = dlg->GetItem(0x81);

    if (button)
    {
        button->SendCommand(5, 6);
        button->SendCommand(6, 0x1000);
    }
   
    return EXEC_DEFAULT;
}

int __stdcall processDismissHeroA(LoHook* h, HookContext* c)
{
    if (o_TownMgr->dlg)
    {
        c->return_address = 0x4DA28E;
        return NO_EXEC_DEFAULT;
    }
    return EXEC_DEFAULT;
}

int __stdcall processDismissHeroB(LoHook* h, HookContext* c)
{
    if (o_TownMgr->dlg)
    {
        c->return_address = 0x4E1C6E;
        return NO_EXEC_DEFAULT;
    }
    return EXEC_DEFAULT;
}

int __stdcall processDismissHeroC(LoHook* h, HookContext* c)
{
    if (o_TownMgr->dlg)
    {
        o_TownMgr->DeleteGarriBars();
        o_TownMgr->CreateNewGarriBars();
        o_TownMgr->dlg->Redraw();
       
        c->return_address = 0x4DA406;
        return NO_EXEC_DEFAULT;
    }
    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    static bool plugin_On = false;

    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = true;
            _P = GetPatcher();
            _PI = _P->CreateInstance((char*)"HD.Plugin.UpgradeInfo");

            _PI->WriteLoHook(0x5F5336, showUpgradeCost);
            _PI->WriteCodePatch(0x5F5201, "%n", 6);
           
            _PI->WriteLoHook(0x4E1BF1, enableDismissHero);
            _PI->WriteLoHook(0x4DA238, processDismissHeroA);
            _PI->WriteLoHook(0x4E1C37, processDismissHeroB);
            _PI->WriteLoHook(0x4DA3F3, processDismissHeroC);
        }
    }

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

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 06 авг 2021, 14:55

AlexSpl писал(а):

Пока нашёл только один нюанс: после увольнения героя и выхода из города показывается анимация дня, т.к. ни один герой или город неактивен. В HotA при выходе становится активным город, из которого уволили героя.

Хз, у меня после увольнения героя в окне города и выхода из города также как и в HotA становится активным город. Анимация дня показывается только когда удалять героя в городе, но с карты. Может Вы попутали. Но не суть. Я нашел другую проблему:

Кнопка увольнения исчезает с задержкой уже после закрытия окна героя с этой кнопкой. Без разницы закрываем мы это окно без увольнения или же увольняем героя - изначально закрывается окно, а уже после исчезает кнопка. При увольнении кнопка исчезает вместе с героем, но после закрытия окна. А должна вместе с окном. Оно на самом деле очень заметно. В HotA подобного бага нет.
Последний раз редактировалось Rolex 06 авг 2021, 15:00, всего редактировалось 2 раз(а).
Вернуться к началу

Пред.След.

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

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

Сейчас этот форум просматривают: Yandex [bot] и гости: 1