Объявления

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

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

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

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

Сообщение as239 » 02 фев 2019, 13:47

AlexSpl писал(а):

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

А скопировать функцию обмена из Хоты или Сода с коррекировкой, это сложно, да?
Вернуться к началу

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, 15:05

Нужен код, который бы просто отображал диалог встречи и корректно отрисовывал всё, что было под ним, после того, как был закрыт. У меня есть решение с двумя дополнительными хуками (хук в диалоге встречи + хук в EnterTownScreen), но это плохое решение. Я написал igrik'у на df2. Может, подскажет что не так с кодом.
Вернуться к началу

offlineigrik  
Подмастерье
Подмастерье
 
Сообщения: 108
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 84 раз.

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

Сообщение igrik » 02 фев 2019, 16:37

Привет. На вскидку пока так:

 Код с выходом из окна города
Код: Выделить всё
#define HK_E 18

int __stdcall Y_DlgTown_Proc(HiHook* hook, _TownMgr_* tm, _EventMsg_* klick)
{
   int res = CALL_2(int, __thiscall, hook->GetDefaultFunc(), tm, klick);

   if (res) {
      if (klick->type == 2 && klick->subtype == HK_E) {
         int heroU_id = tm->town->up_hero_id;
         int heroD_id = tm->town->down_hero_id;

         if ( heroU_id != -1 && heroD_id != -1) {
            _Hero_* heroU = o_GameMgr->GetHero(heroU_id);
            _Hero_* heroD = o_GameMgr->GetHero(heroD_id);

            CALL_2(void, __fastcall, 0x4A25B0, heroU, heroD);
            CALL_3(void, __thiscall, 0x4AAA60, o_AdvMgr, heroU, heroD);

            // делаем автоматический выход из окна города
            o_WndMgr->result_dlg_item_id = 0x7800;
            klick->type = 0x4000;
            klick->subtype = 1;
            klick->item_id = 10;

            return 2;
         }
      }
   }
   return res;
}

/////////////////////////////////////////////////////////////////////////////

_PI->WriteHiHook(0x5D3640, SPLICE_, EXTENDED_, THISCALL_, Y_DlgTown_Proc);


AlexSpl, я не совсем понимаю - зачем ты патчишь HD-шные dll?
Вернуться к началу

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 » 03 фев 2019, 09:54

Так нужный код в функциях из dll. Не переписывать же её (функцию) всю? Или есть какая-то альтернатива?

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

* * *
Проверил, работает. А можно сделать без выхода из города вообще? Чтобы после диалога встречи оставался экран города?
Вернуться к началу

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 » 03 фев 2019, 12:33

Код для отображения кол-ва охранников в банке:

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

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

int __stdcall showGuards(LoHook* h, HookContext* c)
{
    // Получаем состояние банка
    _CrBankState_* bankState = (_CrBankState_*)CALL_1(int, __fastcall, 0x405D80, c->ebx);

    // Выводим в текстовый буфер оригинальное сообщение + кол-во охранников в скобках
    sprintf(o_TextBuffer, "%s\n\n(%d)", (char*)c->ecx, bankState->defenders.GetCreaturesCount());
   
    // Передаём адрес текстового буфера в качестве аргумента для диалога
    c->ecx = (int)o_TextBuffer;
   
    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.ShowGuards");

            _PI->WriteLoHook(0x4A13E6, showGuards);
        }
    }

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

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

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

Сообщение as239 » 03 фев 2019, 13:46

igrik писал(а):

Привет. На вскидку пока так:

 Код с выходом из окна города
Код: Выделить всё
#define HK_E 18

int __stdcall Y_DlgTown_Proc(HiHook* hook, _TownMgr_* tm, _EventMsg_* klick)
{
   int res = CALL_2(int, __thiscall, hook->GetDefaultFunc(), tm, klick);

   if (res) {
      if (klick->type == 2 && klick->subtype == HK_E) {
         int heroU_id = tm->town->up_hero_id;
         int heroD_id = tm->town->down_hero_id;

         if ( heroU_id != -1 && heroD_id != -1) {
            _Hero_* heroU = o_GameMgr->GetHero(heroU_id);
            _Hero_* heroD = o_GameMgr->GetHero(heroD_id);

            CALL_2(void, __fastcall, 0x4A25B0, heroU, heroD);
            CALL_3(void, __thiscall, 0x4AAA60, o_AdvMgr, heroU, heroD);

            // делаем автоматический выход из окна города
            o_WndMgr->result_dlg_item_id = 0x7800;
            klick->type = 0x4000;
            klick->subtype = 1;
            klick->item_id = 10;

            return 2;
         }
      }
   }
   return res;
}

/////////////////////////////////////////////////////////////////////////////

_PI->WriteHiHook(0x5D3640, SPLICE_, EXTENDED_, THISCALL_, Y_DlgTown_Proc);


AlexSpl, я не совсем понимаю - зачем ты патчишь HD-шные dll?


Да работает, только бы в городе еще оставаться.
Вернуться к началу

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

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

Сообщение as239 » 03 фев 2019, 13:50

AlexSpl писал(а):

Код для отображения кол-ва охранников в банке:

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

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

int __stdcall showGuards(LoHook* h, HookContext* c)
{
    // Получаем состояние банка
    _CrBankState_* bankState = (_CrBankState_*)CALL_1(int, __fastcall, 0x405D80, c->ebx);

    // Выводим в текстовый буфер оригинальное сообщение + кол-во охранников в скобках
    sprintf(o_TextBuffer, "%s\n\n(%d)", (char*)c->ecx, bankState->defenders.GetCreaturesCount());
   
    // Передаём адрес текстового буфера в качестве аргумента для диалога
    c->ecx = (int)o_TextBuffer;
   
    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.ShowGuards");

            _PI->WriteLoHook(0x4A13E6, showGuards);
        }
    }

    return TRUE;
}


Работает, только нужно не точное количество, а как в описании: 20-49, 50-99, 100-249.
Можно конечно по условию вхождения в интервал формировать описанию, но может есть более изящное решение?
Пока сделаю через условие.
Вернуться к началу

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 » 03 фев 2019, 14:07

А смысл тогда? Чтобы не отличать 30 от 45? :smile1:
Вернуться к началу

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

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

Сообщение as239 » 03 фев 2019, 14:16

AlexSpl писал(а):

А смысл тогда? Чтобы не отличать 30 от 45? :smile1:

Да, в этом и смыл. Cетевые игроки всегда смотрят на размер улика "20-49" - небольшой можно лезть с маленькой армией, "50-99" - большой улик нужно подкопить армию.
И сейчас, чтобы получить эту информацию приходится сходить с улика, а потом на него вставать, а это -200 MP героя (по бездороге), абсолютно бессмысленная и неудобная трата MP.
Для остальных банков это не так актуально, но иногда бывают консерватории в горах, где тоже не посмотреть описание, так что там тоже пригодится.
Вернуться к началу

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 » 03 фев 2019, 14:21

Я понял идею сразу. Т.е. есть ноль информации, какая-то оценочная и точная. Я против того, чтобы прятать цифры. Зачем гадать, сколько там, 30 или 45? Как это на скилл влияет? Типа интрига такая?

В онлайне, считаю, не должно быть сомнений. Зачем они? Кто-то побоялся, а кто-то нет? Мало другого, что ли, рандома?
Вернуться к началу

Пред.След.

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

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

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