Объявления

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

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

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

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

Сообщение Rolex » 21 апр 2021, 13:46

Вот мы добрались до еще одного очень интересного и полезного плагина написанного уже на H3API. Но его немножко нужно довести до ума.

1) После нажатия на кнопку «Купить» окно покупки существ не закрывается. Золото и ресурсы на покупку снимаються только после того, как самостоятельно закрываешь окно. В оригинале окно закрывается.

 Картинки
Изображение
Изображение


2) Слабые неулучшенные существа 7 уровня не требуют особо ценных ресурсов (ртуть / сера / кристаллы / драгоценные камни). Только золото.
Для улучшенных требуется 1 особо ценный ресурс на каждое существо. Бегемоты / Древние чудовища, Костяные драконы / Призрачные драконы, Гидры / Гидры Хаоса, Жар-птицы / Фениксы

Остальные существа 7-го уровня: не грейженные - 1 ценный ресурс; грейженные - 2 ценных ресурса.

При покупке улучшенных существ количесвто особо ценных ресурсов не отображается (для Behemoths / Ancient Behemoths, Bone Dragons / Ghost Dragons, Hydras / Chaos Hydras, Firebirds / Phoenixes):

 Картинки
В городе: Изображение Изображение
В жилище:Изображение Изображение


Лучше конечно сделать порядок такой, как в городе. Изначально грейженные, потом обычные. Чтобы отображение по ресурсам было идентично.

3) Жилищам 1 уровня необходимо платное окно с возможностью выбора существ. А также убрать диалог бесплатного присоединения.

 Картинки
Изображение
Изображение
Изображение


Мне RoseKavalier пытался что-то подсказать, но я так сам и не разобрался.
----------
1- You'll have to search the proc. ERA does something similar, look in
https://github.com/ethernidee/era/blob/ ... llings.pas
https://github.com/ethernidee/era/blob/ ... s.pas#L716

2- Put upgraded creature first to fix resources, that's how the dialog is handled in town. Accumulating is not an issue, it uses the same address to store quantity.

3- HDmod is an issue with this. Look at 0x4A17BD and check to make a conditional jump.
Also:
4AB97B+1 -> 00
4AB812+1 -> 00
----------
Вы что-то подобное делали с Ben80 в плагине Гордского портала, когда убирали диалог с подтверждением на уровне Basic (jump) и заменяли его окном с выбором городов, как у Advanced и Expert.

В общем вот код, который имеется на данный момент. Он работает, но мне нужна помощь, чтобы его допилить по вышеописанным пунктам. Использую одиночный заголовок single_header.

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

#include "H3API-master\single_header\H3API.hpp"

using namespace h3;

Patcher* _P;
PatcherInstance* _PI;


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

   int upgrade = H3Creature::GetUpgrade(dwelling.creatureTypes[0]);
   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;
}
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2161 раз.

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

Сообщение AlexSpl » 22 апр 2021, 15:11

Цитата:
1) После нажатия на кнопку «Купить» окно покупки существ не закрывается. Золото и ресурсы на покупку снимаються только после того, как самостоятельно закрываешь окно. В оригинале окно закрывается.

Не понимаю, зачем это. Что можно делать в диалоге найма существ после нажатия на кнопку найма?

Цитата:
2) Слабые неулучшенные существа 7 уровня не требуют особо ценных ресурсов (ртуть / сера / кристаллы / драгоценные камни). Только золото.
Для улучшенных требуется 1 особо ценный ресурс на каждое существо. Бегемоты / Древние чудовища, Костяные драконы / Призрачные драконы, Гидры / Гидры Хаоса, Жар-птицы / Фениксы

Остальные существа 7-го уровня: не грейженные - 1 ценный ресурс; грейженные - 2 ценных ресурса.

Это можно делать в хуке afterInit(). См., например, как меняется стоимость палатки в плагине NewFirstAidTent.
Вернуться к началу

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

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

Сообщение Rolex » 22 апр 2021, 16:32

AlexSpl писал(а):

Не понимаю, зачем это. Что можно делать в диалоге найма существ после нажатия на кнопку найма?

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

AlexSpl писал(а):

Это можно делать в хуке afterInit(). См., например, как меняется стоимость палатки в плагине NewFirstAidTent.

Понимаете, здесь уже все написанно на H3API, в котором я мало что смыслю. А потому здесь нужно ибо переписывать плагин используя homm3.h ибо уже все писать на H3API. Поэтому я и обратился к Вам за помощью.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2161 раз.

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

Сообщение AlexSpl » 22 апр 2021, 19:09

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

Понял, о чём Вы. В оригинале тоже не закрывается, когда есть выбор из нескольких разных существ/боевых машин, кроме диалога, предлагающего выбор между улучшенным и неулучшенным существом в городе. Видимо, здесь вызывается не такой диалог, как в городе, а должен вызываться городской диалог. Я правильно понял? Тогда как понять, когда в жилище можно нанимать улучшенных существ, а когда нет?

Цитата:
Понимаете, здесь уже все написанно на H3API, в котором я мало что смыслю. А потому здесь нужно ибо переписывать плагин используя homm3.h ибо уже все писать на H3API. Поэтому я и обратился к Вам за помощью.

Тут только одна функция, показывающая диалог с грейдом. Её нужно всё равно переписывать на вызов городского диалога.
Вернуться к началу

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

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

Сообщение Rolex » 22 апр 2021, 20:10

AlexSpl писал(а):

В оригинале тоже не закрывается, когда есть выбор из нескольких разных существ/боевых машин

Да, действительно. Это касается Фабрики големов и Фабрики боевых машин. Но там каждое существо идет отдельно. Тут же идея в том, чтобы сделать диалог в жилище, как в городе. Кол-во грейженных и обычных связаны между собой, оно одно для обоих.

AlexSpl писал(а):

кроме диалога, предлагающего выбор между улучшенным и неулучшенным существом в городе

Вот именно такой диалог и нужен. Чтобы закрывался сам, как в городе за исключением Фабрики големов и Фабрики боевых машин (их мы не трогаем). То есть если в Фабрике големов мы можем нанять каждый вид големов отдельно, то в остальных жилищах нужно сделать такой диалог как в городе. И порядок такой же. Изначально грейженные существа, потом обычные. Грейженные выделены по умолчанию. Например, базовый прирост Наг равен 2. В жилище мы можем нанять либо 2 Королевы Наг, либо 2 Наги. Если игрок нанял 1 Королеву Наг, то на этой неделе он может нанять, либо еще 1 грейженную, либо 1 обычную. Все как в городе в общем.

AlexSpl писал(а):

Тогда как понять, когда в жилище можно нанимать улучшенных существ, а когда нет?

В этом и есть вся суть плагина, сделать так, чтобы после захвата жилища можно было всегда нанимать, как грейженных, так и обычных существ. Как в городе, на выбор игрока. Только вот для жилищ 1 уровня понадобится еще убрать диалог с халявным присоединением и вместо него вызывать городское окно существ 1 уровня уже на платной основе с выбором нужных нам существ: грейженные и обычные.

AlexSpl писал(а):

Тут только одна функция, показывающая диалог с грейдом. Её нужно всё равно переписывать на вызов городского диалога.

Надеюсь, Вы поможите это сделать.
Вернуться к началу

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

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

Сообщение igrik » 23 апр 2021, 10:39

Rolex писал(а):

По ссылке, которую вы дали речь за Герои 2. Я понимаю, что там все похоже делается, но есть и нюансы, плюс все Ваши картинки умерли. Очень сложно без них разобраться в общем.


Вот на вогфоруме сделана маленькая тема обучению реверсу. Почитайте на досуге. Хоть она и для ВОГа написана, но для СОДа она применима в той же мере.
http://wforum.heroes35.net/showthread.php?tid=5706
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2161 раз.

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

Сообщение AlexSpl » 24 апр 2021, 02:37

WIP:

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

Patcher* _P;
PatcherInstance* _PI;

int __stdcall setCreatures(LoHook* h, HookContext* c)
{
    _Dwelling_* dwelling = (_Dwelling_*)c->esi;
    int upgMonId = CALL_1(int, __fastcall, 0x47AAD0, dwelling->creature_types[0]);
   
    if ( upgMonId != ID_NONE ) {
        dwelling->creature_types[1] = dwelling->creature_types[0];
        dwelling->creature_counts[1] = dwelling->creature_counts[0];
        dwelling->creature_types[0] = upgMonId;
        if ( dwelling->defenders.type[0] != ID_NONE )
            dwelling->defenders.type[0] = upgMonId;
    }

    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.NewDwellings");
            _PI->WriteLoHook(0x4B85EE, setCreatures);
        }
    }

    return TRUE;
}

Всё остальное (включая покупку из двеллингов 1-го уровня за золото) исправляется отдельным хуком на покупку.
Вернуться к началу

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

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

Сообщение Rolex » 24 апр 2021, 07:06

AlexSpl писал(а):

WIP:

Спасибо, конечно. Но Вы, видимо, меня не так поняли. Получилось все наоборот. :smile1:

То есть сейчас все работает так, как на Фабрике големов. Если мы наняли всех Железных големов, то можем отдельно нанять еще и Камянных големов, то есть кол-во у каждого свое. Я же хотел Фабрику големов и боевых машин оставить как исключение, как есть в оригинале и не трогать их вообще. А вот для всех остальных жилищ сделать общее кол-во, как для грейженных, так и для обычных. А то уж слишком жирно получается, наняли 1 Архангела и можем нанять еще и 1 Ангела. А нужно: если наняли 1 Архангела, то 1 Англела уже нанять мы не можем, так как кол-во одно для обоих, как в замке. И диалог сразу же после нажатия на кнопку найма должен закрыватся самостоятельно.

AlexSpl писал(а):

Всё остальное (включая покупку из двеллингов 1-го уровня за золото) исправляется отдельным хуком на покупку.

Очевидно, что на данном этапе сам я этого пока не сделаю. Там нужно убрать этот диалог с бесплатным присоединением и вызвать вместо него городское для двеллинга 1-го уровня (jump - условный переход).
Цитата:
HDmod is an issue with this. Look at 0x4A17BD and check to make a conditional jump. Also: 4AB97B+1 -> 00 ... 4AB812+1 -> 00


Rolex писал(а):

Вы что-то подобное делали с Ben80 в плагине Гордского портала, когда убирали диалог с подтверждением на уровне Basic (jump) и заменяли его окном с выбором городов, как у Advanced и Expert.

Код: Выделить всё
int __stdcall skipTownPortalConfirm(LoHook* h, HookContext* c)
{
   if ( c->eax == -1 ) {
      c->ecx = *(unsigned char*)(c->edi + 5); // Выполняем затёртую jmp-патчем команду
      c->return_address = 0x41D990; // Обходим jmp-патч
      return NO_EXEC_DEFAULT;
   }
   
   c->return_address = 0x41D939;
   return NO_EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x41D934, skipTownPortalConfirm); // обходим jmp патч HD мода (версии 3.809 и выше)
Последний раз редактировалось Rolex 24 апр 2021, 07:18, всего редактировалось 2 раз(а).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2161 раз.

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

Сообщение AlexSpl » 24 апр 2021, 07:16

Я же написал про "всё остальное". Спокойно :smile1: Код HD-мода обходить не нужно.

Такой вопрос: существ в Героях 3 можно нанять только в городе и внешних жилищах? Или я чего-то не помню уже?
Вернуться к началу

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

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

Сообщение Rolex » 24 апр 2021, 07:33

AlexSpl писал(а):

Такой вопрос: существ в Героях 3 можно нанять только в городе и внешних жилищах? Или я чего-то не помню уже?

Лагерь беженцев на карте + Портал вызова в Темнице (не помню только, встречается ли он на карте или только в городе Темница/Подземелье).
Вернуться к началу

Пред.След.

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

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

Сейчас этот форум просматривают: Yandex [bot] и гости: 6

cron