Объявления
Поздравляем
VDV_forever


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 06 авг 2021, 17:47

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

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

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

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

AlexSpl писал(а):

Примечание. Только при реальном увольнении работает. Просто проверить, исчезнет ли проблема с задержкой.

Нет, проблема осталась, как в гарнизоне, так и на карте. Но стоит мне только на 1 клетку выйти из города, как проблема исчезает при увольнении и закрытии окна. То есть на дефолтных алгоритмах этой проблемы нет.

AlexSpl писал(а):

На оригинале отчётливо видно, как её часть не хочет удаляться при закрытии диалога.

На моих скринах и видео не часть, а целая кнопка, причем неактивная. :smile5:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 06 авг 2021, 17:57

Часть может быть только в результате реального увольнения, потому что слоты гарнизона перерисовываются. Если добавить последний код, то при реальном увольнении кнопка исчезнет. Но это не дело. Нужно искать причину, по которой алгоритм уничтожения окна не хочет её уничтожать (причём она ещё и неактивной оказывается).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 06 авг 2021, 17:58

Прикольно, что если бы не эта задержка, такой вот баг был бы незаметен. Всё же на HD моде работает :smile1:
Вернуться к началу

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

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

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

Я вот на оригинале еще не проверял у себя. Как завести asi? Кидаю патчер и asi (переименованный dll) в корень к экзешнику. При открытии окна героя получаю вылет.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 06 авг 2021, 18:06

pather_x86.dll в корне?
Вернуться к началу

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

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

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

AlexSpl писал(а):

pather_x86.dll в корне?

Да.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 06 авг 2021, 18:11

Так. А зачекайте этот код. Кажется, первая команда лишняя.

Код: Выделить всё
#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();

        // Перерисовываем диалог города
        CALL_1(void, __thiscall, 0x5D5930, o_TownMgr);
        CALL_1(void, __thiscall, 0x5D5810, o_TownMgr);
       
        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
Ветеран
Ветеран
 
Сообщения: 890
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 49 раз.

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

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

Цитата:
Так. А зачекайте этот код. Кажется, первая команда лишняя.

Победа. :smile11: Задержка полностью ушла везде. :smile1:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 06 авг 2021, 18:22

Вот это тоже можно убирать:

Код: Выделить всё
// Перерисовываем диалог города
CALL_1(void, __thiscall, 0x5D5930, o_TownMgr);
CALL_1(void, __thiscall, 0x5D5810, o_TownMgr);

Ещё быстрее будет.
Вернуться к началу

Пред.След.

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

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

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