Объявления

Друзья, если не получается зарегистрироваться, напишите на почту 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 » 05 авг 2021, 21:32

Нужно сделать её активной :smile2: Но это ещё одна из бесконечного множества задач моддинга. Будет желание, посмотрю, но мне кажется, что кто-то уже делал это (может быть, Ben80 или RoseKavalier в SoD_SP). Не хотелось бы тратить время на изобретение велосипеда. Ладно ещё с фишками HotA (код закрытый).
Вернуться к началу

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

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

Сообщение Rolex » 05 авг 2021, 21:36

Ben80 не делал. Здесь рабочего кода я не встречал. В SoD_SP может где-то и есть, но там H3API.

Все что есть здесь по этому вопросу:

as239 писал(а):

Сделал чтобы кнопка удалить была доступна для героя в городе, при открытии с карты приключений.
_PI->WriteByte(0x4E1B98, 0x74);
Но не уверен в правильности решения.

...
igrik писал(а):

Это не верное решение.
Верное -> смотри по этому адресу 0x4E1CE7
Последний раз редактировалось Rolex 05 авг 2021, 21:44, всего редактировалось 2 раз(а).
Вернуться к началу

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 » 05 авг 2021, 21:39

Язык H3API легко перевести на язык homm3.h (при желании, конечно). Важна же сама реализация. Т.е. есть разница: начинать с поиска места для хука или переносить готовый код.

Вот, я же помню, что было уже :smile2:

А что, патч Ben80 с проблемами какими-то?
Вернуться к началу

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

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

Сообщение Rolex » 05 авг 2021, 21:43

Честно говоря я смотрел, но не нашел. Там нет похожего адреса на который советовал смотреть igrik.

AlexSpl писал(а):

А что, патч Ben80 с проблемами какими-то?

Так там патч по книге, мы за героя речь ведем.
Вернуться к началу

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 » 05 авг 2021, 21:47

Он советует смотреть сюда:

Изображение

* * *
Т.е. _PI->WriteByte(0x4E1B98, 0x74); не удаляет героя или как?
Вернуться к началу

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

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

Сообщение Rolex » 05 авг 2021, 22:11

AlexSpl писал(а):

Т.е. _PI->WriteByte(0x4E1B98, 0x74); не удаляет героя или как?

Только с карты (и неизвестно хорошо ли удаляет или есть последствия, которых мы не видим). А вот в городе не удаляет. Глянул, оказывается этого нет в SoD_SP. В 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 » 05 авг 2021, 22:19

В городе просто убрать героя и его армию из гарнизона нужно и обновить экран (я так думаю). Это в дополнение к стандартной процедуре отправки в пул героев.
Вернуться к началу

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

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

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

Касательно обновления или перерисовки экрана города, то в пользовательских плагинах (вот здесь viewtopic.php?f=56&t=529&start=40#p21121) я постил плагин обмена армиями в городе по горячей клавише "E/У". Собрал его из нескольких кусков, там, вроде, и ваш код есть и RoseKavalier потом его допиливал. Думаю, оттуда можно будет что-то взять для плагина с увольнением. Вот бы теперь еще и увольнение героя сделать нормально, как в 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, 10:54

Есть прогресс :smile4:

Код: Выделить всё
#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)
   {
      dlg->SendItemCommand(0x200, 5, 0x81, 6);
      dlg->SendItemCommand(0x200, 6, 0x81, 0x1000);
   }
   
   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);
        }
    }

    return TRUE;
}

Осталось только после удаления героя с карты удалять его и из города (думаю, достаточно обновить экран города), и плагин готов. И не показывать, как он исчезает на глобальной карте. Звук, думаю, нужно оставить.

* * *
Можно ещё так:

Код: Выделить всё
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;
}
...
_PI->WriteLoHook(0x4E1BF1, enableDismissHero);

Плюс один хук на функцию, которая увольняет героя. Плюс, видимо, гарнизон города чистить вручную нужно, а потом уже обновлять экран.
Последний раз редактировалось AlexSpl 06 авг 2021, 11:13, всего редактировалось 1 раз.
Вернуться к началу

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

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

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

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

Вот это, кстати, точное попадание на кнопку. Также и у себя сделал с кнопкой апгрейда.

Ибо изначально у Вас было:
>= && <=
>= && <=
(проблемы с точность с одной стороны)
-------------
Потом я сделал:
> && <
> && <
(начались проблемы с точность с другой стороны)
-------------
А нужно было:
>= && <
>= && <
(вот так мы четко попадаем на кнопку)
Вернуться к началу

Пред.След.

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

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

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