Объявления
Поздравляем
VDV_forever


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 21 апр 2021, 12:32

А зачем Вы туда запихнули? :smile1:
Вернуться к началу

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

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

Сообщение Rolex » 21 апр 2021, 12:55

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

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

char iniPath[MAX_PATH];
char strBuffer[201] = "";

char curDir[MAX_PATH];
char path[MAX_PATH];
char emptyPath[MAX_PATH] = "";





const char* portraitsDir = GetPrivateProfileStringA("NamePack", "Name", "Text", strBuffer, 201, iniPath);
bool LoadingFromCustomFolder = false;

int __stdcall afterInit(LoHook* h, HookContext* c)
{
   HMODULE hHD_TC2 = GetModuleHandleA("HD_TC2.dll");
   _PI->WriteHexPatch((int)hHD_TC2 + 0x676C, "90 90 90 90 90");

   return EXEC_DEFAULT;
}

int __stdcall loadPcx(LoHook* h, HookContext* c)
{
   sprintf(path, "%s\\%s\\", curDir, portraitsDir);

   if (!strncmp((char*)c->ebx, "HP", 2))
   {
      strcat(path, (char*)c->ebx);

      // Если нужная картинка есть в папке portraitsDir
      if (_access(path, 0) != -1)
      {
         c->eax = (int)path;
         c->ebx = c->eax;
         LoadingFromCustomFolder = true;
      }
   }

   return EXEC_DEFAULT;
}

int __stdcall fixPath(LoHook* h, HookContext* c)
{
   if (LoadingFromCustomFolder)
   {
      c->edi = (int)emptyPath;
      LoadingFromCustomFolder = false;
   }

   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.NewPictures");

         GetCurrentDirectoryA(sizeof(iniPath), iniPath);
         strcat(iniPath, "\\Portraits.ini");

         GetCurrentDirectoryA(MAX_PATH, curDir);
         _PI->WriteLoHook(0x44F602, fixPath);
         _PI->WriteLoHook(0x55AA88, loadPcx);
         _PI->WriteLoHook(0x4EE1C1, afterInit);
      }
   }

   return TRUE;
}

Я GetCurrentDirectoryA и strcat перенес в DllMain. Но GetPrivateProfileStringA присваивается const char* portraitsDir вне функции.
Как мне исправить этот код, чтобы картинки брались из папки, которая находится в папке с плагином, имя которой будет прописано в файле Portraits.ini, который будет лежать вместе с нашим dll?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 21 апр 2021, 13:01

Вместо этого

Код: Выделить всё
const char* portraitsDir = GetPrivateProfileStringA("NamePack", "Name", strBuffer, 201, iniPath);

нужно

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

Почему? Потому, что мы не знаем длину пути, который прочитаем из ini-файла.

Далее, уже в DllMain:

Код: Выделить всё
GetPrivateProfileStringA("NamePack", "Name", "имя папки по умолчанию", portraitsDir, sizeof(portraitsDir), iniPath);
Последний раз редактировалось AlexSpl 21 апр 2021, 13:05, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение Rolex » 21 апр 2021, 13:05

AlexSpl писал(а):

"имя папки по умолчанию"

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

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 21 апр 2021, 13:06

Да, но лучше вписать имя. Например, Portraits. Плагин попытается загружать картинки именно из этой папки, если ini будет отсутствовать либо же при его чтении возникнут ошибки.
Вернуться к началу

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

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

Сообщение Rolex » 21 апр 2021, 13:12

В ini так писать?

Код: Выделить всё
[NamePack]
Name="Portraits"


Или название папки без кавычек?
Последний раз редактировалось Rolex 21 апр 2021, 13:14, всего редактировалось 2 раз(а).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 21 апр 2021, 13:14

Да. Без кавычек. Без кавычек, даже если в строке есть пробелы.

Кстати, char emptyPath[MAX_PATH] = ""; можно заменить на const char* emptyPath = "";

Как бы, неважно особо, но во втором случае строка короче.
Вернуться к началу

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

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

Сообщение Rolex » 21 апр 2021, 13:19

Проверил. Интересно, что даже с кавычками все работает.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 21 апр 2021, 13:19

Цитата:
Проверил. Интересно, что даже с кавычками все работает.

Сила API Windows :smile1:
Вернуться к началу

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

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

Сообщение Rolex » 21 апр 2021, 13:28

AlexSpl писал(а):

Кстати, char emptyPath[MAX_PATH] = ""; можно заменить на const char* emptyPath = "";

Супер оптимизация. Аж на 3 символа короче. :smile1:
Вернуться к началу

Пред.След.

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

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

Сейчас этот форум просматривают: Yandex [bot] и гости: 11