Объявления
Поздравляем
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 » 13 фев 2021, 17:33

Цитата:
Плагины, которые бы пригодились:
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.
- При наведении на ученого, в строке состояния, показывается тип бонуса, который он дает
- Астрал удваивает силу заклинания Гипноз, на любом уровне.


Пункты 4, 9, 10, 11 как раз обсуждались пару страниц назад. Пункт 5 я делал для себя, чтобы быстро проскипать дни до определённой даты в синглплеере. Думаю, в мультиплеере нужно ещё и сообщение о получении хода пропускать. Поищу код. Пункт 6 делается элементарно (могли бы и сами написать). Пункт 13 (Фрешмод) частично тоже здесь. Код для учёного точно. Остальные нигде не встречал. Нужно писать.
Вернуться к началу

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

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

Сообщение RoseKavalier » 13 фев 2021, 22:07

Rolex писал(а):

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?

I've not looked extensively, I just added the class definition to h3api and noticed that if the creature costs something other than gold then you get this issue.

Rolex писал(а):

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);

Код: Выделить всё
RecruitMgr *__thiscall RecruitMgr::RecruitMgr_00551750(RecruitMgr *this, H3Army *army, char is_summoning_portal, int type0, __int16 *amount0, int type1, __int16 *amount1, int type2, __int16 *amount2, int type3, __int16 *amount3)
Yes, pointer* not reference&.

Splice is for beginning of routine, this would be a Call candidate.
But given that this region of code also handles GENERATOR_TYPE_4, (H3Dwelling&)ebx, you'll want LoHook to distringuish the type.
Then just replace parameters to do (this, army, is_summoning_portal, type0, *amount0, type1, *amount0, ...) so that both types pull from the same source.
Вернуться к началу

offlinearonir  
имя: aronir
 
Сообщения: 3
Зарегистрирован: 07 янв 2021, 19:21
Пол: Мужчина
Поблагодарили: 0 раз.

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

Сообщение aronir » 14 фев 2021, 07:08

Цитата:
11. Накопление прироста во внешних жилищах, как в героях 2 и Хоте.

viewtopic.php?f=56&t=518&start=1870#p21242 можете попробовать, накопление существ, если внешнее жилище принадлежит Игроку или ПК, если не принадлежит, то не копятся.
Вернуться к началу

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

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

Сообщение Armageddets » 14 фев 2021, 07:15

Спасибо большое всем за помощь.
Вернуться к началу

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

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

Сообщение Rolex » 14 фев 2021, 15:00

RoseKavalier писал(а):

Splice is for beginning of routine, this would be a Call candidate.
But given that this region of code also handles GENERATOR_TYPE_4, (H3Dwelling&)ebx, you'll want LoHook to distringuish the type.
Then just replace parameters to do (this, army, is_summoning_portal, type0, *amount0, type1, *amount0, ...) so that both types pull from the same source.

Thanks. But I'm afraid I can't do it alone. There are too many issues.
Level 1 dwellings require a paid window with a choice of creatures. And also remove the dialogue with free join.
Will you have the time and opportunity to help fully implement this function (RecruitMgr)?
Вернуться к началу

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

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

Сообщение RoseKavalier » 15 фев 2021, 03:58

Try something like this, untested.
Код: Выделить всё
_LHF_(AdvMapGeneratorUpgrades)
{
   auto& dwelling = c->Ebx<H3Dwelling>();
   if (dwelling.creatureTypes[1] != -1) // not GENERATOR_1 type
      return EXEC_DEFAULT;
   
   int upgrade = H3Creature::GetUpgrade(dwelling.creatureTypes[0]); // was F_GetCreatureUpgrade(int), I am deprecating all F_ functions in upcoming update...
   if (upgrade == -1) // neutral creature
      return EXEC_DEFAULT;
   
   c->Pop();
   c->Pop();
   c->Push(int(&dwelling.creatureCounts[0]); // share creature count with unupgraded type
   c->Push(upgrade);
   
   return EXEC_DEFAULT;
}

[...]

Hook(0x4ABA2F, AdvMapGeneratorUpgrades);
Вернуться к началу

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

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

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

I took H3API from here (https://github.com/RoseKavalier/H3Plugins) and put it in the project folder next to dllmain.cpp.

I Included H3API.hpp in the project
#include "H3API/lib/H3API.hpp"

But something is wrong:
Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#define _H3API_PATCHER_X86_

#include "H3API/lib/H3API.hpp"

using namespace h3;


Patcher* _P;
PatcherInstance* _PI;


int __stdcall AdvMapGeneratorUpgrades(LoHook *h, HookContext *c)
{
   auto& dwelling = c->ebx<H3Dwelling>;
   if (dwelling.creatureTypes[1] != -1) // not GENERATOR_1 type
      return EXEC_DEFAULT;

   int upgrade = H3Creature::GetUpgrade(dwelling.creatureTypes[0]); // was F_GetCreatureUpgrade(int), I am deprecating all F_ functions in upcoming update...
   if (upgrade == -1) // neutral creature
      return EXEC_DEFAULT;

   c->Pop();
   c->Pop();
   c->Push(int(&dwelling.creatureCounts[0])); // share creature count with unupgraded type
   c->Push(upgrade);

   return EXEC_DEFAULT;
}

void HooksInit()
{
   // Hook
   _PI->WriteLoHook(0x4ABA2F, AdvMapGeneratorUpgrades);
}

const char* PLUGIN_NAME = "CreatureUpgrade";

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;
}


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

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

По пропуску ходов. Нашёл вот какой код у себя (с использованием H3API):

Код: Выделить всё
int __stdcall skipTurns(LoHook* h, HookContext* c)
{
    int i, result, a1, a2, a3, a4, a5;

    a1 = c->ecx;
    a2 = c->edi;
    a3 = c->ebp - 1;
    a4 = c->eax;
    a5 = c->edx;
   
    for (i = 1; i <= 5; ++i) {
        if ( !*(int*)0x69CCF4 ) {
            c->eax = THISCALL_5(int, 0x4099D0, a1, a2, a3, a4, a5);
            // sprintf(h3_TextBuffer, "%d", i);
            // F_MessageBox();
        }
    }
   
    c->return_address = 0x408999;
    return NO_EXEC_DEFAULT;
}

...

_PI->WriteLoHook(0x408994, skipTurns);

Для пропуска сообщений можно хукнуть функцию показа сообщений и отключать любые для нашего игрока на время автопропуска.
Отсюда нужна только функция THISCALL_5(int, 0x4099D0, a1, a2, a3, a4, a5); или CALL_5(int, __thiscall, 0x4099D0, a1, a2, a3, a4, a5); если использовать homm3.h, которая обрабатывает нажатие на клавишу пропуска хода. Параметры можно подсмотреть в дебагере при реальном нажатии. Или поискать, что каждый значит в H3API. Ещё, наверное, можно просто эмулировать нажатие.
Вернуться к началу

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

Посмотрел внимательнее функцию sub_4099D0 (в Heroes3f.idb она именуется ProcessAdvMapButtonEvents):

Изображение

Видно, что последние три параметра вовсе не константы (передаются адреса переменных - lea), в них функция возвращает некоторые значения, которые ниже по коду анализируются. А я думал всё: почему меня после пропуска ходов выкидывало в главное меню :smile5:

Вопрос знающим тонкости патчера: макрос CALL_X() умеет возвращать значения по ссылке?
Вернуться к началу

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

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

Сообщение RoseKavalier » 17 фев 2021, 13:30

@AlexSpl
Yea it's fine, reference is essentially a "smart" pointer (not in the sense of unique_ptr and co. :smile2: ).

@Rolex
1. You changed the code, H3API includes a patcher header with easy-cast converters.
2. Read the // comment
Вернуться к началу

Пред.След.

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

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

Сейчас этот форум просматривают: Bing [Bot] и гости: 8

cron