Объявления

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

Регистрируйтесь :smile20: Отличный форум. Я на нём с 2006-го. Только там немного другой тип игроков обитает. Например, там очень туго заходит понятие "офлайн-турнира". И они отстают от нас в техническом плане очень сильно в целом, за исключением некоторых участников форума :)
Вернуться к началу

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

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

Сообщение Ben80 » 03 окт 2017, 20:08

Ну, мне кажется, у них там на Западе не принято тратить силы на фанатские усилия. Вся энергия должна уходить в основную работу и тд. Но поэтому там такие игры, как Герои 3, создавали, а у нас - нет (то есть я конечно далек от мысли, что там люди тупые, по Задорнову :lol: ).
Но все равно приятно, что наши фанаты круче.
Вернуться к началу

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 окт 2017, 20:15

Там интернациональное коммьюнити. Встречаются очень грамотные люди. Но, в целом, наши понятия об игре не прокатывают :) Например, про офлайн можно даже не писать - всё равно не поймут.
Вернуться к началу

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 окт 2017, 09:21

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

Как получить строку из текстовых ресурсов игры? Нужно знать адрес, по которому загружен текстовый файл. Найти его быстро можно просто по имени (например, genrltxt.txt) в базе IDA. Указатель на загруженный текст обычно будет чуть ниже в одной из инструкций (для genrltxt.txt это mov dword_6A5DC4, eax). Номер нужной строки можно посмотреть с помощью TxtEdit от sergroj (он указан в статусной строке при выделении).

Пример для Mana Vortex:

Код: Выделить всё
// Пишем в буфер 581 строку (нумерация начинается с 0) из текстового файла genrltxt.txt (указатель по адресу 0x6A5DC4)
sprintf(o_TextBuffer, "%s", (*(_TXT_**)0x6A5DC4)->GetString(580));

// Показываем стандартный диалог
b_MsgBox(o_TextBuffer, MBX_OK);
Вернуться к началу

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

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

Сообщение Ben80 » 04 окт 2017, 15:43

По поводу NewSecSkillDesc

Я бы, возможно, еще встраивал в подобные плагины проверку на наличие в DATA соответствующих файлов (если файл есть, то не менять посредством кодинга).

Например, если есть SPTRAITS.txt, то не менять эффекты заклинаний кодингом (коэффициенты).

Кстати, 2AlexSpl, txt файлы из H3Bitmap.lod можно вообще распространять открыто или это нарушение прав всяческих правообладателей ?

Вообще я склоняюсь к тому, чтобы написать программу на Delphi для патчинга H3Bitmap.lod.
То есть что-то вроде инсталлятора.
Вернуться к началу

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

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

Сообщение Ben80 » 04 окт 2017, 15:51

Ben80 писал(а):


Вообще я склоняюсь к тому, чтобы написать программу на Delphi для патчинга H3Bitmap.lod.
То есть что-то вроде инсталлятора.


Хотя, может быть и через код самих плагинов лучше, как это у Вас сделано.
Вернуться к началу

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 окт 2017, 16:15

Цитата:
Кстати, 2AlexSpl, txt файлы из H3Bitmap.lod можно вообще распространять открыто или это нарушение прав всяческих правообладателей ?

Теоретически нельзя. Но я не помню текст лицензии :) А вот плагином изменять никто не запретит.
Вернуться к началу

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 окт 2017, 16:57

Если нужна замена всех названий и описаний сразу, то проще так:

Код: Выделить всё
int __stdcall changeSecSkillDesc(LoHook* h, HookContext* c)
{
    *(int*)0x67DCF0 = (int)NewSecSkillDesc;

    return EXEC_DEFAULT;
}

Если одного:

Код: Выделить всё
struct SecSkillDesc
{
    char* Name;
    char* BasicDesc;
    char* AdvancedDesc;
    char* ExpertDesc;
};

SecSkillDesc EagleEyeDesc =
{
    "Eagle Eye",
    "{Basic Eagle Eye}\n\nYour description here",
    "{Advanced Eagle Eye}\n\nYour description here",
    "{Expert Eagle Eye}\n\nYour description here"
};

int __stdcall changeSecSkillDesc(LoHook* h, HookContext* c)
{
    *(SecSkillDesc*)(*(int*)0x67DCF0 + 11 * 16) = EagleEyeDesc;

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

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

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

Сообщение Ben80 » 04 окт 2017, 17:08

Продвинулся в написании Disguise плагина.
Что может данная заготовка - преувеличивает численность войск в 5 раз, устанавливает длительность заклинания 2 хода.

Как насчет критики ? :smile1:

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

Patcher* _P;
PatcherInstance* _PI;

_Hero_* ghero1 = new _Hero_();
_Hero_* ghero2 = new _Hero_();
_Hero_* ghero3 = new _Hero_();
_Hero_* ghero4 = new _Hero_();
_Hero_* ghero5 = new _Hero_();
_Hero_* ghero6 = new _Hero_();
_Hero_* ghero7 = new _Hero_();
_Hero_* ghero8 = new _Hero_();


int __stdcall makeGhostHero(LoHook* h, HookContext* c)
{
   int pHeroes[8];
   pHeroes[0] = (int)ghero1;
   pHeroes[1] = (int)ghero2;
   pHeroes[2] = (int)ghero3;
   pHeroes[3] = (int)ghero4;
   pHeroes[4] = (int)ghero5;
   pHeroes[5] = (int)ghero6;
   pHeroes[6] = (int)ghero7;
   pHeroes[7] = (int)ghero8;

   _Hero_* hero = (_Hero_*)(*(int*)(c->ebp + 8));
   if((int)(hero->disguise) > -1)
   {
       CALL_2(_Hero_*, __thiscall, 0x406410, (_Hero_*)(pHeroes[hero->owner_id]), hero);
       *(int*)(c->ebp + 8) = pHeroes[hero->owner_id];
       hero = (_Hero_*)(*(int*)(c->ebp + 8));
       hero->disguise = -1;
   
        int multiplier = 5;
       
        for(int i=0; i<7; i++)
            hero->army.count[i] = multiplier * hero->army.count[i];

   }

   return EXEC_DEFAULT;
}


int __stdcall discountPackedDisguise(LoHook* h, HookContext* c)
{
    for (int i = 0; i < o_HEROES_COUNT; ++i)
        if ( o_GameMgr->GetHero(i)->owner_id == o_GameMgr->GetMeID() )
        {
            int disguise = (int)(o_GameMgr->GetHero(i)->disguise);
            if(disguise!=-1)
                o_GameMgr->GetHero(i)->disguise--;
        }

    return EXEC_DEFAULT;
}


int __stdcall setPackedDisguise(LoHook* h, HookContext* c)
{
   c->edi = 1;

   return 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();
            _PI = _P->CreateInstance("HD.Plugin.TestDisguise");

            _PI->WriteHexPatch(0x4C7DA5, "90 90 90");
            _PI->WriteLoHook(0x4C75E0, discountPackedDisguise);
            _PI->WriteLoHook(0x52EFEB, makeGhostHero);
            _PI->WriteLoHook(0x41C7C6, setPackedDisguise);
        }
        break;

    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Вернуться к началу

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

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

Сообщение Ben80 » 04 окт 2017, 17:11

Во время написания накололся на проблему с

Код: Выделить всё
if((int)(hero->disguise) > -1)


Первоначально было

Код: Выделить всё
if(hero->disguise > -1)


И это не работало из-за того, что hero->disguise - не int.

Не уверен, что данный момент где-нибудь еще не выплывет (в другом месте кода).
Вернуться к началу

Пред.След.

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

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

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

cron