Объявления

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

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

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

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

Сообщение Ben80 » 10 окт 2017, 21:45

AlexSpl писал(а):

В оригинале Disguise показывается в замке.


Может быть, я уточню. Однако, анализируя код, вижу что за исключением вызова из процедуры Dlg_HeroRMCHint , передается аргумент 2, в случае вызова из Dlg_HeroRMCHint это может быть и меньшее число. Так вот когда передается 2, то численность показывается как есть.
Вернуться к началу

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 » 10 окт 2017, 21:48

Тут всё просто. Адрес возврата c->esp. Но обрадовать не могу, ибо вызов происходит из HD_SOD.dll, а там адреса непостоянные.
Вернуться к началу

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

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

Сообщение Ben80 » 10 окт 2017, 21:49

Жалко.

Вот, кстати, изменения в кода для того чтобы перенести VIsion в Школу воды и чтобы Эксперт по воде мог демаскировать:

Код: Выделить всё
int __stdcall setVisionSpell(LoHook* h, HookContext* c)
{
    for(int i=0; i<4; i++)
        o_Spell[2].effect[i] = 2;
    o_Spell[2].school_flags = 4;

    return EXEC_DEFAULT;
}

int __stdcall makeGhostHero(LoHook* h, HookContext* c)
{
    _Hero_* hero;
    int* heroReg;
    int heroVision;

    heroReg = &c->esi;
    heroVision = *(int*)(c->ebp - 0x10);

    hero = *(_Hero_**)heroReg;
    disguise = (disguiseStruct*)&hero->disguise;

    if ( hero->disguise != -1 )
    //if ( disguise != -1 )
    {
        // Копируем героя в "призрачного" героя
        *ghostHero = *hero;
        ghostHero->disguise = -1;

        for (int i = 0; i < 7; ++i)
        {
            if ( hero->army.type[i] > ID_NONE )
            {
                if (heroVision < 3)
                    ghostHero->army.count[i] = (int)(getDisguiseMultiplier(disguise->index) * ghostHero->army.count[i]);

                // Спасаем единички
                if ( ghostHero->army.count[i] < 1 ) ghostHero->army.count[i] = 1;
            }
        }
     
        *(int*)heroReg = (int)ghostHero;
    }

    return EXEC_DEFAULT;
}

...

_PI->WriteLoHook(0x4BFB30, setVisionSpell);
_PI->WriteLoHook(0x41664C, makeGhostHero);
Вернуться к началу

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 » 10 окт 2017, 21:50

Цитата:
Жалко.

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

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

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

Сообщение Ben80 » 10 окт 2017, 21:51

Завтра спрошу - какое лучшее :smile1:
Вернуться к началу

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 » 10 окт 2017, 21:53

Только подробно опишите, что хотите сделать. Я так и не понял до конца, над чем Вы работаете :smile1:
Вернуться к началу

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

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

Сообщение Ben80 » 11 окт 2017, 04:32

AlexSpl писал(а):

Только подробно опишите, что хотите сделать. Я так и не понял до конца, над чем Вы работаете :smile1:


1) Переношу заклинание Видение (Vision) в Школу воды.
2) Если герой является экспертом по магии воды, то применяя заклинание Видение и рассматривая героя противника правой кнопкой, он получает правильное представление о численности войск героя противника (даже если герой противника применял заклинание Маскировка).
3) Для заклинания Vision поменял поля effect (+34h), чтобы независимо от степени навыка Магия воды, значение effect равнялось 2 (это множитель, который используется для расчета расстояния, на котором действует Vision).

То есть Вы бы могли выложить плагин NewDisguise, а я - плагин NewDisguiseVision.
Вернуться к началу

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

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

Сообщение Ben80 » 11 окт 2017, 04:37

AlexSpl писал(а):

Только подробно опишите, что хотите сделать. Я так и не понял до конца, над чем Вы работаете :smile1:


А, Вы про получение адреса возврата... Раньше хотел применить такую технологию для того, чтобы Disguise действовал и для героя в городе (отличие от оригинала игры). Потом отказался от идеи. А потом просто любопытно стало - почему у меня не получилось получить адрес возврата.

То есть задача стояла просто таким образом. Внутри процедуры 5C1860 хочется проверять, что ее вызывали из процедуры 530C11. Поскольку процедура 5C1860 может быть вызвана из разных процедур, хотелось быть уверенным, откуда ее вызвали. На этом предполагалось строить логику кода - попросту говоря применять дополнительный код или не применять.
Вернуться к началу

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

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

Сообщение igrik » 11 окт 2017, 07:17

AlexSpl писал(а):

Заменил 4 хука makeGhostHero на 1. Всё-таки надо будет разобраться, что такое HiHook :smile14:

Вот так нужно ставить HiHook на эту функцию.
Для сравнения процесса выполнения кода также установлен LoHook и сделан вывод b_MsgBox.
Код: Выделить всё
_Dlg_* __stdcall makeGhostHero_Hi(HiHook* hook, _Dlg_* dlg, _Hero_* hero, int a3)
{
   sprintf(o_TextBuffer, "HiHook_1\n Dlg: %d\n Hero: %d\n a3: %d", dlg, hero->id, a3);
   b_MsgBox(o_TextBuffer, 1);

   CALL_3(_Dlg_*, __thiscall, hook->GetDefaultFunc(), dlg, hero, a3);

   sprintf(o_TextBuffer, "HiHook_2\n Dlg: %d\n Hero: %d\n a3: %d", dlg, hero->id, a3);
   b_MsgBox(o_TextBuffer, 1);

   return dlg;
}

_int_ __stdcall makeGhostHero_Lo(LoHook* h, HookContext* c)
{
   _Dlg_* dlg = (_Dlg_*)c->ecx;
   _Hero_* hero = *(_Hero_**)(c->ebp + 0x8);
   int a3 = *(int*)(c->ebp + 0xC);

   sprintf(o_TextBuffer, "LoHook\n Dlg: %d\n Hero: %d\n a3: %d", dlg, hero->id, a3);
   b_MsgBox(o_TextBuffer, 1);

    return EXEC_DEFAULT;
}
=========================================================================
_PI->WriteHiHook(0x52EFB0, SPLICE_, EXTENDED_, THISCALL_, makeGhostHero_Hi);
_PI->WriteLoHook(0x52EFB5, makeGhostHero_Lo);
Вернуться к началу

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

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

Сообщение igrik » 11 окт 2017, 08:56

Ben80 писал(а):

AlexSpl писал(а):

Только подробно опишите, что хотите сделать. Я так и не понял до конца, над чем Вы работаете :smile1:

1) Переношу заклинание Видение (Vision) в Школу воды.
2) Если герой является экспертом по магии воды, то применяя заклинание Видение и рассматривая героя противника правой кнопкой, он получает правильное представление о численности войск героя противника (даже если герой противника применял заклинание Маскировка).
3) Для заклинания Vision поменял поля effect (+34h), чтобы независимо от степени навыка Магия воды, значение effect равнялось 2 (это множитель, который используется для расчета расстояния, на котором действует Vision).

Я не сильно вникал в конкретику...
А так не сработает?
Код: Выделить всё
_Dlg_* __stdcall makeGhostHero_Hi(HiHook* hook, _Dlg_* dlg, _Hero_* hero, int a3)
{
   int t = hero->disguise;                                             // запоминаем параметр маскировки
   int h = o_ActivePlayer->selected_hero_id;                           // получаем номер активного героя
   if (h != -1){                                                       // если активный герой есть
      _Hero_* heroActive = o_GameMgr->GetHero(h);                      // получаем активного героя
      if (heroActive->field_11E[12] == 3)                              // если "экспертные видения"
         hero->disguise = -1;                                          // временно убираем маскировку
   }

   CALL_3(_Dlg_*, __thiscall, hook->GetDefaultFunc(), dlg, hero, a3); // выполняем оригинальный код игры
   hero->disguise = t;                                                // возвращаем параметр маскировки
   return dlg;                                                        // возврат в выполнение кода игры
}
//===========================================
_PI->WriteHiHook(0x52EFB0, SPLICE_, EXTENDED_, THISCALL_, makeGhostHero_Hi);
Последний раз редактировалось igrik 11 окт 2017, 10:41, всего редактировалось 1 раз.
Вернуться к началу

Пред.След.

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

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

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