Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 05 авг 2021, 09:32

Хоть так:
Код: Выделить всё
int __stdcall showInfoButton(LoHook* h, HookContext* c)
{
   if (c->eax == 0xD)
   {
      string str = *(char**)(c->eax * 8 + 0x6A74C0);
      str = str + "test";

      sprintf(o_TextBuffer, "%s", str.c_str());
      c->eax = (int)o_TextBuffer;
   }

   return EXEC_DEFAULT;
}


Хоть так:
Код: Выделить всё
int __stdcall showInfoButton(LoHook* h, HookContext* c)
{
   if (c->eax == 0xD)
   {
      string str = *(char**)(c->edi * 8 + 0x6A74C0);
      str = str + "test";

      sprintf(o_TextBuffer, "%s", str.c_str());
      c->eax = (int)o_TextBuffer;
   }

   return EXEC_DEFAULT;
}


Все равно вылет при наведении курсора на кнопку.

***

Вот так, наверное, правильно. Сейчас проверю.

Код: Выделить всё
int __stdcall showInfoButton(LoHook* h, HookContext* c)
{
   if (c->eax == 0xD)
   {
      string str = *(char**)(c->eax * 8 + 0x6A74C0);
      str = str + "test";

      sprintf(o_TextBuffer, "%s", str.c_str());
      c->edi = (int)o_TextBuffer;
   }

   return EXEC_DEFAULT;
}


Неа, и последний вариант тоже не работает. :smile5:
Вернуться к началу

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

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

Сообщение Rolex » 05 авг 2021, 09:41

Есть, работает, вот так верно:

Код: Выделить всё
int __stdcall showInfoButton(LoHook* h, HookContext* c)
{
   if (c->eax == 0xD)
   {
      string str = *(char**)(c->eax * 8 + 0x6A74C0);
      str = str + "test";

      sprintf(o_TextBuffer, "%s", str.c_str());
      c->edi = (int)o_TextBuffer;

      c->return_address = 0x5F5336;
      return NO_EXEC_DEFAULT;
   }
   return 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: Как создать плагин для HD мода

Сообщение AlexSpl » 05 авг 2021, 09:44

Да, теперь только осталось чуток изменить хук, чтобы подсказка появлялась даже при неактивной кнопке, хотя это плохая практика. Неактивный элемент поэтому и назван неактивным, что не реагирует на ввод юзера. Для неактивной кпопки ID получать придётся с помощью костыля, а не eax.
Вернуться к началу

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

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

Сообщение Rolex » 05 авг 2021, 10:03

AlexSpl писал(а):

Для неактивной кпопки ID получать придётся с помощью костыля, а не eax.

А как именно?
Вернуться к началу

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 » 05 авг 2021, 10:05

Ну, на картинке не показан третий блок :smile1: Сейчас гляну, как попадает ID в eax.
Вернуться к началу

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 » 05 авг 2021, 10:20

Короче, если и есть простой способ, то его нужно искать, пока есть решение через попадание курсора в прямоугольник кнопки (естественно, не элегантное, но простое в реализации). Могу поделиться, но я реально не знаю размеров этой кнопки и координат левого верхнего угла. Может, подскажете? 0xEC - 0x10D по вертикали. Но это я тупо мышкой поводил. Если точность до пикселя не нужна, могу запостить решение. Но я уверен, что делается это круче, просто на поиск этого "круче" уйдёт соответственно "намного круче" времени :smile1:
Вернуться к началу

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

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

Сообщение Rolex » 05 авг 2021, 10:26

AlexSpl писал(а):

но я реально не знаю размеров этой кнопки и координат левого верхнего угла. Может, подскажете? 0xEC - 0x10D по вертикали. Но это я тупо мышкой поводил.

Размеры, думаю, подскажу. Надо поискать в ресурсах эту кнопку и глянуть разрешение. А вот с координатами сложней. А координаты не будут меняться при смене разрешения?
Вернуться к началу

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 » 05 авг 2021, 10:28

Тогда хукайте 0x5F5329 и проверяйте вместо ID попадание edx в диапазон 0xEC - 0x10D. Остальной код тот же, адрес возврата тоже.

Цитата:
А координаты не будут меняться при смене разрешения?

Нет. Они ведь относительные.

А знаете что? Чтобы не писать два хука, ставьте один на 0x5F5336 с EXEC_DEFAULT. Оттуда и edx, и eax прекрасно получить можно. Если через координаты, то вообще можно без eax, а только с проверкой на попадание edx в диапазон (кстати, игра таким образом реально присваивает ID, если углубляться в код, так что решение не совсем кривое, просто не "высокоуровневое"). А ID у кнопки (для того, чтобы получить оригинальный хинт) мы помним какой: 13.
Вернуться к началу

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

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

Сообщение Rolex » 05 авг 2021, 10:54

AlexSpl писал(а):

А знаете что? Чтобы не писать два хука, ставьте один на 0x5F5336 с EXEC_DEFAULT. Оттуда и edx, и eax прекрасно получить можно. Если через координаты, то вообще можно без eax, а только с проверкой на попадание edx в диапазон (кстати, игра таким образом реально присваивает ID, если углубляться в код, так что решение не совсем кривое, просто не "высокоуровневое"). А ID у кнопки (для того, чтобы получить оригинальный хинт) мы помним какой: 13.

Вот так сделал:
Код: Выделить всё
int __stdcall showInfoButton(LoHook* h, HookContext* c)
{
   // if (c->eax == 0xD)
   if (c->eax >= 0xEC && c->eax <= 0x10D)
   {
      string str = *(char**)(c->eax * 8 + 0x6A74C0); // Оригинальное сообщение

      int id = *(int*)(c->ebx + 0x60);
      int number = *(int*)(c->ebx + 0x64);

      string separator = " ";

      str = getString(id, number, str, separator);

      // Передаём адрес текстового буфера в качестве аргумента для диалога
      sprintf(o_TextBuffer, "%s", str.c_str());
      c->edi = (int)o_TextBuffer;

   //   c->return_address = 0x5F5336;
   //   return NO_EXEC_DEFAULT;
   }

   return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x5F5336, showInfoButton);

Но перестало работать даже с активной кнопкой.
Вернуться к началу

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 » 05 авг 2021, 10:57

Не eax нужно сравнивать, а edx. А вместо этого:

Код: Выделить всё
string str = *(char**)(c->eax * 8 + 0x6A74C0);

нужно вот это:

Код: Выделить всё
string str = *(char**)(0xD * 8 + 0x6A74C0);


* * *
Чёрт. Реально не получится через один хук :smile22: Когда кнопка активна, в edx не координаты. Пока нужно два делать: для активной кнопки и неактивной. Проверьте сначала, всё ли работает для неактивной.
Вернуться к началу

Пред.След.

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

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

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

cron