Объявления

Друзья, если не получается зарегистрироваться, напишите на почту 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 » 12 июл 2019, 13:29

Влияет. Попробуйте повторить баг без плагинов. Это либо баг оригинала, либо HD мода. А в первый запуск у вас файлов H3FRESH не было. Вот и случился вылет.
Вернуться к началу

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:32

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

Можно разрешить, чтобы видны были только H3FRESH0 и H3FRESH1 (добавить проверку strcmp). А флаг читать как последний символ сигнатуры: если '0' - нет изменений геймплея, '1' - есть.

Что-то вроде:

Код: Выделить всё
if (!strcmp((char*)c->esi, "H3FRESH0")) GameplayChangesOn = false;
if (!strcmp((char*)c->esi, "H3FRESH1")) GameplayChangesOn = true;


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

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

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

Сообщение as239 » 12 июл 2019, 14:33

Все получилось - неправильный возврат стоял в хуке.
Единственное не могу сделать идею с флагом в сигнатуре, пробую так, но никакие сейвы не виды после сохранения:
Код: Выделить всё
const char* FMSignature0 = "H3FRESH0";
const char* FMSignature1 = "H3FRESH1";

_LHF_(SetHeadSave)
{
   if (GamePlayChangesOn)
      c->edi = (int)FMSignature1;
   else
      c->edi = (int)FMSignature0;

   return EXEC_DEFAULT;
}

_LHF_(LoadHeadSave)
{
        c->return_address = 0x4BC5E8;

   if (!strcmp((char*)c->esi, FMSignature0))
      GamePlayChangesOn = false;
   if (!strcmp((char*)c->esi, FMSignature1))
      GamePlayChangesOn = true;

    if (!strcmp((char*)c->esi, FMSignature0) || !strcmp((char*)c->esi, FMSignature1)) {
        c->return_address = 0x4BC601;
    }
       
   if ( THISCALL_3(int, 0x4C52F0, c->ecx, c->ebx, c->edx) < 0) {
        c->return_address = 0x4BC5E8;
    }
   return NO_EXEC_DEFAULT;
}
Вернуться к началу

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

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

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

И еще у меня почему-то перестал работать код igrikа - валится, при попытке присвоения первого же атрибута структуры:
Код: Выделить всё
      NData->recipient_id = -1;

Что можно посмотреть?
Вернуться к началу

offlineАватара пользователя
Владимир  
Эксперт
Эксперт
 
Сообщения: 1057
Зарегистрирован: 30 окт 2012, 18:37
Пол: Не указан
Награды: 3
Высшая медаль (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (1)
Поблагодарили: 638 раз.

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

Сообщение Владимир » 12 июл 2019, 16:02

Техническое: господа, а вам не тесно в одной-единственной теме?
Больше 130 страниц уже; потом понадобится что-то найти - найдёте?
Вернуться к началу

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, 16:51

Цитата:
Единственное не могу сделать идею с флагом в сигнатуре, пробую так, но никакие сейвы не виды после сохранения:

Попробуйте уменьшить длину сигнатуры (например, FRESH0, FRESH1 или H3FM0, H3FM1). Видимо, сигнатуру игра читает в короткий буфер. Только старые сейвы (H3FRESH0 и H3FRESH1) удалите, их игра не увидит.

Вот такой код у меня работает:

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

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

const char* FMSignature0 = "H3FMOD0";
const char* FMSignature1 = "H3FMOD1";

bool GameplayChangesOn = false;

int __stdcall saveGame(LoHook* h, HookContext* c)
{
    c->edi = GameplayChangesOn ? (int)FMSignature1 : (int)FMSignature0;

    return EXEC_DEFAULT;
}

int __stdcall loadGame(LoHook* h, HookContext* c)
{
    bool isH3FRESH0 = !strcmp((char*)c->esi, FMSignature0);
    bool isH3FRESH1 = !strcmp((char*)c->esi, FMSignature1);

    c->return_address = 0x4BC5E8;

    if (isH3FRESH0 || isH3FRESH1) {
        GameplayChangesOn = isH3FRESH1;
        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;
}

Хук loadGame вызывается при каждом чтении файла сохранения и выводит лишь те, у которых сигнатура фрешмода, так что значение GameplayChangesOn после построения списка будет неопределённым. Но. Этот хук вызывается ещё один раз при загрузке сейва. И вот уже здесь GameplayChangesOn получит корректное значение: false или true - в зависимости от сигнатуры загружаемого сейва. Как бы две задачи решаем сразу: фильтруем список сохранений и выставляем флаг при загрузке сейва.

* * *
 
Хотя есть проблема: если во время игры попытаться загрузить сейв (построить список файлов), а потом отменить, то значение флага будет неопределённым*. Поэтому нужно всё-таки отличать построение списка сейвов и реальную загрузку сейва.

* Всё-таки нет: при загрузке сейва мы же оказываемся в главном меню :smile4: Так что, всё должно работать, по идее.

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

Ещё обязательно нужно проверить работу запароленных сейвов и вариант, когда игрок отменяет загрузку: на каком этапе устанавливается флаг GameplayChangesOn? сбрасывается ли он каждый раз при показе диалога с настройками или сохраняется в течение игровой сессии?
Вернуться к началу

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

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

Сообщение as239 » 13 июл 2019, 04:23

Есть проблема - LoadHeadSave вызывается и при сохранении, когда открывается список сейвов, раньше чем SetHeadSave и этот код:
Код: Выделить всё
    if (isH3FRESH0 || isH3FRESH1) {
        GamePlayChangesOn = isH3FRESH1;
        c->return_address = 0x4BC601;
    }


Сбрасывает реальное значение флага GamePlayChangesOn.
И в результате при загрузке он всегда false.
Хотя сохранялся со значение true.

Обновлено:
Вообщем, сделал сохранение флага в сейв через код RoseKavalier.
А установку сигнатуры через код AlexSPL.
Теперь все работает как надо - и в сетевой и с паролями и без.
Вернуться к началу

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

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

Сообщение as239 » 13 июл 2019, 05:08

AlexSpl писал(а):

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

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

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

Проверял на последней версии HD мода.


Отписался на HW.
Вернуться к началу

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

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

Сообщение as239 » 13 июл 2019, 05:31

Кстати каким-то непонятным образом, эти хуки:
Код: Выделить всё
pi->WriteLoHook(0x4BC046, SetHeadSave);
pi->WriteLoHook(0x4BC5DD, LoadHeadSave);
 

Синхронизируют данные флага GamePlayChangesOn, между хостом и остальными игроками.
Т.е. запускаю сетевую игру, у хоста ставлю флаг GamePlayChangesOn, у игроков флаг сброшен.
После запуска игры у игроков значение флага также окажется взведенным.
Если убрать эти хуки, то каждый будет играть со своим значением флага.
Последний раз редактировалось as239 13 июл 2019, 05:37, всего редактировалось 4 раз(а).
Вернуться к началу

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

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

Сообщение as239 » 13 июл 2019, 05:34

Владимир писал(а):

Техническое: господа, а вам не тесно в одной-единственной теме?
Больше 130 страниц уже; потом понадобится что-то найти - найдёте?

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

Пред.След.

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

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

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

cron