Объявления
Поздравляем
Roman2211


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

Улучшение ИИ

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

Re: Улучшение ИИ

Сообщение as239 » 14 май 2020, 06:56

Спасибо! То что нужно.
Код: Выделить всё
H3CreatureInformation *creature = &P_Creatures[Level*2+Grade+14*Town->type];

Level(0-6), Grade(0,1)

Изменено: Для Сопряжения не работает :(

А как можно исключить какую-то цель из ближней атаки ИИ?
Пробывал здесь 0x421D30 увеличивать esi и eax, или здесь 0x4219C6 с переходом на 0x421DCA, не работает, ИИ упорно убивает палатку первой помощи.
Последний раз редактировалось as239 14 май 2020, 10:25, всего редактировалось 1 раз.
Вернуться к началу

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: Улучшение ИИ

Сообщение AlexSpl » 14 май 2020, 10:00

А пропускать палатку как цель пробовали?

Код: Выделить всё
while ( 1 )
{
  v16 = v65 + v12;
  v14 = v16;
  v17 = (unsigned int)vThis->Monsters[v16].Flags >> 21;
  v15 = &vThis->Monsters[v14];
  a3a = &vThis->Monsters[v14];
  // Здесь проверяем не палатка ли наш монстр :)
  // Если палатка, то делаем так, как ниже, и переходим к следующему монстру
  // v12 = v67 + 1;
  // ++v67;
  // и return_address на начало цикла
  ...
  v12 = v67++ + 1;
  ...
}

Вот сюда 0x42199B можно поставить лоухук, в edi - монстр.
Вернуться к началу

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: Улучшение ИИ

Сообщение AlexSpl » 14 май 2020, 10:33

Цитата:
Изменено: Для Сопряжения не работает

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

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

Re: Улучшение ИИ

Сообщение as239 » 14 май 2020, 10:52

AlexSpl писал(а):

А пропускать палатку как цель пробовали?

Код: Выделить всё
while ( 1 )
{
  v16 = v65 + v12;
  v14 = v16;
  v17 = (unsigned int)vThis->Monsters[v16].Flags >> 21;
  v15 = &vThis->Monsters[v14];
  a3a = &vThis->Monsters[v14];
  // Здесь проверяем не палатка ли наш монстр :)
  // Если палатка, то делаем так, как ниже, и переходим к следующему монстру
  // v12 = v67 + 1;
  // ++v67;
  // и return_address на начало цикла
  ...
  v12 = v67++ + 1;
  ...
}

Вот сюда 0x42199B можно поставить лоухук, в edi - монстр.


Я пробывал здесь переходить на LABEL_106 - не помогло.
Попробую ваш вариант, только не понимаю как изменить v12, что такое "fst6"?
Вернуться к началу

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: Улучшение ИИ

Сообщение AlexSpl » 14 май 2020, 10:57

Цитата:
Попробую ваш вариант, только не понимаю как изменить v12, что такое "fst6"?

v12 в ecx, a fst6 - для справки - это st(6) / ST6 - регистр FPU.
Вернуться к началу

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

Re: Улучшение ИИ

Сообщение as239 » 14 май 2020, 11:28

Вылетает:
Код: Выделить всё
      int *v67 = (int*)(c->ebp - 0x48);
      c->ecx = *v67+1;
      *v67= *v67+1;
      c->return_address = 0x421976;
      return NO_EXEC_DEFAULT;
Вернуться к началу

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: Улучшение ИИ

Сообщение AlexSpl » 14 май 2020, 11:34

Похоже, у нас с Вами разные декомпиляции.
Код: Выделить всё
// Проверяем монстра в edi на предмет схожести с палаткой :)
c->ecx = *(int*)(c->ebp - 0x30)++ + 1;
c->return_address = 0x421976;
return NO_EXEC_DEFAULT;
Вернуться к началу

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

Re: Улучшение ИИ

Сообщение as239 » 14 май 2020, 11:43

Вылет
Вернуться к началу

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: Улучшение ИИ

Сообщение AlexSpl » 14 май 2020, 11:47

Куда ставите хук, как проверяете ID монстра?

В edi указатель на монстра. Проверить можно так:

Код: Выделить всё
if (*(int*)(c->edi + 0x34) = ID_палатки) { ... }
Последний раз редактировалось AlexSpl 14 май 2020, 12:02, всего редактировалось 1 раз.
Вернуться к началу

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

Re: Улучшение ИИ

Сообщение as239 » 14 май 2020, 11:59

Код: Выделить всё
bool ItsWarMachine(int ID){
   switch (ID)
   {
   case NH3Creatures::BALLISTA:
   case NH3Creatures::CATAPULT:
   case NH3Creatures::FIRST_AID_TENT:
   case NH3Creatures::AMMO_CART:
      return true;
   }
   return false;
}

_LHF_(DontAtackWarMashine){

   if (!IsTwoHeroes()) return EXEC_DEFAULT;
   H3CombatMonster *CurMon = (H3CombatMonster *)c->edi;
   if (!CurMon) return EXEC_DEFAULT;

   if (ItsWarMachine(CurMon->type))
   {
      int *v67 = (int*)(c->ebp - 0x30);
      c->ecx = *v67+1;
      *v67= *v67+1;
      c->return_address = 0x421976;
      return NO_EXEC_DEFAULT;

   }
   return EXEC_DEFAULT;

}
...
   _PI->WriteLoHook(0x42199B, DontAtackWarMashine);//
Вернуться к началу

Пред.След.

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

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

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