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


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineigrik  
Подмастерье
Подмастерье
 
Сообщения: 108
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 84 раз.

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

Сообщение igrik » 09 июл 2019, 07:39

as239 писал(а):

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

Опиши детально что ты хочешь отослать и в какой момент.
Вернуться к началу

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

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

Сообщение as239 » 09 июл 2019, 16:13

Цитата:
Опиши детально что ты хочешь отослать и в какой момент.

1. Создаем сетевую игру в лобби
2. Подключаемся вторым игроком, выбираем любой шаблон, например Jebus Cross.
3. Хост нажимает "Начать", выскакивает следующее окно:
 
Изображение

Здесь все ОК, с помощью RoseKavalier, добавлен мой флаг "Gameplay changes", который включает/отключает нужные изменения - в коде уже все сделано.
Взводим флаг "Gameplay changes" и нажимаем галочку.
4. У второго игрока выскакивает этот же диалог:
 
Изображение

Но, как видно, флаг "Gameplay changes" не взведен.
А нужно чтобы его значение пришло от хоста, как остальные настроечные флаги на этой форме.
Ну и естественно, не должно быть возможности его редактировать.
Вернуться к началу

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

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

Сообщение as239 » 09 июл 2019, 16:18

@RoseKavaler
Founded what flag is visiable on this form (when host starts the game):
 
Изображение

How can I fix this?

And can I ask you code example for saving\loading this flag(Gameplay changes)?
Вернуться к началу

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

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

Сообщение RoseKavalier » 09 июл 2019, 17:59

Hmm, there needs to be another condition for creating the button, I was not aware there was more than one dialog in lobby (:

Код: Выделить всё
if (P_NewGameDlg) // if we're in lobby


Easiest would be to check dialog's dimensions, if width greater than (example) 200 then add the button, you just need to figure out the dimensions of the second dialog.
Safer way is to check for the ID of an existing H3DlgItem that is on the first but not second dialog.

Save / load
I don't have one handy right now and the H3SaverLoader structure is a bit bare to show it, I'll update later with it.
Вернуться к началу

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

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

Сообщение igrik » 09 июл 2019, 18:41

as239 писал(а):

Но, как видно, флаг "Gameplay changes" не взведен.
А нужно чтобы его значение пришло от хоста, как остальные настроечные флаги на этой форме.
Ну и естественно, не должно быть возможности его редактировать.

Этот код будет работать только в главном меню (при выборе сценария)
Я не знаю, будет ли он работать в окне с настройками HW
Если не будет, то нужно ставить хук в процессе диалога HW и парсить данные там

Код: Выделить всё
#define as239NData 1990 // номер id данных (NData->msg_id)
struct _NetData_
{
 _int_ recipient_id;       // +0 (номер игрока кому передаётся. (-1 = всем) )
 _int_ field_04;         // +4
 _int_ msg_id;            // +8 (id данных)
 _int_ size;            // +12   (размер буфера (20 + size shortData))
 _int_ field_10;         // +16
 _int_ shortData;         // +20 (наши данные, могут иметь больший объем)
 // _int_ shortData1;   // при необходимости    

 inline _int32_ SendData() {return CALL_4(_int32_, __fastcall, 0x5549E0, this, 127, 0, 1);}
};


int __stdcall Y_ParseNetData_MainMenu(LoHook* h, HookContext* c)
{
   _NetData_ *NData = *(_NetData_**)(c->ebp +8);
   if (NData->msg_id == as239NData ) {
      sprintf(o_TextBuffer, "shortData: %d", NData->shortData);
      b_MsgBox(o_TextBuffer, 1);
   }
   return EXEC_DEFAULT;
}

////////////////////////////////////////////////////////////////
//   этот код используем в необходимом участке передачи (хост)
////////////////////////////////////////////////////////////////
if (o_NetworkGame)
{
      _NetData_ *NData;
      NData->recipient_id = -1;
      NData->field_04 = 0;
      NData->msg_id = as239NData;
      NData->size = 24;
      NData->field_10 = 0;
      NData->shortData = 35; // передаю число 35
      NData->SendData();
}


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

_PI->WriteLoHook(0x588AC3, Y_ParseNetData_MainMenu); // хук (парсим данные)

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

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

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

Сообщение as239 » 10 июл 2019, 05:27

Спасибо!
Никак не могу найти адрес, на который нужно поставить отправку данных.

Сделал отправку в момент установки флага, не совсем верно конечно, но работает.
Остался вопрос как отличить хоста, от остальных игроков, чтобы сделать недоступным для них флаг.
Вернуться к началу

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

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

Сообщение RoseKavalier » 11 июл 2019, 00:37

H3API updated, now H3Stream has Save() and Load() functions. Values should be passed by reference! e.g.
Код: Выделить всё
H3Stream *s = (H3Stream *)c->ecx;
s->Save(&myFlag, sizeof(myFlag));

s->Load(&myFlag, sizeof(myFlag));


I would recommend that you save more than just this flag and go over future-proof method like this:
Код: Выделить всё
    DWORD FreshSaveDataSize; // sizeof(FreshSaveData);
struct FreshSaveData {
    DWORD Version; // if needed to prevent going to older versions for example
    BOOL myFlag;    // any data you need here
    ... // room for future data
};


Now, two issues remain:
1- suitable hook locations
2- detecting if a saved game has freshmod. If it does, your save/load hooks should activate. It not, then they should simply return EXEC_DEFAULT;

For (2) I would suggest that you modify the save game header. For example, you have "H3SVG" being used for regular games, "H3SVC" for campaign games and so on.
Therefore, loading a map that reads "H3FRESH" would show it uses your plugin [7 chars + '\0' of room for 8 total]. This may have some hidden implications, you'll see and can tell me :)
H3SVG is used at 0x4BC041 (? 0x4BE111 ? 0x4BC2AA) to save games and when loading games it's at (...0x4BC51A but HDmod has a hook at 0x4BC515, so head to...) 0x4BC526 and read c->esi for the save text.

For (1), HW_rulez uses the very end of the file so it's not a good candidate, try right after map header, try these for !!SoD only!! (not AB or RoE)
Loading 0x4BCC8A:
Код: Выделить всё
H3Stream *s = (H3Stream *)c->ecx;
EDIT: fixed copy pasta
Saving 0x4BE1B4:
Код: Выделить всё
H3Stream *s = (H3Stream *)c->ecx;


Host vs non-host
Don't know, check Players various fields ?
Последний раз редактировалось RoseKavalier 11 июл 2019, 18:43, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение as239 » 11 июл 2019, 14:24

Thanks a lot for great job!

Trying to realize, but having sintax error here (API updated):
 
Изображение
Вернуться к началу

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

It was a typo. Obviously it's (H3Stream*)c->ecx; that he meant.

* * *
Самым простым (но не элегантным) решением было бы сохранять дополнительные поля в отдельный файл с тем же именем, что и у сейва, но с другим расширением: например, 111.fmd :smile1: Если файл отсутствует, значит, сейв не фрешмодовский. Оригинальный формат сейвов я бы не трогал. Можно даже отдельный подкаталог сделать для таких "довесков" к сохранению. Плюс в том, что формат этого файла будет такой, каким его пожелает сделать автор, а ещё проблем с новыми версиями сохранений мода не будет.
Вернуться к началу

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

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

Сообщение as239 » 11 июл 2019, 16:28

Цитата:
It was a typo. Obviously it's (H3Stream*)c->ecx; that he meant.

Так и есть. :smile26:

Цитата:
Самым простым (но не элегантным) решением было бы сохранять дополнительные поля в отдельный файл с тем же именем, что и у сейва, но с другим расширением: например, 111.fmd

Есть, конечно, свои плюсы в этом, но есть и минусы, со стороны целостности данных - доп. файлики иногда случайно удаляются или переименовываются, при передаче сейва 3-му лицу надо будет не забывать их и т.д.
Со стороны своего мода я уверен на 99%, что больше изменений формата сейвов не будет.
Единственное, не знаю что будет если такие изменения произойдут со стороны HD мода.
Вернуться к началу

Пред.След.

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

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

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