Объявления

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

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

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

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

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

Цитата:
Даже не знаю, как тогда выводить, ведь по правому клику подсказки, а их не хотелось бы мешать с инфой о стоимости грейда.

Да, там по ПКМ по кнопке грейда тянется 447 строка из HELP.TXT. В хуке к этой бы инфе дописывать. В HotA именно так и делается.
Вернуться к началу

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 » 03 авг 2021, 16:34

Тогда всё ОК. Можно писать плагин :smile1:

Вот дополнительная инфа (поможет получить строку подсказки, т.к. esi перезаписывается):

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

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

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

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

А как правильно получить стоимость существа и его грейда по айди не используя операторы?
Вернуться к началу

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 » 03 авг 2021, 16:46

Через o_CreatureInfo. Там есть поле cost, у которого в свою очередь есть поля wood, ore и т.д.
Вернуться к началу

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

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

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

wood, ore в homm3.h почему-то были закомментированы по умолчанию. Раскомментил и попробовал сделать для ПКМ только по золоту. Проверить допишет ли к оригинальному сообщению. Почему-то недописывает:

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include "HotA\homm3.h"

using namespace std;

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;


int __stdcall showGuardsRMB(LoHook* h, HookContext* c)
{
   if (c->esi == 0xD)
   {
      string str = (char*)c->esi; // Оригинальное сообщение

      int id = *(int*)(c->ebx + 0x60);
      int number = *(int*)(c->ebx + 0x64);
      
      str = str + "\n" + to_string( ( o_CreatureInfo[id + 1].cost.gold - o_CreatureInfo[id].cost.gold ) * number );

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


BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
   if (DLL_PROCESS_ATTACH == ul_reason_for_call)
   {
      if (!plugin_On)
      {
         plugin_On = 1;
         _P = GetPatcher();
         _PI = _P->CreateInstance((char*)"HD.Plugin.UpgradeCost");

         // Сообщения по правому клику
         _PI->WriteLoHook(0x5F4CA0, showGuardsRMB);         
      }
   }

   return TRUE;
}
Вернуться к началу

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 » 04 авг 2021, 12:51

Вы ставите хук туда, где в esi уже не ID элемента диалога, а строка с сообщением-подсказкой, поэтому условие c->esi == 0xD не выполняется. Хук нужно ставить на команду выше.

Цитата:
wood, ore в homm3.h почему-то были закомментированы по умолчанию.

Они закомментированы, потому что cost имеет тип struct _Resource_. Вот в той структуре они и определены. Так что возвращайте комменты на место: они для справки/чтобы удобно было считать смещение.
Вернуться к началу

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

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

Сообщение Rolex » 04 авг 2021, 12:58

AlexSpl писал(а):

Хук нужно ставить на команду выше.

Я поставил по тому адресу, который Вы дали (0x5F4CA0).
А как получить адрес на команду выше относительно 0x5F4CA0 ?
Вернуться к началу

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 » 04 авг 2021, 13:58

Ставьте сюда: 0x5F4C99. В общем случае на команду выше - это на длину её в байтах. У нас команда выше - это mov esi, dword_006A74C4[esi*8] (размер 7 байт); 0x5F4CA0 - 7 = 0x5F4C99.
Вернуться к началу

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

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

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

Поставил сюда 0x5F4C99. Получаю вылет по ПКМ по кнопке апгрейда.
Вернуться к началу

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 » 04 авг 2021, 14:12

Вот. Значит, условие уже выполняется. Смотрите, как работаете со строками. Обратите внимание, что после кода хука будет выполнена оригинальная команда, которая перезапишет все Ваши старания :smile2: А ещё на то, что в хуке у Вас в esi не указатель на строку, а по-прежнему ID элемента (подумайте, как иначе условие выполнилось).

Короче, вы записываете в esi указатель на строку, а команда после хука использует этот указатель, как индекс ([esi*8]; см. картинку выше). Отсюда и вылет.
Вернуться к началу

Пред.След.

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

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

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