Объявления

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

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

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

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

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

Ben80 писал(а):

Подскажите, пожалуйста, как внутри процедуры узнать адрес, на который она возвратится потом ?
Пробовал через c->esp, не получилось.

Внутри процедуры 5C1860 хочется проверять, что ее вызывали из 530C11


У меня не получается приемлемое число (530C11+)

Может быть, конкретно к данному случаю несколько строк кода приведете ?
Вернуться к началу

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

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

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

Хук внутрь процедуры ( _PI->WriteLoHook(0x52EFB5, makeGhostHero) я как раз использовал изначально, у Вас крашилось из-за Хоты.

Сейчас же оказалось, что я буду вынужден использовать хук на 41664C, поскольку там можно получить свойства героя, который изучает правой кнопкой (у него можно будет проверить число в поле Vision).
Вернуться к началу

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

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

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

Код: Выделить всё
_PI->WriteLoHook(0x52EFB5, makeGhostHero);


Видимо, это будет неправильно, поскольку в этом случае код будет срабатывать и для тех случаев, для которых он срабатывать не должен - то есть когда вызовы происходят не из процедуры Dlg_HeroRMCHint
Вернуться к началу

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:31

Читаете *(int*)(c->ebp + 4). Это адрес возврата. А затем выясняете, попадает ли он в диапазон нужной функции. Благо вы его знаете.

Код: Выделить всё
if ( *(int*)(c->ebp + 4) >= addrFuncBegin && *(int*)(c->ebp + 4) <= addrFuncEnd ) { // Мы в нужной функции };

addrFuncBegin и addrFuncEnd смотрите в базе IDA для нужной Вам функции.
Вернуться к началу

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:33

Цитата:
Видимо, это будет неправильно, поскольку в этом случае код будет срабатывать и для тех случаев, для которых он срабатывать не должен - то есть когда вызовы происходят не из процедуры Dlg_HeroRMCHint

Так он же ничего плохого не делает, если нет Disguise. Поясните.
Вернуться к началу

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

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

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

Плохое происходит, когда Disguise у нашего героя есть - показывается ложная численность войск.
Например, герой в замке - правой кнопкой по нему (экран замка).

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

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

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

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

AlexSpl писал(а):

Читаете *(int*)(c->ebp + 4). Это адрес возврата. А затем выясняете, попадает ли он в диапазон нужной функции. Благо вы его знаете.

Код: Выделить всё
if ( *(int*)(c->ebp + 4) >= addrFuncBegin && *(int*)(c->ebp + 4) <= addrFuncEnd ) { // Мы в нужной функции };

addrFuncBegin и addrFuncEnd смотрите в базе IDA для нужной Вам функции.


Ну, таким образом я получил адрес 1F5260B, что явно не из нужного диапазона.
Поэтому я к Вам и обратился.
Вернуться к началу

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:42

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

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

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

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

Код: Выделить всё
int __stdcall disguiseTownGuards(LoHook* h, HookContext* c)
{
   if(Prepared)
   {
   char Text[200]; // Текстовый буфер
   sprintf(Text, "Адрес: %d\n", *(int*)(c->ebp + 4));
   CALL_12(void, __fastcall, 0x4F6C00, Text, 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
   }
   Prepared = false;
   return EXEC_DEFAULT;
}

int __stdcall prepareDisguiseTownGuards(LoHook* h, HookContext* c)
{
    Prepared = true;
    return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x5C1897, disguiseTownGuards);
_PI->WriteLoHook(0x530C11, prepareDisguiseTownGuards);
Вернуться к началу

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:44

Цитата:
Ну, таким образом я получил адрес 1F5260B, что явно не из нужного диапазона.
Поэтому я к Вам и обратился.

Всё понятно. У этой функции отсутствует пролог. Сейчас посмотрю.
Вернуться к началу

Пред.След.

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

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

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

cron