Объявления

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

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

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

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

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

Не могу понять почему вылетает код отправки данных.
Отсюда отравляю:
Код: Выделить всё
int __fastcall MyButtonProc(H3MsgCustom *msg)
{
   if (msg->IsLeftClick())
   {
      H3DlgCustomButton *b = (H3DlgCustomButton*)msg->GetDlg()->GetH3DlgItem(CheckBoxID);
      if (b) {
        b->ToggleFlag(GamePlayChangesOn);
      SendFlag();
     }
   }
   else if (msg->IsRightClick())
   {
      sprintf(h3_TextBuffer, "Flag state is %d", GamePlayChangesOn);
      F_MessageBoxRMB();
   }

   return 1;
}

Код отправки:
Код: Выделить всё
#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);}
};
void SendFlag() {
   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();
   }
}

Вылет при первом же обращении к атрибуту структуры:
Код: Выделить всё
NData->recipient_id = -1;

При этом при компиляции есть предупреждение:
warning C4700: использована неинициализированная локальная переменная "NData"
Что-то не так с определением структуры "_NetData_"?
Вернуться к началу

offlinefeanor  
Новичок
Новичок
 
Сообщения: 14
Зарегистрирован: 15 мар 2016, 16:23
Пол: Не указан
Поблагодарили: 15 раз.

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

Сообщение feanor » 13 июл 2019, 08:27

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

Код: Выделить всё
 
void SendFlag() {
   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();
   }
}
Вернуться к началу

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

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

Сообщение as239 » 13 июл 2019, 10:37

Спасибо! Помогло! Непонятно, как оно до этого пару раз срабатывало.
Осталось мне только найти как отличить хоста от обычного игрока, чтобы сделать флаг не доступным.
В player ничего подобного не нашел.
Вернуться к началу

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

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

Сообщение RoseKavalier » 13 июл 2019, 12:46

_NetData_ * worked by pure chance, you are lucky it did not crash the game))

(_NetData_ *) is a pointer so it is only size == 4 on the stack and you are pointing to random data, so if lucky it overwrites random data.
If you are going to use pointers, either you should match it to existing structure reference OR use new / malloc and delete / free.
Изображение

(_NetData_) is correctly sized and function stack knows to make enough room for it. (this is a poor stack example though)
Изображение
Вернуться к началу

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

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

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

А как организовать обход элементов диалога?
Вот это проходит синтаксический контроль:
Код: Выделить всё
H3Vector<H3DlgItem*> items = *dlg->GetList();


А вот здесь ошибка: error C2440: инициализация: невозможно преобразовать 'H3DlgItem **' в 'H3DlgItem'
Код: Выделить всё
     for ( H3DlgItem item = items.First(); items.Last(); item++)
     {
     }

Первую строчку, без указателей никак не получается скомпилировать.
Вернуться к началу

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

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

Сообщение RoseKavalier » 13 июл 2019, 15:07

GetList() passes by pointer, not reference so you cannot assign to a vector.
Цитата:
H3Vector<H3DlgItem*> *items = *dlg->GetList();


A more modern Visual Studio (C++11) features the auto keyword which is quite handy.
Код: Выделить всё
auto list = dlg->GetList();
auto it = *list->First();
Вернуться к началу

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

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

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

Switched to VS 2013.
Did it, it works fine:
Код: Выделить всё
   auto ItemHWRules = dlg->GetH3DlgItem(1001);
   if (P_NewGameDlg && ItemHWRules ) // if we're in lobby

...you better not know, how did i get HWRulesId =1001 :)

But now i need it: ItemHWRules->IsEnabled(), ItemHWRules->Value, ItemHWRules->GetX(), ItemHWRules->GetY().
Is it possible to get?
Вернуться к началу

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

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

Сообщение RoseKavalier » 14 июл 2019, 12:51

Good job!
Next time you look for a button id, place a breakpoint at button (or def, pcx, ...) creation function to make it a little less painful))

I have added the missing DlgItem functions.

For ItemHWRules->Value, you mean if it is on or off?
This will give you the current button frame which. I don't remember if the checkmark is first or second so you may have to add (!) or (1 - ) to get the correct value.
Код: Выделить всё
int frame_value = ItemHWRules->CastDef()->GetFrame();
Вернуться к началу

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

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

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

Thaks a lot! It works fine!
Exept this, after this:
Код: Выделить всё
FlagCheckBox->Disable();

CheckBox is showing incorrect state:
 
Изображение
Вернуться к началу

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

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

Сообщение RoseKavalier » 14 июл 2019, 14:25

I'm not sure I understand... do you mean that the flag value still toggles if it is disabled?
Or that it gets stuck in a certain state... or?

Also, if you want your text to be the same color as the rest, place it within '{' '}'
"{Gameplay changes (FreshMod 3.2)}"
Вернуться к началу

Пред.След.

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

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

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