Объявления

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

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

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

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

Сообщение Rolex » 26 фев 2021, 12:45

Нашел адрес на таблицу с названием и описанием вторичных навыков:
Код: Выделить всё
(*(int*)0x67DCF0 + SecondarySkill_ID * 16)

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

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

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

Сообщение AlexSpl » 26 фев 2021, 12:48

Я вспомнил :smile1: Посмотрите плагин, который меняет названия и описания вторичных навыков, в теме с готовыми плагинами. Название навыка как раз по нулевому смещению.

Попробуйте *(char**)(*(int*)0x67DCF0 + SecondarySkill_ID * 16).
Вернуться к началу

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

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

Сообщение Rolex » 26 фев 2021, 12:54

Вот из него я и взял адрес. Но там мы создаем свою структуру и ее описания сами и заменяем ею дефолтную. А здесь наоборот из дефолтной нужно вытащить само название.
Вернуться к началу

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

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

Сообщение Rolex » 26 фев 2021, 13:07

Что-то в инфо строке вообще ничего не пишет, когда навожу курсор на Ученого, хз почему...
Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "HotA\homm3.h"


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

char TxtBuffer[50];

int __stdcall showScholarInfo(LoHook* h, HookContext* c)
{
   // Учёный?
   if (c->eax == 0x51) {
      int ScholarType = (*(int*)c->ebx << 26) >> 26;
      int ScholarPrimarySkill = *(int*)c->ebx << 26 >> 29;
      int ScholarSecondarySkill = *(int*)c->ebx << 19 >> 25;
      int ScholarSpell = *(int*)c->ebx << 9 >> 22;


      
      switch (ScholarType) {
      case 0:
         sprintf(TxtBuffer, "%s %s", (char*)c->edi, "(stat)");
         break;
      case 1:
         sprintf(TxtBuffer, "%s %s", (char*)c->edi, *(char**)(*(int*)0x67DCF0 + ScholarSecondarySkill * 16));
         break;
      case 2:
         sprintf(TxtBuffer, "%s %s", (char*)c->edi, o_Spell[ScholarSpell].name);
         break;
      }

      c->edi = (int)TxtBuffer;
   }

   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("HD.Plugin.Scholar");

         _PI->WriteLoHook(0x40D059, showScholarInfo);
      }
   }

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

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

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

Сообщение AlexSpl » 26 фев 2021, 13:14

Попробуйте использовать o_TextBuffer. Глобальные массивы char[] лучше не объявлять.
Последний раз редактировалось AlexSpl 26 фев 2021, 13:38, всего редактировалось 2 раз(а).
Вернуться к началу

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

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

Сообщение Rolex » 26 фев 2021, 13:23

Сделал. Один тот же кркозябр выводит на всех Ученых.

Код: Выделить всё
char o_TxtBuffer[50];

int __stdcall showScholarInfo(LoHook* h, HookContext* c)
{
   // Учёный?
   if (c->eax == 0x51) {
      int ScholarType = (*(int*)c->ebx << 26) >> 26;
      int ScholarPrimarySkill = *(int*)c->ebx << 26 >> 29;
      int ScholarSecondarySkill = *(int*)c->ebx << 19 >> 25;
      int ScholarSpell = *(int*)c->ebx << 9 >> 22;


      
      switch (ScholarType) {
      case 0:
         sprintf(o_TxtBuffer, "%s %s", (char*)c->edi, "(stat)");
         break;
      case 1:
         sprintf(o_TxtBuffer, "%s %s", (char*)c->edi, *(char**)(*(int*)0x67DCF0 + ScholarSecondarySkill * 16));
         break;
      case 2:
         sprintf(o_TxtBuffer, "%s %s", (char*)c->edi, o_Spell[ScholarSpell].name);
         break;
      }

      *(char**)c->edi = o_TxtBuffer;
   }

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

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

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

Сообщение AlexSpl » 26 фев 2021, 13:27

c->edi = (int)o_TxtBuffer;
Вернуться к началу

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

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

Сообщение Rolex » 26 фев 2021, 13:32

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

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

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

Сообщение AlexSpl » 26 фев 2021, 13:35

Потому что нет Мудрости/книги заклинаний.

Цитата:
int ScholarType = (*(int*)c->ebx << 26) >> 26;

А ещё из-за этого :smile2:

Кстати, из-за этого не работал TxtBuffer[50], а я уже загуглил про оптимизацию :lol: Короч, пользуйтесь глобальными массивами char[] на здоровье. Оптимизируются очень маленькие строки и то, если не используются.
Вернуться к началу

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

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

Сообщение Rolex » 26 фев 2021, 13:49

AlexSpl писал(а):

А ещё из-за этого :smile2:

Да, невнимательный я. Забыл исправить. Теперь все ок. Последнее, что осталось, это найти адрес на таблицу с названием первичных навыков и получить из нее название навыка.
Вернуться к началу

Пред.След.

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

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

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