Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 11 июл 2019, 16:54

И еще пара нубских вопросов:
Правильно ли сохраняю заголовок, технически работает:
Код: Выделить всё
_LHF_(SetHeadSave)
{
   char Head[8] = "H3FRESH";
   c->esi = *Head;
    return EXEC_DEFAULT;
}


И как потом считать 8 символов, не могу найти правильный синтаксис:
Код: Выделить всё
_LHF_(LoadHeadSave)
{
   char Head[8] = *(char*)c->esi;
    return EXEC_DEFAULT;
}
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

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

Сообщение RoseKavalier » 11 июл 2019, 18:52

These are not compatible data types:
const char* cannot be directly converted to char[] and vice-versa

This part
>>char Head[8] = "H3FRESH";
is allocated on the stack and goes out of context once you exit the LoHook, it will either give very bad result or work if you are lucky.

Better would be something like:
Load:
Код: Выделить всё
if (strcmp((char*)c->esi, "H3FRESH") == 0) // strcmp returns '0' if two strings are identical
{
 .... // set a flag to know this is a freshmod save
}
return EXEC_DEFAULT;


Save:
Код: Выделить всё
strcpy((char*)c->esi, "H3FRESH");
return EXEC_DEFAULT;


Alex raises a good point about save compatibility being questionable decision but for user practicality it's simpler if that makes any sense (:
My solution for SoD_SP+ when I have over 255 mines / garrisons is to change the game header a bit. SoD_SP+ saves are invisible when you don't have SoD_SP, but appear fine when you do.
Pretty much the same way as you don't see HotA and WoG saves from SoD.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 12 июл 2019, 05:15

It doesnt work, because SetHeadSave and LoadHeadSave are active then "Load Game\Single Scenario" are pressing.
So "c->esi" always = "H3SVG". I was thinking what it should be information from save.
Код: Выделить всё
_LHF_(SetHeadSave)
{
   strcpy((char*)c->esi, "H3FRESH");
   return NO_EXEC_DEFAULT;
}

_LHF_(LoadHeadSave)
{
   IsFreshModSave = false;
   if (strcmp((char*)c->esi, "H3FRESH") == 0) // strcmp returns '0' if two strings are identical
   {
      IsFreshModSave = true;
   }
   return EXEC_DEFAULT;
}

void Service(PatcherInstance *pi)
{
   pi->WriteLoHook(0x4BC041, SetHeadSave);
   pi->WriteLoHook(0x4BC526, LoadHeadSave);
}
Вернуться к началу

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 » 12 июл 2019, 11:37

Следующий код прописывает сигнатуру H3FRESH вместо H3SVG при сохранении, а также фильтрует сейвы при загрузке (загрузить можно только сейвы с сигнатурой H3FRESH).

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

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

const char* FMSignature = "H3FRESH";

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

    return EXEC_DEFAULT;
}

int __stdcall loadGame(LoHook* h, HookContext* c)
{
    c->return_address = 0x4BC5E8;

    if (!strcmp((char*)c->esi, FMSignature)) {
        c->return_address = 0x4BC601;
    }
       
    if (CALL_3(int, __thiscall, 0x4C52F0, c->ecx, c->ebx, c->edx) < 0) {
        c->return_address = 0x4BC5E8;
    }

    return NO_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.FMSaveLoad");

            _PI->WriteLoHook(0x4BC046, saveGame);
            _PI->WriteLoHook(0x4BC5DD, loadGame);
        }
    }

    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 » 12 июл 2019, 12:56

Т.к. отдельной темы для багов в Героях 3 нет, напишу сюда.

Баг со стартом новой игры после удаления сейвов

Load Game -> Single Scenario, удаляем все сейвы с помощью клавиши Delete, Back, Back, New Game -> Single Scenario = Crash.

Проверял на последней версии HD мода.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 12 июл 2019, 13:20

Попробывал, но вылетает при нажатии "Новая играя\Одиночная игра" даже с одним хуком _PI->WriteLoHook(0x4BC046, saveGame).
Вернуться к началу

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 » 12 июл 2019, 13:21

Я тут подумал, что если нужно сохранять значение всего одного флага, то почему бы его не прописывать прямо в сигнатуру: H3FRESH0, H3FRESH1?
Вернуться к началу

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 » 12 июл 2019, 13:21

Убедитесь, что не нажимаете Load Game до этого (я выше писал о баге HD мода). Т.е. когда список игр пуст, будет вылет. Вам нужно сделать хотя бы один сейв H3FRESH.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 12 июл 2019, 13:27

AlexSpl писал(а):

Убедитесь, что не нажимаете Load Game до этого (я выше писал о баге HD мода). Т.е. когда список игр пуст, будет вылет. Вам нужно сделать хотя бы один сейв H3FRESH.

А перезапуск не влияет? Первый раз да я нажал Load Game, но потом, после перезахода только новую игру пробую создавать.
Последний раз редактировалось as239 12 июл 2019, 13:29, всего редактировалось 1 раз.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 12 июл 2019, 13:28

AlexSpl писал(а):

Я тут подумал, что если нужно сохранять значение всего одного флага, то почему бы его не прописывать прямо в сигнатуру: H3FRESH0, H3FRESH1?

Интересная мысль, а как это на загрузку сейвов влияет? Сейвы сделанные без фрешмода будут не видны?
Вернуться к началу

Пред.След.

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

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

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