Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
void_17  
имя: DM
Ветеран
Ветеран
 
Сообщения: 529
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 116 раз.

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

Сообщение void_17 » 22 фев 2022, 06:23

@AlexSpl, как успехи с вашим модом? Дело продвигается?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 22 фев 2022, 08:17

NewSpells я пока оставил. Недавно, кстати, немножко гонял с ним и не верил, что это я написал, очень круто получилось :smile20: Что касается модификации интерфейса, то сейчас я работаю над мини-API (часть информации беру из Вашей базы, часть из H3API, кое-какие моменты приходится исправлять иногда, т.к. не соответствуют действительности). Скажу так, переписывать интерфейс никогда не было так легко, код очень опрятный получается :smile20: Но интерфейс - это не самое простое и требует много времени, особенно интерфейс HD, чья реализация скрыта в dll-ках. Кое-что быстро решается вызовом функций HD мода, но есть вещи, которые так просто не изменить, как в случае с очередью ходов в плагине NewSpells.

Вообще, странно как-то. Теперь, когда можно делать крутые моды, уже и не хочется особо. Ты заранее видишь результат, знаешь, как его достичь, потом оцениваешь время реализации задуманного и потенциальный "выхлоп" - и понимаешь, что лучше пойти поиграть в Героев 3 или KB :smile1: Сейчас народ уже ничем не удивишь. Планка очень высокая. Это в 2008-м, например, были бы тысячи исписанных идеями и благодарностями страниц треда про новые спеллы. А сейчас уже как бы это и не ново, и типа каждый день выпускают плагины, где ты сам, практически без усилий можешь добавить заклинание своей мечты. Эх, не только я постарел, все постарели вместе со мной. И я понятия не имею, то ли же самое игра для новичков, чем являлась для меня когда-то. Такое чувство, что нет. Хотя, теперь акценты сместились, много новичков идут сразу в онлайн. А к современному, "быстрому", онлайну у меня неоднозначные чувства. С одной стороны круто играть против живого противника, с другой - победы на второй или третьей неделе - это даже не Герои, а блиц какой-то с одной-двумя встречами :smile4: Но самое главное - онлайн не готов к новому, ведь спорт же.

* * *
В отношении интерфейса пришёл к не новой идее форм для элементов интерфейса. Чтобы твой мод можно было нормально моддить дальше, нужно не прятать свойства элементов в код, а выносить их в специальные, легко редактируемые файлы форм, а к нестандартным методам предоставлять моддерам программный интерфейс. Например, диалог выбора городов и героев в HD моде так просто не перенесёшь на новое место, ибо реализация зашита в хуке. А с формами даже те, кто не знаком с плюсами, могли бы пилить интерфейсные минимоды.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 16 мар 2022, 11:29

Цитата:
is there any easy way to make AI not cast haste and slow? Changing AI value in SPTRAITS does nothing.

Изображение

Change 24 and 25 to 38.
Вернуться к началу

offlineНмеса  
 
Сообщения: 9
Зарегистрирован: 02 ноя 2017, 16:04
Пол: Не указан
Поблагодарили: 2 раз.

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

Сообщение Нмеса » 24 мар 2022, 08:34

Обнаружил еще одну странность с плагином NewMagicMirror - если у вражеского героя есть некоторые спеллы (пока не выявил какие именно, достаточно дать Тома всех школ чтобы заметить проблему) то при старте боя с ним (еще до перехода на арену) мы слышим рандомные звуки различных заклинаний.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 24 мар 2022, 08:52

Спасибо за баг-репорт. Попробую повторить. Судя по описанию, можно предположить, что это связано с симуляцией битвы в HD моде.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: DM
Ветеран
Ветеран
 
Сообщения: 529
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 116 раз.

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

Сообщение void_17 » 11 апр 2022, 15:32

Есть у кого хорошие примеры на каждый тип хайхука? И объяснение, как он работает?
 
Статью пишу, сформулировать нормальный пример на каждый тип не могу.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 11 апр 2022, 16:05

Мне лично пригождались только Splice Extended (когда лень/нецелесообразно переписывать всю функцию) и Splice Direct (когда ты пишешь свою версию функции). Например,

Код: Выделить всё
_PI->WriteHiHook     (0x5A83A0, SPLICE_, EXTENDED_, THISCALL_, SpellCastWorkChance);
_PI->WriteHiHook     (0x4489F0, SPLICE_, DIRECT_, THISCALL_, GetSpeed);


Код: Выделить всё
float __stdcall SpellCastWorkChance(HiHook* h, CombatManager* combatMgr, int spellId, int casting_side, Army* const target_army, bool redirected, bool first_target, bool creature_spell)
{
   if (target_army && target_army->active_spell_duration[SPELL_HOUR_OF_POWER])
      if (spellId == SPELL_BLESS || spellId == SPELL_CURSE || spellId == SPELL_BLOODLUST || spellId == SPELL_SLAYER || spellId == SPELL_FORTUNE || spellId == SPELL_MISFORTUNE)
         return 0.0f;       

   return CALL_7(float, __thiscall, h->GetDefaultFunc(), combatMgr, spellId, casting_side, target_army, redirected, first_target, creature_spell);   
}

int Army::GetSpeed()
{
   int speed = this->creature.speed;

   if (this->active_spell_duration[SPELL_SLOW] || this->active_spell_duration[SPELL_DISEASE] || this->active_spell_duration[SPELL_FEAR])
      speed = this->creature.flags & CF_SIEGE_WEAPON ? 0 : max((int)(speed * this->speedMul()), 1);

   return speed;
}

int __fastcall GetSpeed(Army* army)
{
   return army->GetSpeed();   
}

Call-хайхуки тоже могут быть полезны (хук на конкретный вызов функции). Но как-то до этого обходился без них. Safe - тот же Extended, но с дополнительным восстановлением регистров перед вызовом оригинальной функции.

В принципе, baratorch в хедере всё описал:

 
Код: Выделить всё
////////////////////////////////////////////////////////////
 // Метод WriteHiHook
 // создает по адресу address высокоуровневый хук и применяет его
 // возвращает указатель на хук
 //
 // new_func - функция замещающая оригинальную
 //
 // hooktype - тип хука:
 //  CALL_ -  хук НА ВЫЗОВ функции по адресу address
 //     поддерживаются опкоды E8 и FF 15, в остальных случаях хук не устанавливается
 //     и в лог пишется информация об этой ошибке
 //  SPLICE_ - хук непосредственно НА САМУ ФУНКЦИЮ по адресу address
 //  FUNCPTR_ - хук на функцию в указателе (применяется редко, в основном для хуков в таблицах импорта)
 //
 // subtype - подтип хука:
 //  DIRECT_ - new_func имеет тот же вид что и
 //     оригинальная замещаемая функция
 //     примечание: вместо __thiscall f(this)
 //        можно использовать __fastcal f(this_)
 //        вместо __thiscall f(this, ...)  можно использовать
 //        __fastcall f(this_, no_used_edx, ...)
 //  EXTENDED_ - функции new_func первым стековым аргументом передается
 //     указатель на экземпляр HiHook и, в случае
 //     соглашений исходной ф-ии __thiscall и __fastcall
 //     регистровые аргументы передаются стековыми вторыми
 // Таким образом функция new_func должна иметь вид
 // ? __stdcall new_func(HiHook* hook, ?) для ? ? orig(?)
 //
 // ВНИМАНИЕ! EXTENDED_ FASTCALL_ поддерживает только функции с 2-мя и более аргументами
 // для __fastcall c 1 аргументом используйте EXTENDED_ FASTCALL_1 / EXTENDED_ THISCALL_
 //
 //   SAFE_ - то же самое что и EXTENDED_, однако перед вызовом (на время вызова) GetDefaultFunc() восстанавливаются
 //    значения регистров процессора EAX, ECX (если не FASTCALL_ и не THISCALL_),
 //    EDX (если не FASTCALL_), EBX, ESI, EDI, бывшие на момент вызова замещенной функции
 //
 //  в подавляющем большинстве случаев удобнее использовать EXTENDED_
 //  но DIRECT_ выполняется быстрее из-за отсутвия моста к новой замещающей функции
 //
 // calltype - соглашение о вызове оригинальной замещаемой ф-ии:
 //  STDCALL_
 //  THISCALL_
 //  FASTCALL_
 //  CDECL_
 // необходимо верно указывать соглашение для того чтобы EXTENDED_ хук правильно
 // построил мост к новой замещающей функции
 //
 // CALL_, SPLICE_ хук является CODE_ патчем
 // FUNCPTR_ хук является DATA_ патчем

Кстати, с FUNCPTR_ я лично даже примеров нигде не встречал.

Цитата:
И объяснение, как он работает?

Здесь сложнее. Я только дебажил хайхуки. Обычно это простой jmp из кода в dll (поэтому в общем случае и нужны 5 байт), затирающий оригинальную (-ые) инструкции. Затем функция-"пролог", сохраняющая регистры и готовящая стек к вызову самого тела хайхука, собственно функция с кодом хайхука, и наконец - функция-"эпилог", готовящая результат, выполняющая затёртую (-ые) инструкции и возвращающая из dll в оригинальный код. При пошаговой отладке можно смело пропускать первую и третью функции: код, зависящий от тебя, находится во второй. Ну, а чтобы совсем разобраться, как технически всё устроено, нужно смотреть сам код патчера. Но обычному плагиноделу :smile1: он вряд ли будет интересен, поскольку патчер воспринимается как API. Разбираться, может быть, будет интересно тем, кто хочет усовершенствовать сам патчер/написать свой собственный (например под 64-разрядный код).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 29 апр 2022, 16:09

Цитата:
Обнаружил еще одну странность с плагином NewMagicMirror - если у вражеского героя есть некоторые спеллы (пока не выявил какие именно, достаточно дать Тома всех школ чтобы заметить проблему) то при старте боя с ним (еще до перехода на арену) мы слышим рандомные звуки различных заклинаний.

Проверил недавно. Всё так. Исправленный плагин прикреплю к сообщению в теме с пользовательскими плагинами. Готово.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: DM
Ветеран
Ветеран
 
Сообщения: 529
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 116 раз.

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

Сообщение void_17 » 29 апр 2022, 17:49

С сегодняшнего дня начну разбор "полевых" функций и алгоритмов ИИ.

Заметил, что класс поиска пути(searchArray) для боя и карты приключений используется один и тот же, что не очень удобно конечно. :smile5:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 02 май 2022, 16:32

Сейчас параллельно с разбором классов Героев 1 (чёрт, какая же это сложная работа разбирать чистый декомпилят IDA!) занимаюсь рефакторингом плагина NewSpells. Пока только привёл в порядок классы hero и army (для army даже нормальный деструктор оформил, но пока не знаю, как прикрутить конструктор копирования). Гляньте, если есть время/желание, HoMM3API.h и NewSpells.h. После рефакторинга уже устранил два бага (это как в видео про джуниора, который достал "бусинку" отличающегося ото всех остальных цвета, и всё посыпалось). Думаю, Вам тоже будет интересно работать с живым проектом: одно дело писать классы в IDA и наслаждаться красивым декомпилятом, другое - видеть, что это работает и даёт практические результаты.

NewSpells.zip
(50.77 КБ) Скачиваний: 170

Ресурсы можно взять из предыдущего билда. Уже 101 скачивание и 10k просмотров темы на HC. Скажете, мало? OK, почти догнали тему с Free Heroes 2, которая была создана в предыдущем году (так это плагин для Тройки, а там целый огромный проект). Т.е. народу интересно, но нужно удивлять :smile8: Проблема, конечно, сейчас в вау-графонии, которого нет, и в вау-идеях (народ консервативный, просто жесть), а закодить можно всё что угодно с Вашим-то дампом. Всё-таки новые спеллы - это Вам не хухры-мухры :smile2:
Вернуться к началу

Пред.След.

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

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

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