Объявления

Друзья, если не получается зарегистрироваться, напишите на почту 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 » 20 апр 2021, 23:40

Цитата:
Как написал код для маленьких теперь все ок. Все отображается и никаких вылетов. Но все равно под каждого героя ифов дофига получится...

Ровно 2 на всех получится.

Цитата:
Код нужно переписать, убрать коммандную строку и путь нужно получать исходя от местоположения dll. Потому как у каждого пользователя будет свой путь.

Первое к автору HD-мода. Я патчить dll-ку не буду. Это неблагодарное занятие (кстати, можете тоже посмотреть в этой теме; ещё igrik тогда возмущался, и речь пошла про "иголки"). Неблагодарное потому, что при обновлении HD_TC2.dll вся работа пойдёт насмарку. А needles очень не надёжная штука. Хотя для Героев, может быть, и сгодится. Вряд ли автор мода резко поменяет среду разработки.

А как получить текущую папку плагина, был пример в этой теме. Читайте про GetCurrentDirectory().
Последний раз редактировалось AlexSpl 20 апр 2021, 23:58, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение Rolex » 20 апр 2021, 23:57

AlexSpl писал(а):

Первое к автору HD-мода. Я патчить dll-ку не буду. Это неблагодарное занятие.

Разок, думаю, можно. Только убрать эту коммандную строку и все. Из самой последней версии мода.

AlexSpl писал(а):

А как получить текущую папку плагина, был пример в этой теме.

Вот бы найти еще где это было. А не помните в каком плагине?

!!! Еще нужно проверять, а есть ли картинка, которой нужно заменить оригинальную у нас в папке с плагином. Иначе получается плагин всегда будет пытатся это сделать, даже тогда, когда картинки с таким же именем нет и тогда получается без этой проверки вместо оригинальной будет желтый перечеркнутый круг отображатся и постоянно вылезать сообщение, что такой-то файл не найден.
Вернуться к началу

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 » 21 апр 2021, 00:05

Цитата:
!!! Еще нужно проверять, а есть ли картинка, которой нужно заменить оригинальную у нас в папке с плагином. Иначе получается плагин всегда будет пытатся это сделать, даже тогда, когда картинки с таким же именем нет и тогда получается без этой проверки вместо оригинальной будет желтый перечеркнутый круг отображатся и постоянно вылезать сообщение, что такой-то файл не найден.

Ничего не нужно. Плагин подгрузит ровно те, которые мы положим в папку (можно в отдельную (-ые) рядом с плагином; главное - правильно прописать путь). По загрузке сразу всех картинок. Имейте в виду, что в хуке подгружается одна картинка за раз, поэтому Вам не нужно 150+ if-ов или цикл. Простая работа со строками: если имя начинается с HPL, прописываем текущую директорию плагина + имя картинки. Всё. Обычная конкатенация строк. Не верю, что Вы не умеете работать со строками (с векторами же разобрались).

По патчу dll из плагина здесь (до этого предыстория; необходимость возникла для изменения того, что меняет HD мод, а именно нужна была перестройка магической гильдии с любого уровня). Обычно можно обойтись без патча dll-ок, но есть ситуации, когда нужно менять добавленный HD модом код (это наш случай). Проблема в том, что этот код - тоже плагин и может не только поменяться, но и исчезнуть либо слиться с другим плагином. Это сразу сделает наши изменения бесполезными. Посмотрите на дату изменения HD_TC2.dll (8 февраля 2021 г.), т.е. совсем недавно. Не факт, что любое обновление dll сломает наш плагин, но все шансы есть, а HD мод развивается.

В некоторых случаях, если очень хорошо подумать, можно обойтись и без правки dll, но, похоже, у нас не такой случай (Герои точно не вызывают окно командной строки).
Вернуться к началу

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 » 21 апр 2021, 08:45

Код загрузки всех больших и маленьких портретов из папки portraitsDir в папке с плагином:

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

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

char curDir[MAX_PATH];
char path[MAX_PATH];
char emptyPath[MAX_PATH] = "";
const char* portraitsDir = "Portraits";
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(MAX_PATH, curDir);
         _PI->WriteLoHook(0x44F602, fixPath);
         _PI->WriteLoHook(0x55AA88, loadPcx);
         _PI->WriteLoHook(0x4EE1C1, afterInit);
      }
   }

   return TRUE;
}

Более "секьюрный" вариант. Заменил локальную пустую строчку на глобальную. Попробую выпилить окошко командной строки.

Убрал окно командной строки. Будет жить до первого "неудачного" обновления HD_TC2.dll.
Вернуться к началу

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

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

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

AlexSpl писал(а):

Код загрузки всех больших и маленьких портретов из папки portraitsDir в папке с плагином:

Наверное, все же из папки Portraits, ведь portraitsDir - это переменная.

AlexSpl писал(а):

Error C4996 'access': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _access. See online help for details.

Для C++08 и ниже access работает, а для С++11 и выше уже пришлось использовать _access. Типа первый уже устарел.

AlexSpl писал(а):

Более "секьюрный" вариант. Заменил локальную пустую строчку на глобальную. Попробую выпилить окошко командной строки. Убрал окно командной строки. Будет жить до первого "неудачного" обновления HD_TC2.dll.

Спасибо. Я прекрасно понимаю всю косячность патча DLL-мода. Один раз сделали и хватит. Каждый раз его патчить, после каждой "неудачной" обновы HD_TC2.dll - это реально глупо и никто этого делать больше не будет.

У меня есть еще одна идея, которая не требует патча DDL. Написать батник, где пользователю на выбор предлагается пак с картинками, который соотв определенной цифре. Пользоваетль жмет цифру и из _HD3_Data\Common\(Выбранный_пак_в_BMP) копируется в корень Common. Если выбран другой пак, то картинки заменяются новыми, лишние старые удаляються (если есть). Можно сделать все это красиво на Delphi. Реализовать выбор пака с картинками на подобе того, как подключаются плагины в HD-моде. Пользователь жмет подкл, выбирает нужный пак с картинкам, жмет ОК и проделываются теже действия, что делает и батник, просто все красиво и удобно для пользователя. Главное это все паки пересохранить в родной BMP.

***
Кстати, если писать на Delphi, то можно картинки хранить в родном PCX и прямо в коде этой утилиты для выбора пака картинок конвертировать PCX в родной BMP. Где-то даже видел готовый код ковертации.
Вернуться к началу

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

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

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

Кстати, вот это надо бы сделать возможность изменять в ini:
Код: Выделить всё
const char* portraitsDir = "Portraits";


Чтобы вместе с dll, шел Portraits.ini, где можно было бы указывать
portraitsDir = "Имя_пака_с_картинками"

То есть пользователь в ini-файле сам задает имя папки с картинками в папке с плагином, который будет подгружаться. Чтобы постоянно из каждого пака не копировать все картинки в папку Portraits. Как это лучше сделать не подскажите?
Вернуться к началу

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 » 21 апр 2021, 11:20

Цитата:
То есть пользователь в ini-файле сам задает имя папки с картинками в папке с плагином, который будет подгружаться. Чтобы постоянно из каждого пака не копировать все картинки в папку Portraits. Как это лучше сделать не подскажите?

Смотрите пример работы с ini, например, в плагине, ограничивающем количество героев игрока.
Вернуться к началу

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

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

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

Вот так не работает. Я хз. :smile5:

Код: Выделить всё
char iniPath[MAX_PATH];
...
GetCurrentDirectoryA(sizeof(iniPath), iniPath);
strcat(iniPath, "\\Portraits.ini");

const char* portraitsDir = GetPrivateProfileStringA("NamePack", "Name", "Portraits", iniPath);
Вернуться к началу

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 » 21 апр 2021, 12:00

Вас не смущает часть "Int" в GetPrivateProfileIntA(), когда речь идёт о строках? :smile1:
Вернуться к началу

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

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

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

Там String. Я это увидел и исправил сразу же еще до вашего сообщения. String, по-моему, принимает больше параметров, что за что каждый из них отвечает я хз. Все равно не работает.
Последний раз редактировалось Rolex 21 апр 2021, 12:05, всего редактировалось 2 раз(а).
Вернуться к началу

Пред.След.

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

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

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