Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 18 авг 2017, 05:45

http://www.gradsky.com/txt/118.shtml

Александр, Вам такое близко ? :smile1:
Вернуться к началу

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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 18 авг 2017, 10:02

Диалоги удобны при отладке. Например, после каста Blind будем показывать адрес хука, уровень Магии Огня и продолжительность заклинания:

Код: Выделить всё
int __stdcall blindSpell(LoHook* h, HookContext* c)
{
   if ( c->ebx == SPL_BLIND )
   {
      int cmAddr = *(int*)0x699420;
      int monSide = *(int*)(c->esi + 244);
      int heroOffset = *(int*)(cmAddr + (1 - monSide) * 4 + 0x53CC); // Адрес вражеского героя
            
      int duration[] = {1, 1, 3, 5};
      char lvlFireMagic = heroOffset ? *(char*)(heroOffset + 201 + 14) : 0;
      
      if ( heroOffset ) c->eax = duration[lvlFireMagic];

      char Text[200]; // Текстовый буфер
      sprintf(Text, "{LoHook @ %08X}\n\nУровень Магии Огня: %d\nПродолжительность: %d", h->GetAddress(), lvlFireMagic, c->eax);
      CALL_12(void, __fastcall, 0x4F6C00, Text, 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0); // Показываем диалог
   }

   return EXEC_DEFAULT;
}


* * *
Потестил абилку Единорогов. Теперь она работает, как если бы Ослепление кастовал герой, когда он есть.
Последний раз редактировалось AlexSpl 18 авг 2017, 12:59, всего редактировалось 1 раз.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 18 авг 2017, 11:26

Думаю, в поле disguise Героя можно разместить пару чисел, которые извлекать битовыми операциями. Одно число - это кол-во ходов, оставшихся до окончания закла, другое - параметр маскировки (от 0.2 до 5), дробные числа можно подменять целыми по некоей условной таблице.
Как в оригинале, точно не знаю, возможно в этом поле - параметр маскировки, совпадающий с уровнем магии Воздуха Героя, или больше его на 1, например (а 0 - это отсутствие маскировки).
Вернуться к началу

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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 18 авг 2017, 12:56

Фикс для Единорогов:

Код: Выделить всё
int __stdcall blindSpell(LoHook* h, HookContext* c)
{
   if ( c->ebx == 62 )
   {
     int cmAddr = *(int*)0x699420;
     int monSide = *(int*)(c->esi + 244); // Сторона отряда, на который кастуется заклинание
     int hero = *(int*)(cmAddr + (1 - monSide) * 4 + 0x53CC); // Адрес героя, который кастует заклинание, или 0, если героя нет
     int actionId = *(int*)(cmAddr + 0x3C); // ID текущего действия (1 - каст заклинания героем, 2 - передвижение отряда по полю боя и т.п.)
         
     int duration[] = {1, 1, 3, 5};
     if ( actionId == 1 ) c->eax = duration[*(char*)(hero + 201 + 14)]; // Проверку hero можно опустить
   }

   return EXEC_DEFAULT;
}


* * *
if ( hero && actionId == 1 ) c->eax = duration[*(char*)(hero + 201 + 14)];

Здесь проверку hero можно опустить, т.к. ID действия равно 1 только тогда, когда кастует именно герой. Если Ослепление кастуют единороги, то actionId = 6 (обычная атака или ответка врукопашной). Если Ослепление будут кастовать какие-нибудь монстры (например, сказочные драконы в одном из модов), то всё равно будет работать, т.к. для каста монстров actionId = 10.
Последний раз редактировалось AlexSpl 18 авг 2017, 13:52, всего редактировалось 1 раз.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 18 авг 2017, 13:19

AlexSpl писал(а):

Диалоги удобны при отладке. Например, после каста Blind будем показывать адрес хука, уровень Магии Огня и продолжительность заклинания:


В Delphi я использовал, например, компонент Label на форме, для отладки. Здесь, в Героях, предполагал просто логировать в файл, но диалоги удобнее, конечно.

С Маскировкой, пожалуй, попробую сам, только мне нужен диалог и как оттуда число получить.
Вернуться к началу

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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 18 авг 2017, 13:26

Нужно подыскать подходящий диалог в коде игры. Какой Вам нужен? Для тестов можно выбрать какой-нибудь попроще.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 18 авг 2017, 14:01

Как при разделении отрядов, только без двух картинок существа и без цифры на поле слева (не нужна ни цифра, ни поле).
При этом заголовок должен быть "Выберите силу отрядов относительно реальной". И, поскольку, без картинок, то высота окна должен быть меньше, чем в оригинальном диалоге.
Последний раз редактировалось Ben80 18 авг 2017, 14:15, всего редактировалось 1 раз.
Вернуться к началу

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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 18 авг 2017, 14:05

Попробую поискать/разобраться.

Насчёт Ослепления. Вот ещё, что нужно учитывать: Волшебное зеркало :smile1:
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1315
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 18 авг 2017, 14:08

Ряд значений, наверно, должен быть таким (вместо действительных чисел):

1/5 - 1/3 - 1/2 - 2/3 - 1 - 3/2 - 2 - 3 - 5
Вернуться к началу

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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 18 авг 2017, 20:52

Посмотрел диалог разделения отрядов. Как и следовало ожидать, он заточен на разделение отрядов, поэтому применить его для решения Вашей задачи не получится.

 
Вызвать его можно так:
Код: Выделить всё
CALL_6(DWORD*, __thiscall, 0x449B60, hero1Army, hero1ArmySlot, hero2Army, hero2ArmySlot, 0, 0);

hero1Army (this) - указатель на армию героя, который делится отрядом
hero2Army - указатель на армию героя, который получает отряд
hero1ArmySlot - номер отряда, которым делимся (0-6)
hero2ArmySlot - номер слота, куда делим (0-6)

Например, если hero - указатель на героя, то следующий вызов покажет диалог, предлагающий разделить отряд между первым (0) и вторым (1) слотами этого героя:
Код: Выделить всё
CALL_6(DWORD*, __thiscall, 0x449B60, hero + 145, 0, hero + 145, 1, 0, 0);

А сделать кастомный диалог - довольно трудоёмкая задача (см. Homm3_GUI.h). Может, на DF2 кто-нибудь из моддеров поделится примером.
Вернуться к началу

Пред.След.

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

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

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