Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

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

Сообщение RoseKavalier » 05 фев 2021, 21:37

I only use H3API, without it all hope is lost!

It's an improved macro over CALL_X:
>it implicitly adds the call convention (THISCALL_X = __thiscall, FASTCALL_X = __fastcall, ...)
>it's a macro around a template function, which means you can pass large arguments more easily and types that don't implicitly convert to DWORD (e.g. float)
Код: Выделить всё
STDCALL_1(void, 0x123456, 1.0)

If one used CALL_X you'd have to write
Код: Выделить всё
int d1, d2;
double dbl = 1.0;
d1 = ((int*)(&dbl))[0];
d2 = ((int*)(&dbl))[1];
CALL_2(void, __stdcall, 0x123456, d1, d2); // might be d2, d1, not worth checking

:smile7:

I'd recommend doing...
Код: Выделить всё
int getStacksCount(double k, char x, char y, char z, int extra_stacks = 0)

return n - extra_stacks;

...and call getStacksCount(2) for pyramid... at least that's what the game does.
Also, there are additional steps to calculate `k` for pyramid to take in account the 2 extra stacks, you need to add their aiValue on top.
Вернуться к началу

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 » 08 фев 2021, 16:59

Для Пирамиды используется тот же алгоритм определения кол-ва стеков, что и для нейтралов, а также Заброшенной шахты (т.е. Deviation нельзя взять и убрать). Просто от результирующего кол-ва Золотых големов отнимается 2 (ну, и идёт проверка, чтобы их не стало меньше одного). Для HD+ нужны другие коэффициенты devCoef[] и их нужно вычислять.
Вернуться к началу

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

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

Сообщение igrik » 11 фев 2021, 17:28

Rolex писал(а):

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

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

То есть нужно с другой стороны напротив кнопки подтверждения добавить кнопку отказа от изучения вторичного навыка (как с переигровкой битвы в HD-моде).

 Примерно так:
Изображение Изображение

При нажатии на эту кнопку отмены, опыт добавляется, первичный навык повышается, а вот вторичный навык не изучается. Если все же случайно был отмечен какой-то вторичный навык (выделен рамкой по клику мыши) и кнопка подтверждения стала активной, то кнопка отмены при этом остается активной всегда и по ее нажатию выбранный навык все равно не изучается.


Не было времени рассмотреть вопрос. Теперь появилось немного.
Проще всего кнопку отмены запилить через _H3API_ от RoseKavalier вот так:

 Код
Код: Выделить всё
#define _H3API_PATCHER_X86_
#include "../../Headers/H3API.hpp"

using namespace h3;
using namespace NH3Dlg;

Patcher* _P;
PatcherInstance* _PI;

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

H3Dlg* __stdcall Y_Hero_DlgLvlUp(HiHook* h, H3Dlg* dlg, H3Hero* hero, UINT32 cadre, INT32 skillId1, INT32 skillId2)
{
   H3Dlg* result = THISCALL_5(H3Dlg*, h->GetDefaultFunc(), dlg, hero, cadre, skillId1, skillId2);   

    if (skillId1 != -1 && skillId2 != -1)
        dlg->CreateCancelButton(28, 413);

   return result;
}   

void HooksInit()
{
   // хук на диалог повышения уровня героя
   _PI->WriteHiHook(0x4F8F10, SPLICE_, EXTENDED_, THISCALL_, Y_Hero_DlgLvlUp);
}

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

const char* PLUGIN_NAME = "H3Dlg HeroLvlUp Cancel Button";

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
   static BOOL pluginOn = FALSE;
   switch (ul_reason_for_call)
   {
   case DLL_PROCESS_ATTACH:
      if (!pluginOn)
      {
         _P = GetPatcher();
         _PI = _P->CreateInstance(PLUGIN_NAME);


         HooksInit();
      }
      break;
   case DLL_THREAD_ATTACH:
   case DLL_THREAD_DETACH:
   case DLL_PROCESS_DETACH:
      break;
   }
   return TRUE;
}

 Скрин
Изображение
Вернуться к началу

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

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

Сообщение Rolex » 11 фев 2021, 20:44

То, что нужно. Огромное спасибо. :smile20:

Заметил один момент. Я взял _H3API_ от RoseKavalier из SoD_SP. И с кодом выше у меня не компилировалось из-за того, что функция CreateCancelButton не принимала аргументов.

После того, как заменил в H3Dialogs.cpp и H3Dialogs.hpp

Код: Выделить всё
_H3API_ H3DlgDefButton* H3BaseDlg::CreateCancelButton()

на

Код: Выделить всё
_H3API_ H3DlgDefButton* H3BaseDlg::CreateCancelButton(INT32 x, INT32 y)

и

Код: Выделить всё
_H3API_ H3DlgDefButton*      CreateCancelButton();

на

Код: Выделить всё
_H3API_ H3DlgDefButton*      CreateCancelButton(INT32 x, INT32 y);


Все скомпилировалось, но кнопка отмены накладывалась на кнопку ОК.
Чтобы это исправить пришлось немного изменить код CreateCancelButton из этого:

Код: Выделить всё
   _H3API_ H3DlgDefButton* H3BaseDlg::CreateCancelButton()
   {
      H3DlgDefButton* button = H3DlgDefButton::Create(widthDlg - 25 - 64, heightDlg - 50, int(H3Msg::ItemIDs::ID_CANCEL), NH3Dlg::Assets::CANCEL_DEF, 0, 1, TRUE, NH3VKey::H3VK_ESCAPE);
      if (button)
      {
         AddItem(H3DlgPcx::Create(widthDlg - 25 - 1 - 64, heightDlg - 50 - 1, NH3Dlg::Assets::BOX_64_30_PCX));
         AddItem(button);
      }
      return button;
   }


на этот:

Код: Выделить всё
   _H3API_ H3DlgDefButton* H3BaseDlg::CreateCancelButton(INT32 x, INT32 y)
   {
      H3DlgDefButton* button = H3DlgDefButton::Create(x, y, int(H3Msg::ItemIDs::ID_CANCEL), NH3Dlg::Assets::CANCEL_DEF, 0, 1, TRUE, NH3VKey::H3VK_ESCAPE);
      if (button)
      {
         AddItem(H3DlgPcx::Create(x - 1, y - 1, NH3Dlg::Assets::BOX_64_30_PCX));
         AddItem(button);
      }
      return button;
   }


PS: Хотя можно было оригинальную CreateCancelButton() и не трогать, а сделать как с OK (CreateOK32Button - с аргументами, CreateOKButton - без). То есть добавить в H3Dialogs.cpp и H3Dialogs.hpp новую функцию - CreateCancel32Button(INT32 x, INT32 y) и вызывать в плагине уже ее dlg->CreateCancel32Button(28, 413).
Вернуться к началу

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

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

Сообщение igrik » 12 фев 2021, 05:53

Всё верно. Я намеренно не упамянул, что метод создания кнопки Отмена без параметров. Но вы этот вопрос легко решили сами.
Поздравляю! :smile1:

PS: технически правильнее было не исправлять код метода, а создать перегрузку метода добавив в него параметры x, y
 Скрин
Изображение
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

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

Сообщение RoseKavalier » 12 фев 2021, 17:51

Good suggestion, typically I only add things as I need them so it'd be useful to get this feedback so everyone can benefit)
Изображение
Вернуться к началу

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

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

Сообщение Rolex » 12 фев 2021, 19:14

Сейчас думаю над еще одним довольно интересным и, как на меня, полезным плагином.

Суть в том, чтобы сделать так, чтобы после захвата внешнего жилища (где есть грейд, то есть все, кроме жилищ нейтралов) в нем можно было нанимать не только обычных, а также и грейженных юнитов (сделать окно найма как в замке после отстройки улучшенного жилища).

Существ же первого уровня тогда соответственно сделать с окном найма на платной основе, чтобы также можно было выбирать каких именно мы хотим нанять (и соответственно убрать диалог с бесплатным присоединением). Чтобы было наподобие того, как с Фабрикой големов.

 Скрины
Изображение

Изображение =====> Изображение


Но вот даже и не знаю насколько сложно будет подобное реализовать. Чтобы вместо дефолтного окна выводить окно с грейдом. Может быть есть простое решение с использованием _H3API_?
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

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

Сообщение RoseKavalier » 12 фев 2021, 20:01

In upcoming H3API update it will become easy to call this dialog with custom creatures.
But you'd still need to patch some things to handle resources cost if 2nd-3rd or 4th creature don't cost the same (e.g. no gems vs gems).
If no change in resource cost then it appears fine without modification.
Изображение

It's already rather simple to achieve with one hook around 0x4ABA3F.
Вернуться к началу

offlineArmageddets  
Новичок
Новичок
 
Сообщения: 21
Зарегистрирован: 31 окт 2018, 15:05
Пол: Не указан
Поблагодарили: 2 раз.

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

Сообщение Armageddets » 13 фев 2021, 09:57

Доброго времени суток, уважаемые разработчики. Спасибо Вам за помощь в предыдущий раз. Готовится очередной шоу турнир по героям 3 дыхание смерти и не хватает некоторых возможностей. Если у кого-то из Вас есть наработки в виде плагинов на перечисленные темы - это бы очень помогло. Плюс, может у Вас есть просто интересные плагины, которые еще не выложены на сайте - возможно некоторые из них мы бы тоже протестировали в текущем или последующих турнирах. Поскольку видео всех игр остаются на ютубе, то можно будет лично увидеть их работу.

Плагины, которые бы пригодились:
1. Запрет на прокачку всех героев, кроме стартового до 3-5 уровня либо вообще, чтобы не прокачивались совсем.
2. Видел код на сайте об отмене прокачки обоих выпавших навыков при поднятии уровня - интересная задумка
3. Ограничение на покупку количества героев (например в тхт файле вводить кол-во)
4. Отображение охраны объектов без посещения самих объектов со старта игры по правой кнопке мыши (как буд-то мы на них уже становились) - это позволит заранее знать размер объектов. В одном из форматов турнира этой возможности не хватало
5. Плагин, который бы автоматически принимал ход и сразу его пропускал (Это пригодилось бы для наблюдения за игроками - зайти в виде доп. игрока союзником и наблюдать за пемещениями игрока). Вообще для возможности и комфорта наблюдения за игроками не хватает только этого плагина и возможности просмотра финалки между игроками (за обычными боями игроков можно смотреть через опцию пвп битвы нейтрали). С ними бы игрокам можно было даже не стримить свои игры.
6. Удвоение или увеличение в 1.5 раза очков перемещений для всех героев
7. Добавление обелисков и убирание запрета заклинаний полет, дверь измерений и городской портал на картах размера М и S (HD mod их там блокирует)
8. Таймер в финальных боях (на ход каждым юнитом давать например по минуте и после этого ход передается следующему юниту)
9. Отображение охраны склепа, как в Хоте.
10. Отображение информации про грейженный стек среди нейтралов при клике правой кнопкой по ним
11. Накопление прироста во внешних жилищах, как в героях 2 и Хоте.
12. Возможность блокировки/разблокировки заклинаний, артефактов и объектов (например через тхт файл)
13. Возможности Фреш мода (там эти возможности работают только с галочкой GamePlay CHanges и нововведениями и иногда с турнирными правилами, которые не всегда нужны, поэтому с галкой вариант не подходит)
- Перестройка гильдии магов с любого уровня.
- На карте без воды исключены - водные заклинания, артефакты, навык навигация
- Улучшение питов требует только ГМ1.
- Врата ада - не требуют форт, стоят 4000.
- При наведении на ученого, в строке состояния, показывается тип бонуса, который он дает
- Астрал удваивает силу заклинания Гипноз, на любом уровне.

Заранее всем спасибо. Если что-то подобное или другие интересные решения найдутся - это очень поможет. Если нет - ничего страшного. Буду следить на этом форуме или можете писать сюда:
https://vk.com/armaggame
okzona1@rambler.ru
Вернуться к началу

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

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

Сообщение Rolex » 13 фев 2021, 15:09

RoseKavalier писал(а):

In upcoming H3API update it will become easy to call this dialog with custom creatures.

How to do it now?

RoseKavalier писал(а):

But you'd still need to patch some things to handle resources cost if 2nd-3rd or 4th creature don't cost the same (e.g. no gems vs gems).

Is this only for level 7 creatures?

RoseKavalier писал(а):

It's already rather simple to achieve with one hook around 0x4ABA3F.

Код: Выделить всё
H3Dlg* __stdcall RecruitCreaturesUpg(HiHook* h, H3Dlg* dlg, ?, ?, ? ...)
{
   ???
   return result;
}
...
_PI->WriteHiHook(0x4ABA3F, SPLICE_, EXTENDED_, THISCALL_, RecruitCreaturesUpg);
Вернуться к началу

Пред.След.

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

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

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