Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
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 » 19 авг 2019, 16:08

У меня работает. Наверно, не в DoesWearArtifact дело.
Вернуться к началу

offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 88
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 22 раз.

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

Сообщение Catastrophe » 19 авг 2019, 16:13

Очень странно. Убираю этот кусок и вылеты прекращаются. Может у нас инклуды разные?
Код: Выделить всё
 _bool_ DoesWearArtifact(int art_id) {return CALL_2(_bool_, __thiscall, 0x4D9460, this, art_id);}
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

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 » 19 авг 2019, 16:21

Да тут негде вылетать. Скорее всего, проблема не здесь, а в другом месте.

Код: Выделить всё
int __stdcall CastStoneSkinOnGargoyles(LoHook* h, HookContext* c)
{
   for (int side = ATTACKER; side <= DEFENDER; ++side)
   {
      for (int i = 0; i < o_BattleMgr->stacks_count[side]; ++i)
      {
         if (o_BattleMgr->stack[side][i].creature_id == CID_STONE_GARGOYLE ||
            o_BattleMgr->stack[side][i].creature_id == CID_OBSIDIAN_GARGOYLE)
         {
            if (o_BattleMgr->hero[side]->DoesWearArtifact(63)) CALL_5(int, __thiscall, 0x444610, &o_BattleMgr->stack[side][i], SPL_HYPNOTIZE, 3, 0, o_BattleMgr->hero[side]);
         }
      }
   }
                     
   return EXEC_DEFAULT;
}
Вернуться к началу

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 » 19 авг 2019, 16:28

Хотя... Есть одно предположение. Добавьте !o_BattleMgr->hero[side]. Потому что "героем" нейтралов может быть нуль.

Думаю, в этом дело. Для нейтралов o_BattleMgr->hero[side] равно нулю и, соответственно, никакие значения полей от нуля мы не можем получить.
Вернуться к началу

offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 88
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 22 раз.

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

Сообщение Catastrophe » 19 авг 2019, 16:30

Вот так работает. Я так понимаю, перед проверкой на героя должна быть какая-то проверка, связанная со стеком. Как бы ее убрать? Чтобы птица познания давала ускорение всем стекам в армии.
Код: Выделить всё
int __stdcall CrStartSpells(LoHook* h, HookContext* c)
{
    for (int side = ATTACKER; side <= DEFENDER; ++side)
    {
        for (int i = 0; i < o_BattleMgr->stacks_count[side]; ++i)
        {
         // stone skin
            if (o_BattleMgr->stack[side][i].creature_id == 30 ||
            o_BattleMgr->stack[side][i].creature_id == 31)
            {
            // spell id, duration, magic school level, hero id (for possible specialty bonus)
            CALL_5(int, __thiscall, 0x444610, &o_BattleMgr->stack[side][i], 46, -1, 2, o_BattleMgr->hero[side]);
            }
         // haste
         if (o_BattleMgr->stack[side][i].creature_id == 4 &&
            o_BattleMgr->hero[side]->DoesWearArtifact(63) ||
            o_BattleMgr->stack[side][i].creature_id == 5 &&
            o_BattleMgr->hero[side]->DoesWearArtifact(63))
         {
            CALL_5(int, __thiscall, 0x444610, &o_BattleMgr->stack[side][i], 53, -1, 2, o_BattleMgr->hero[side]);
         }
        }
    }

    return EXEC_DEFAULT;
}

Цитата:
Думаю, в этом дело. Для нейтралов o_BattleMgr->hero[side] равно нулю и, соответственно, никакие значения полей от нуля мы не можем получить.

Вы абсолютно правы, при нападении на грифонов игра вылетает. Нужно добавить проверку, не равен ли id героя больше 155?
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

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 » 19 авг 2019, 16:35

Короче, добавьте проверку на наличие героя: if (o_BattleMgr->hero[side]) там, где пытаетесь узнать, носит ли герой артефакты. А чтобы арт давал бонус всем, уберите проверку на id стека.

Сорри, конечно без !
if (o_BattleMgr->hero[side]) равносильно тому, что герой присутствует, потому что когда o_BattleMgr->hero[side] отлично от нуля, это адрес (указатель) на героя.
Вернуться к началу

offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 88
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 22 раз.

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

Сообщение Catastrophe » 19 авг 2019, 16:43

Вот так правильно? Вроде работает.
Код: Выделить всё
if (o_BattleMgr->hero[side] != 0)
         {
            if (o_BattleMgr->hero[side]->DoesWearArtifact(63))
            {
               CALL_5(int, __thiscall, 0x444610, &o_BattleMgr->stack[side][i], 53, -1, 2, o_BattleMgr->hero[side]);
            }
         }
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

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 » 19 авг 2019, 16:47

Да, правильно. Только не обязательно писать o_BattleMgr->hero[side] != 0, достаточно просто o_BattleMgr->hero[side], потому что всё, что не ноль, считается равным true.
Вернуться к началу

offlineАватара пользователя
Catastrophe  
имя: Alex
Посвященный
Посвященный
 
Сообщения: 88
Зарегистрирован: 07 мар 2019, 11:50
Пол: Мужчина
Поблагодарили: 22 раз.

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

Сообщение Catastrophe » 19 авг 2019, 17:50

Попробовал добавить туда наложение спеллов на нейтралов с 30% шансом, со случайной силой.
Работает, но почему результат одинаковен для всех стеков, а не считается отдельно для каждого?
 
Изображение

Код: Выделить всё
if (!o_BattleMgr->hero[side])
         {
            srand ((unsigned int)time(NULL));
            c_crss_np = rand()%3+1;
            if (rand()%100 > 69) CALL_5(int, __thiscall, 0x444610, &o_BattleMgr->stack[side][i], 49, -1, c_crss_np, o_BattleMgr->hero[side]);
            if (rand()%100 > 69) CALL_5(int, __thiscall, 0x444610, &o_BattleMgr->stack[side][i], 51, -1, c_crss_np, o_BattleMgr->hero[side]);   
         }
Быстрее всего смогу ответить вам в Telegram: @PleaseAndThankYou
Вернуться к началу

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 » 19 авг 2019, 18:37

Посмотрите, в чём дело: добавьте следующие строки после c_crss_np = rand()%3+1; Может, генерируется одно и то же число.

Код: Выделить всё
sprintf(o_TextBuffer, "%d", c_crss_np);
b_MsgBox(o_TextBuffer, MBX_OK);


Попробуйте вот этот код (без srand()):

Код: Выделить всё
unsigned int r;
rand_s(&r);
c_crss_np = (unsigned int)((double)r / ((double)UINT_MAX + 1) * 3.0) + 1;
Вернуться к началу

Пред.След.

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

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

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

cron