Объявления

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

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

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

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

Сообщение RoseKavalier » 05 июл 2019, 18:04

Update H3API again. and again.

Код: Выделить всё
BOOL myFlag;

int __fastcall MyButtonProc(H3MsgCustom *msg)
{
   H3DlgCustomButton *b;

   // if you like to live dangerously...
   __asm MOV b, ESI

   if (msg->IsLeftClick())
   {
      // if you prefer being safe, recoup the button structure through the dialog
      //H3DlgCustomButton *b = (H3DlgCustomButton*)msg->GetDlg()->GetH3DlgItem(1234);

      if (b)
         b->ToggleFlag(myFlag);
   }
   else if (msg->IsRightClick())
   {
      sprintf(h3_TextBuffer, "Flag state is %d", myFlag);
      F_MessageBoxRMB();
   }

   return 1;
}

int __stdcall _HH_RunDialog(HiHook *h, HDDlg *dlg, int a2)
{
   if (P_NewGameDlg) // if we're in lobby
   {
      //HWproc = dlg->HDproc; // HW proc no longer needed

      // playing safe : create button with ID
      //dlg->CreateCustomButton(5, 5, 1234, "ChkBlue.def", MyButtonProc, myFlag, !myFlag);

      // playing more risky - no id!
      dlg->CreateCustomButton(5, 5, "ChkBlue.def", MyButtonProc, myFlag, !myFlag);
   }
   return THISCALL_2(int, h->GetDefaultFunc(), dlg, a2); // run dialog
}
Вернуться к началу

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

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

Сообщение as239 » 06 июл 2019, 03:55

Thanks a lot!
Is it correct way to be safe :)?
Код: Выделить всё
         
//MyButtonProc
H3DlgCustomButton *b = (H3DlgCustomButton*)msg->GetDlg()->GetH3DlgItem(CheckBoxID);
//_HH_RunDialog
H3DlgCustomButton *FlagCheckBox = dlg->CreateCustomButton(180, 36, "ChkBlue.def", MyButtonProc, GamePlayChangesOn, !GamePlayChangesOn);
CheckBoxID = FlagCheckBox->GetID();

How to save flag in save game?
Because after load game it wiil be reset.

How to transfer flag value to the playres?
Here is host having flag on, but the second player doesn't.
 
Изображение
Вернуться к началу

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

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

Сообщение RoseKavalier » 06 июл 2019, 13:10

You need to assign an id when using CreateCustomButton(), the function is overloaded [different required arguments] a few times to simplify one's life.
If you look at the function template, you'll see it goes like (x, y, def_name, custom_proc, normal_frame, clicked_frame)
When you use this version, then id is assumed 0, and there are a lot of dialog items with id 0 !

Use the same version I did when creating safely (x, y, ID, def_name, custom_proc, normal_frame, clicked_frame), and define your CheckBoxID.
Код: Выделить всё
#define CheckBoxID 1234


Saving
This one is tricky.

Adding a value to GM* file is simple, and reading the value (need to modify load function as well) is also straight-forward.
But how do you distinguish a Freshmod save from a non-freshmod save?
If you read a value from the save file and it's not meant for you, the game can crash.

You also have to think about future, will there be more than one flag in the future?

You need a good plan here before moving ahead.

Net trading
Given that I don't study multiplayer there are things I don't know, this is one of them!
Maybe igrik knows :?: If not look through WoG source.

An alternative is to have spot checks for flag value through a hook somewhere.

You would also benefit from having a way to ensure connected players use Freshmod and the same version to solve some of these issues and prevent crashes.
(Again, don't know)
Вернуться к началу

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

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

Сообщение as239 » 07 июл 2019, 04:29

Saving
The games started without FreshMod, no needs to contine with it.
Of course, I'll warn players whay they can contine they saves (before ver. 3.2) only with started version.
99% it will be one flag - "Gameplay changes".

HW rules.
Is it posible to get the value of the "HW rules" flag?
Последний раз редактировалось as239 07 июл 2019, 04:39, всего редактировалось 3 раз(а).
Вернуться к началу

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

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

Сообщение as239 » 07 июл 2019, 04:30

@igrik
Можешь помочь с этим вопросом?
Как передать значение флага от хоста, остальным игрокам?
Вернуться к началу

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

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

Сообщение as239 » 07 июл 2019, 04:35

Хотел еще спросить:
В коде орлиного глаза есть 2 строчки убирающие оригинальный эффект:
Код: Выделить всё
   _PI->WriteHexPatch(0x469C23, "EB");
   _PI->WriteHexPatch(0x476996, "E9 DD 01 00 00");

Мне нужно чтобы в зависимости от значения флага, который устанавливается перед стартом игры, они включались или выключались.
Первую я через LowHook сделал:
Код: Выделить всё
int __stdcall EagleEye469C23(LoHook* h, HookContext* c) {
   if (GamePlayChangesOn) NO_EXEC_DEFAULT;
   return EXEC_DEFAULT;
}

А вот как вторую сделать через LowHook?
Вернуться к началу

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

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

Сообщение as239 » 07 июл 2019, 05:38

I was thinking what "isBlocked" don't allow to go road throw this tile.
But as i see almost all tiles have it setted.
F.e. looking at 0x548530, before roads starts:
Код: Выделить всё
   RMG_Main * rmg = (RMG_Main *)c->esi;
   RMG_MapItem * xyz = rmg->map.GetMapItem(7, 66, 0);
   sprintf(h3_TextBuffer, "7,66: ID zone1: %d ID zone2: %d isBlocked: %d mustBeBlocked: %d canBeBlocked: %d", xyz->zone.zone1, xyz->zone.zone2, xyz->tileData.isBlocked, xyz->tileData.mustBeBlocked, xyz->tileData.canBeBlocked );
   F_MessageBox(h3_TextBuffer);

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

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 » 07 июл 2019, 14:15

2as239: Например, так:

Код: Выделить всё
int __stdcall EagleEye476996(LoHook* h, HookContext* c) {
    if (GamePlayChangesOn) {
        c->return_address = 0x476B78;
        return NO_EXEC_DEFAULT;
    }
   
    return EXEC_DEFAULT;
}
Вернуться к началу

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

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

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

Спасибо! Все получилось.
Вернуться к началу

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

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

Сообщение RoseKavalier » 08 июл 2019, 19:47

As I recall, some of these fields are overwritten several times during the RMG process.
The issue becomes finding the correct place to assess the values
Вернуться к началу

Пред.След.

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

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

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

cron