Объявления
Поздравляем
Roman2211


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 04 июл 2019, 13:06

The best way is add one checkbox to that form.
But own dialog is also acceptable.
Вернуться к началу

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

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

Сообщение RoseKavalier » 04 июл 2019, 19:22

Hooking by needle, requires latest H3API update.

Код: Выделить всё
#pragma pack(push, 1)
struct HDDlg : public H3Dlg
{
   // * +70
   h3func HDproc;
};
#pragma pack(pop)

h3func HWproc;
PatcherInstance *_PI;

int __stdcall _HH_RunDialog(HiHook *h, HDDlg *dlg, int a2);

void GetHWproc()
{
   H3DLL HW;
   HW.GetDLLInfo("HW_SOD.dll");

   BYTE vt_needle[] = { 0xB0, 0xF9, 0x48, 0x00, 0xA0, 0xF0, 0x5F, 0x00 }; // vtable first 2 entries
   DWORD vtDword = HW.NeedleSearchData(vt_needle, sizeof(vt_needle));
   if (vtDword)
   {
      H3DlgVTable * vt = (H3DlgVTable *)vtDword;
      _PI->WriteHiHook((h3func)&vt->runDlg, FUNCPTR_, THISCALL_, _HH_RunDialog); // only hook run dialog from HW mod
   }
}

int __stdcall MyProc(HDDlg * dlg, H3Msg * msg)
{
   if (msg->IsRightClick())
      F_MessageBox("We have hooked this dialog.");

   return STDCALL_2(int, HWproc, dlg, msg);
}

int __stdcall _HH_RunDialog(HiHook *h, HDDlg *dlg, int a2)
{
   if (P_NewGameDlg) // if we're in lobby
   {
      HWproc = dlg->HDproc; // store HW proc
      dlg->HDproc = (h3func)MyProc; // replace with my own proc
      dlg->CreateBlackBox(5, 5, 30, 20); // modify dialog
   }
   return THISCALL_2(int, h->GetDefaultFunc(), dlg, a2); // run dialog
}


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

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 05 июл 2019, 06:02

Updated H3API, but having crash in this string:
Код: Выделить всё
DWORD vtDword = HW.NeedleSearchData(vt_needle, sizeof(vt_needle));

HD_CRASH_LOG.TXT
(5.79 КБ) Скачиваний: 224


Here is the start (RoseKavalierSDK.cpp):
Код: Выделить всё
void RoseKavalierSDK_init(PatcherInstance *pi)
{
   pi->WriteLoHook(0x40D0DB, MapHintCoordinates);
        ....
   GetHWproc(pi);

}
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 05 июл 2019, 12:31

How to get RMG_MapItem?
Tried this:
Код: Выделить всё
RMG_MapItem* AAA = RMG_Map::GetMapItem(9,66,0);
Вернуться к началу

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

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

Сообщение RoseKavalier » 05 июл 2019, 13:41

Recall that HW_SOD is loaded later so you have to place this function after it is added, the required address I have previously shared.

RMG_MapItem, you need to extract RMG_Main from the stack / registers, e.g.
It is not a fixed address like combat manager or others.
Код: Выделить всё
RMG_Main * rmg = (RMG_Main *)c->esi;
RMG_MapItem * xyz = rmg->GetMapItem(x, y, z);
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 05 июл 2019, 14:04

Цитата:
Recall that HW_SOD is loaded later so you have to place this function after it is added, the required address I have previously shared.

It works now!
And how to transform that lovely BlackBox to CheckBox?
Вернуться к началу

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

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

Сообщение RoseKavalier » 05 июл 2019, 15:08

Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 05 июл 2019, 15:37

And how to set text?

It's crashes:
Код: Выделить всё
     H3DlgDefButton *FlagCheckBox = dlg->CreateOnOffCheckbox(190, 37, 30, 20);
     FlagCheckBox->SetText("ААА");


And how to change values?
Вернуться к началу

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

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

Сообщение RoseKavalier » 05 июл 2019, 15:58

Each item you see on a dialog is a separate element, including text.
You have to create a separate H3DlgText field to place your description there.

SetText() is for items that contain text themselves: H3DlgText, H3DlgEdit, H3DlgCaptionButton, H3DlgHintBar, H3DlgTextPcx.
I will separate these things better in the future.

Also you will either want to add a button id to use to update your flag, ~or~ use a button with a custom proc (H3DlgCustomButton) which will itself set the needed flags.
In the second case, there is no need to change the dlg proc, this part
Код: Выделить всё
      HWproc = dlg->HDproc; // store HW proc
      dlg->HDproc = (h3func)MyProc; // replace with my own proc
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 05 июл 2019, 16:23

Needs code example for H3DlgCustomButton.
Вернуться к началу

Пред.След.

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

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

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

cron