Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlinevovacyxov  
имя: Влaдимир
 
Сообщения: 9
Зарегистрирован: 08 ноя 2022, 12:30
Пол: Мужчина
Поблагодарили: 3 раз.

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

Сообщение vovacyxov » 09 ноя 2022, 15:18

AlexSpl писал(а):

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

пример для наглядности, спасибо вам.
Вложения
2022-11-10_18-11-24.png
2022-11-10_18-11-24.png (1.46 МБ) Просмотров: 911
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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 » 09 ноя 2022, 17:45

Так, я вспомнил, что отказ от вторичных навыков уже был реализован igrik'ом: https://handbookhmm.ru/forum/viewtopic.php?f=56&t=518&start=1960#p21375.
Вернуться к началу

offlinevovacyxov  
имя: Влaдимир
 
Сообщения: 9
Зарегистрирован: 08 ноя 2022, 12:30
Пол: Мужчина
Поблагодарили: 3 раз.

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

Сообщение vovacyxov » 09 ноя 2022, 19:33

AlexSpl писал(а):

Так, я вспомнил, что отказ от вторичных навыков уже был реализован igrik'ом: https://handbookhmm.ru/forum/viewtopic.php?f=56&t=518&start=1960#p21375.


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

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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 » 09 ноя 2022, 21:35

На левел-апе отказ от навыков код по ссылке обеспечивает. Его нужно построить просто. Там дальше по теме есть уточнения, как это сделать. Но я сделаю обе версии: скомпилирую код igrik'а и добавлю кнопку отмены навыка в диалог по левому клику по нему в окне героя. Сложностей, вроде, не должно быть, если не придётся, конечно, работать с кодом самого HD-мода. Не всегда правки возможны без костылей из-за его собственных хайхуков.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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 » 10 ноя 2022, 08:50

1.png
1.png (147.23 КБ) Просмотров: 881

CancelButtonAtLevelUp.zip
(3.74 КБ) Скачиваний: 92

Ещё можно кнопку OK чуть меньшего размера взять, чтобы была парной для Cancel. Например, из этого диалога:

2.png
2.png (93.88 КБ) Просмотров: 879
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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 » 10 ноя 2022, 15:13

Дописал удаление вторичных навыков из окна героя:

ForgetSecSkill.zip
(4.5 КБ) Скачиваний: 108

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS

#pragma warning(disable : 4005)
#pragma warning(disable : 4010)

#include "stdafx.h"
#include "..\..\Headers\HoMM3API.h"

Patcher* _P;
PatcherInstance* _PI;

void __stdcall forgetSecSkill(HiHook* h, char const* cText, int iMBType, int x, int y,
                              int iResType1, int iResExtra1, int iResType2, int iResExtra2,
                              int iSpecial, int iTimeout, int iResType3, int iResExtra3)
{
   if (iResExtra1 && iMBType == 1)
      iMBType = 2;

   CALL_12(void, __fastcall, h->GetDefaultFunc(), cText, iMBType, x, y,
      iResType1, iResExtra1, iResType2, iResExtra2, iSpecial, iTimeout, iResType3, iResExtra3);

   if (iResExtra1 && pWindowManager->dialogReturn == 0x7806)
   {
      hero* gpHero = *(hero**)0x698B70;

      if (gpHero)
      {
         int skill = (iResExtra1 - 3) / 3;
         TSkillMastery mastery = (TSkillMastery)((iResExtra1 - 3) % 3 + 1);
         
         --gpHero->SSLevel[skill];

         if (mastery == eMasteryBasic)
         {
            --gpHero->numSSs;
           
            for (int i = 0; i < 28; ++i)
               if (gpHero->SSOrder[i] > gpHero->SSOrder[skill])
                  --gpHero->SSOrder[i];

            gpHero->SSOrder[skill] = 0;
         }

         heroWindow* heroWnd = *(heroWindow**)0x698AC8;

         CALL_1(void, __thiscall, 0x4E1CC0, heroWnd);
         CALL_4(void, __thiscall, *(int*)(*(int*)heroWnd + 0x14), heroWnd, true, -65535, 65535);
      }
   }
}

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.H3.ForgetSecSkill");

         _PI->WriteHiHook(0x4DE843, CALL_, EXTENDED_, FASTCALL_, forgetSecSkill);
      }
   }
   
   return TRUE;
}

Кстати, пример CALL_ хайхука. Пригодился наконец :smile1:

HoMM3API.h (вместе с consts.h) можно взять из исходников плагина NewSpells.
Вернуться к началу

offlinevovacyxov  
имя: Влaдимир
 
Сообщения: 9
Зарегистрирован: 08 ноя 2022, 12:30
Пол: Мужчина
Поблагодарили: 3 раз.

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

Сообщение vovacyxov » 10 ноя 2022, 17:12

AlexSpl писал(а):

Дописал удаление вторичных навыков из окна героя:

ForgetSecSkill.zip

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS

#pragma warning(disable : 4005)
#pragma warning(disable : 4010)

#include "stdafx.h"
#include "..\..\Headers\HoMM3API.h"

Patcher* _P;
PatcherInstance* _PI;

void __stdcall forgetSecSkill(HiHook* h, char const* cText, int iMBType, int x, int y,
                              int iResType1, int iResExtra1, int iResType2, int iResExtra2,
                              int iSpecial, int iTimeout, int iResType3, int iResExtra3)
{
   if (iResExtra1 && iMBType == 1)
      iMBType = 2;

   CALL_12(void, __fastcall, h->GetDefaultFunc(), cText, iMBType, x, y,
      iResType1, iResExtra1, iResType2, iResExtra2, iSpecial, iTimeout, iResType3, iResExtra3);

   if (iResExtra1 && pWindowManager->dialogReturn == 0x7806)
   {
      hero* gpHero = *(hero**)0x698B70;

      if (gpHero)
      {
         int skill = (iResExtra1 - 3) / 3;
         TSkillMastery mastery = (TSkillMastery)((iResExtra1 - 3) % 3 + 1);
         
         --gpHero->SSLevel[skill];

         if (mastery == eMasteryBasic)
         {
            --gpHero->numSSs;
           
            for (int i = 0; i < 28; ++i)
               if (gpHero->SSOrder[i] > gpHero->SSOrder[skill])
                  --gpHero->SSOrder[i];

            gpHero->SSOrder[skill] = 0;
         }

         heroWindow* heroWnd = *(heroWindow**)0x698AC8;

         CALL_1(void, __thiscall, 0x4E1CC0, heroWnd);
         CALL_4(void, __thiscall, *(int*)(*(int*)heroWnd + 0x14), heroWnd, true, -65535, 65535);
      }
   }
}

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.H3.ForgetSecSkill");

         _PI->WriteHiHook(0x4DE843, CALL_, EXTENDED_, FASTCALL_, forgetSecSkill);
      }
   }
   
   return TRUE;
}

Кстати, пример CALL_ хайхука. Пригодился наконец :smile1:

HoMM3API.h (вместе с consts.h) можно взять из исходников плагина NewSpells.


Это фантастика, спасибо вам огромное. Я не верю своим глазам, что наконец то чего я не мог нигде найти, сделали по моей просьбе. ОГРОМНЕЙШЕЕ ВАМ СПАСИБО. НИЗКИЙ ВАМ ПОКЛОН, ОТ ВСЕЙ ДУШИ. отправил вам личное сообщение, ответ те пожалуйста.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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 » 10 ноя 2022, 18:41

Спасибо за комплимент. Мне и самому понравилось, как всё получилось. Удаляешь, например, Luck или Leadership и параметры героя мгновенно обновляются. До вызова NormalDialog здесь используется подмена аргумента iMBType (1 - только кпопка OK на 2 - OK и Cancel). Далее идёт отображение модифицированного диалога и обработка нажатия на Cancel. ID скилла и его уровень получаются из iResExtra1 в целях оптимизации кода. Далее, три прописные истины о вторичных навыках: у них есть число, для каждого навыка задан уровень от 0 до 3 (None .. Expert) и путающая многих часть о их порядке (SSOrder). Не знаю, почему разработчики Героев 3 не решили сделать навыки той же очередью, которая используется для заклинаний, но факт в том, что это массив. Возможно, это сделано потому, что порядковый номер навыка никогда не изменяется при обычном (стандартном) его получении. Но если мы говорим об удалении, то тогда приходится переназначать порядковые номера навыков (SSOrder). Далее идёт пересчёт параметров героя, участвующих в визуализации окна героя, и обновление картинки, которую видит пользователь. Последние параметры (-65535 и 65535) взяты из H3API и их, при желании, можно уточнить. Но современные процессоры обрабатывают такой диапазон за микросекунды. Единственное, что я бы добавил, так это диалог с предупреждением о том, желает ли игрок реально отменить навык, чтобы исключить возможные проблемы с мисскликами по кпопкам.

Теперь насчёт того, чит это или нет. Тут сложнее. Отказываясь от навыка/ступени навыка, мы, безусловно, меняем ход игры. И, возможно, можем получить бонусы от навыка, чтобы потом его удалить, освобождая место под новый. Но, в общем, мы просто берём под контроль рандом. Случаи, когда отменяемый навык важен (например, Expert Wisdom, чтобы иметь возможность кастовать заклинания 5-го уровня) должны, конечно, обрабатываться отдельно. Я немножко забыл, как добавляются заклинания в книгу Героя. Скорее всего, после отмены Мудрости вообще, они останутся в книге (но нужно проверять, не помню код точно). Хотя, может быть, это и есть преимущество "забывания" навыков. Короче, нужно прогнать "забывание" через все правила, описанные в FizMiG, которые работают для вторичных навыков.

* * *
vovacyxov, спасибо за поддержку. Очень приятно :smile16:
Вернуться к началу

offlinevovacyxov  
имя: Влaдимир
 
Сообщения: 9
Зарегистрирован: 08 ноя 2022, 12:30
Пол: Мужчина
Поблагодарили: 3 раз.

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

Сообщение vovacyxov » 10 ноя 2022, 19:18

AlexSpl писал(а):

Спасибо за комплимент. Мне и самому понравилось, как всё получилось. Удаляешь, например, Luck или Leadership и параметры героя мгновенно обновляются. До вызова NormalDialog здесь используется подмена аргумента iMBType (1 - только кпопка OK на 2 - OK и Cancel). Далее идёт отображение модифицированного диалога и обработка нажатия на Cancel. ID скилла и его уровень получаются из iResExtra1 в целях оптимизации кода. Далее, три прописные истины о вторичных навыках: у них есть число, для каждого навыка задан уровень от 0 до 3 (None .. Expert) и путающая многих часть о их порядке (SSOrder). Не знаю, почему разработчики Героев 3 не решили сделать навыки той же очередью, которая используется для заклинаний, но факт в том, что это массив. Возможно, это сделано потому, что порядковый номер навыка никогда не изменяется при обычном (стандартном) его получении. Но если мы говорим об удалении, то тогда приходится переназначать порядковые номера навыков (SSOrder). Далее идёт пересчёт параметров героя, участвующих в визуализации окна героя, и обновление картинки, которую видит пользователь. Последние параметры (-65535 и 65535) взяты из H3API и их, при желании, можно уточнить. Но современные процессоры обрабатывают такой диапазон за микросекунды. Единственное, что я бы добавил, так это диалог с предупреждением о том, желает ли игрок реально отменить навык, чтобы исключить возможные проблемы с мисскликами по кпопкам.

Теперь насчёт того, чит это или нет. Тут сложнее. Отказываясь от навыка/ступени навыка, мы, безусловно, меняем ход игры. И, возможно, можем получить бонусы от навыка, чтобы потом его удалить, освобождая место под новый. Но, в общем, мы просто берём под контроль рандом. Случаи, когда отменяемый навык важен (например, Expert Wisdom, чтобы иметь возможность кастовать заклинания 5-го уровня) должны, конечно, обрабатываться отдельно. Я немножко забыл, как добавляются заклинания в книгу Героя. Скорее всего, после отмены Мудрости вообще, они останутся в книге (но нужно проверять, не помню код точно). Хотя, может быть, это и есть преимущество "забывания" навыков. Короче, нужно прогнать "забывание" через все правила, описанные в FizMiG, которые работают для вторичных навыков.

* * *
vovacyxov, спасибо за поддержку. Очень приятно :smile16:


Скорее всего это чит, но он так удобен для одиночного прохождения карт, а тут человек сам решает играть ему с этим плагином или нет. Кто хочет "заточить" героя под свои параметры, тому будет этот плагин интересен. Я даже жене похвастался, хоть она ничего и не понимает в этом, но я с таким большим удовольствием ей показал ваши труды. Случайно нашел ваш форум,с большим трудом зарегистрировался, (так как на почту MAIL письмо о завершении регистрации не приходило, пришлось воспользоваться яндекс почтой) когда искал плагины, специально зарегистрировался в надежде что мне тут помогут. И черт подери.... я счастлив что есть люди готовые потратить свое время, чтобы человек был безумно счастлив.
п.с. дядя 35 лет :smile21:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5539
Зарегистрирован: 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 » 11 ноя 2022, 15:46

Так, есть ошибка с правым кликом по навыку. Буду исправлять. Если сначала удалить навык, то правый клик по оставшимся навыкам будет удалять их. Думаю, проблема в одном из условий. Скорее всего, dialogReturn не обнуляется после нажатия на кнопку отмены навыка.
Вернуться к началу

Пред.След.

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

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

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

cron