Объявления

Друзья, если не получается зарегистрироваться, напишите на почту 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)
Поблагодарили: 2161 раз.

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

Сообщение AlexSpl » 31 май 2021, 13:25

А почему мы их в исключение добавляем? Разве не лучше повесить Проклятие на Баллисту, чем на отряд, который ничего не может сделать? Чем принципиально Баллиста отличается, например, от 1 неослеплённого Стрелка?
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 890
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 49 раз.

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

Сообщение Rolex » 31 май 2021, 15:04

Хотя да, Вы правы. :smile5:
Вернуться к началу

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

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

Сообщение void_17 » 02 июн 2021, 02:08

Для чего нужна переменная field_538 в структуре _CombatMonster_ ?
Вернуться к началу

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

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

Сообщение Ben80 » 02 июн 2021, 05:11

Это поле используется ИИ для принятия решений по действиям в битве. Туда записывается ссылка (адрес) на отряд противника, который данный отряд ИИ собирается атаковать по итогам "предварительного расчета".
Вернуться к началу

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

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

Сообщение void_17 » 07 июн 2021, 06:48

Что означают выражения вроде таких?:
Код: Выделить всё
(*(void(__thiscall**)(int))(*(_DWORD*)v0 + 4))(v0);


Причем здесь __thiscall? Это же не тип, да к тому же еще **
Вернуться к началу

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

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

Сообщение AlexSpl » 07 июн 2021, 09:12

Это синтаксис для указателей на функцию. Так можно вызывать функцию не по имени, а по адресу (например, call dword ptr [eax+4]; используется при вызове виртуальных методов), или передавать её в качестве аргумента другой функции. __thiscall - это соглашение о вызове, которое можно и опустить, но только если используется стандартное (обычно это __cdecl). Звёздочки работают, как и везде: указатель/разыменовывание.

Вот несколько примеров из моего проекта:

Код: Выделить всё
GetProcessID = (DWORD (*) (const wchar_t *)) GetProcAddress(hDLL, "GetProcessID");
GetHStartPoint = (DWORD (*) (const HANDLE, const BYTE)) GetProcAddress(hDLL, "GetHStartPoint");
RAMHero = (int (*) (const HANDLE, const DWORD, const BYTE, void *)) GetProcAddress(hDLL, "RAMHero");
RAMWeights = (int (*) (const HANDLE, const DWORD, const BYTE, const BYTE, void *)) GetProcAddress(hDLL, "RAMWeights");
LevelUp = (int (*) (void *, const void *, void *, const BYTE, const BYTE)) GetProcAddress(hDLL, "LevelUp");
isStandardWeights = (bool (*) (const HANDLE, const DWORD, const BYTE, const BYTE)) GetProcAddress(hDLL, "isStandardWeights");
RAMBBWeights = (int (*) (const HANDLE, const DWORD, const BYTE, const BYTE, void *)) GetProcAddress(hDLL, "RAMBBWeights");

Пример из декомпилированного листинга функции:

Код: Выделить всё
int __thiscall sub_0044A710(void *this, int a2)
{
  void *v2; // edi
  int result; // eax

  v2 = this;
  if ( (unsigned int)(*(int (__thiscall **)(int, void *, signed int))(*(_DWORD *)a2 + 4))(a2, this, 28) >= 0x1C )
    result = -((unsigned int)(*(int (__thiscall **)(int, int, signed int))(*(_DWORD *)a2 + 4))(a2, (int)v2 + 28, 28) < 0x1C);
  else
    result = -1;
  return result;
}

Эквивалентный код на ассемблере:

Изображение
Вернуться к началу

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

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

Сообщение void_17 » 12 июн 2021, 05:25

Как правильно вызывать хайхук функцию в коде? Или придется через CALL_..?
Код: Выделить всё
 Foo (HiHook* hook, ...) {
...
}

Все варианты ниже вызывают вылет

Код: Выделить всё
Foo(0, ... ); //ИЛИ
Foo(NULL, ...); //ИЛИ
Foo(nullptr,  ... ); //ИЛИ
Вернуться к началу

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

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

Сообщение AlexSpl » 12 июн 2021, 13:04

Она вызывается автоматически, когда выполняется оригинальная функция (можно ещё ставить CALL_ хайхук на отдельный вызов оригинальной функции). Для решения задач этого хватает. Не могу представить случай, когда её нужно было бы вызывать отдельно (она спроектирована так, чтобы её вызывал патчер). Если всё-таки очень нужно вызвать, то лучше переделать её в обычную функцию (без первого аргумента). Почему вылет, когда Вы вызываете функцию с пустым указателем на HiHook? Вероятно, в теле функции есть обращение к этому указателю, а он пустой (таким обращением может быть hook->GetDefaultFunc()).
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

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

Сообщение RoseKavalier » 12 июн 2021, 18:29

Код: Выделить всё
CALL_X(return_type, call_type, FuncAt(hook_address), arg1, arg2, arg3...);

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

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

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

Сообщение void_17 » 13 июн 2021, 09:08

AlexSpl писал(а):

Если всё-таки очень нужно вызвать, то лучше переделать её в обычную функцию (без первого аргумента).


Блин, точно, я совсем забыл про обыкновенные функции! Спасибо.
Вернуться к началу

Пред.След.

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

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

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