Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
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 » 02 окт 2017, 16:12

Интересно.

Код: Выделить всё
GetPatcher()->GetLastPatchAt(0x41D98B)->Destroy();

Можете проверить для Town Portal?
Последний раз редактировалось AlexSpl 02 окт 2017, 16:16, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение Ben80 » 02 окт 2017, 16:15

AlexSpl писал(а):

Сейчас попробую. Написано:

Цитата:
// возвращает NULL, если в окрестности адреса address не был применен ни один патч/хук,
// созданный данным экземпляром PatcherInstance
// иначе возвращает последний примененый патч/хук в окрестности адреса address,
// созданный данным экземпляром PatcherInstance


Это, кстати, для методов класса PatcherInstance.
А есть одноименные методы класса Patcher.
Вернуться к началу

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

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

Сообщение Ben80 » 02 окт 2017, 16:15

AlexSpl писал(а):

Интересно.

Код: Выделить всё
GetPatcher()->GetLastPatchAt(address)->Destroy();


Можете проверить для TP?


Попробую :smile1:
Вернуться к началу

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 » 02 окт 2017, 16:17

Я адрес патча написал выше. У меня просто под рукой нет того плагина. Уберите LoHook, скипующий диалог подтверждения, и напишите вместо него код выше.
Вернуться к началу

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

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

Сообщение Ben80 » 02 окт 2017, 16:22

Пока не очень.

Код: Выделить всё
Exception
{
   Module:    
   Adress:      0x69471023
   Code:        EXCEPTION_ACCESS_VIOLATION
   Flags:       0x00000000
   Information: read of address: 0x69471023
}
Вернуться к началу

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

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

Сообщение Ben80 » 02 окт 2017, 16:24

А вот сейчас работает :smile1:

Сейчас буду разбираться почему.
Вернуться к началу

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

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

Сообщение Ben80 » 02 окт 2017, 16:26

Вот так работает:

Код: Выделить всё
_P = GetPatcher();
_P->GetLastPatchAt(0x41D98B)->Destroy();
Вернуться к началу

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

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

Сообщение Ben80 » 02 окт 2017, 16:27

Код: Выделить всё

#include "..\..\include\homm3.h"

// объекты patcher_x86.
Patcher* _P;
PatcherInstance* _PI;


int __stdcall tpCostForHuman(LoHook* h, HookContext* c)
{
   *(int*)(c->ebp - 0x40) = 1200;
   *(int*)(c->ebp - 0x3C) = 1200;
   *(int*)(c->ebp - 0x38) = 1000;
   *(int*)(c->ebp - 0x34) = 800;
   
   return EXEC_DEFAULT;
}

int __stdcall skipTownPortalConfirm(LoHook* h, HookContext* c)
{
   if ( c->eax == -1 ) {
     c->ecx = *(unsigned char*)(c->edi + 5); // Выполняем затёртую jmp-патчем команду
      c->return_address = 0x41D990; // Обходим jmp-патч
      return NO_EXEC_DEFAULT;
   }
   
   c->return_address = 0x41D939;
   return NO_EXEC_DEFAULT;
}


int __stdcall mpointsEarth_1(LoHook* h, HookContext* c) {
   int level = c->eax;
   int mpoints[] = {1200, 1200, 1000, 800};
   c->eax = mpoints[level];
   
   c->return_address = 0x56B5AA;
   return NO_EXEC_DEFAULT;
}

int __stdcall mpointsEarth_2(LoHook* h, HookContext* c) {
   int level = c->eax;
   int mpoints[] = {1200, 1200, 1000, 800};
   c->eax = mpoints[level];
   c->ecx = *(int*)(c->esi + 0x4D);
   
   c->return_address = 0x430532;
   return NO_EXEC_DEFAULT;
}

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
   static _bool_ plugin_On = 0;
   switch (ul_reason_for_call)
   {
      case DLL_PROCESS_ATTACH:
      if (!plugin_On)
      {
         plugin_On = 1;
         

         _P = GetPatcher();
         _P->GetLastPatchAt(0x41D98B)->Destroy();
         _PI = _P->CreateInstance("HD.Plugin.TownPortal");
         
         _PI->WriteLoHook(0x41D538, tpCostForHuman); // меняем расходы MP c 300/300/200 на 1200/1000/800
         _PI->WriteHexPatch(0x41D6D1, "90 90 90 90 90 90 90 90 90 90"); // отменяем проверку на уровень Магии Земли в главной функции заклинания
         _PI->WriteLoHook(0x56B59B, mpointsEarth_1); // расходы MP во вспомогат. функции 1
         _PI->WriteHexPatch(0x56B3B4, "90 90 90 90 90 90"); // отменяем проверку на уровень Магии Земли во вспомогат. функции 1
         _PI->WriteLoHook(0x430520, mpointsEarth_2); // расходы MP во вспомогат. функции 2
         //_PI->WriteLoHook(0x41D934, skipTownPortalConfirm); // обходим jmp патч HD мода (версии 3.809 и выше)
         }
      break;

      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
      break;
   }
   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 » 02 окт 2017, 17:05

А у меня не работает. Всё равно требует подтверждения.

* * *
Заработало так:

Код: Выделить всё
GetPatcher()->GetLastPatchAt(0x41D98B)->Undo();

Ещё нужно учитывать, что теоретически по этому адресу может быть целая "стопка" патчей. Поэтому правильно проходить по всем патчам из "стопки" и отменять только нужный.
Вернуться к началу

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

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

Сообщение Ben80 » 02 окт 2017, 19:08

AlexSpl писал(а):

В эту тему предлагаю складывать пользовательские плагины для HD мода. Все обсуждения ведём в соседней теме


Принимается. Хотя наплыв выкладывающих пока вроде бы не ожидается :smile1:
Вернуться к началу

Пред.След.

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

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

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

cron