Объявления

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

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

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

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

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

Вот моя homm3.h, гляньте, что еще можно/нужно завернуть в #pragma pack:
Вложения
homm3.h
(87.06 КБ) Скачиваний: 127
Последний раз редактировалось Rolex 24 апр 2021, 13:43, всего редактировалось 2 раз(а).
Вернуться к началу

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 » 24 апр 2021, 13:42

У Вас _GameMgr_ не завёрнут. Также нужно пройтись по всем вложенным: _TownStartInfo_, _HeroStartInfo_ и т.д. по списку.

Наверное, будет проще завернуть весь блок структур NOALIGN в одну #pragma push/pop секцию, т.е. уберите все отдельные #pragma push/pop и сделайте одну секцию для NOALIGN-структур.
Вернуться к началу

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

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

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

А если туда попадут
#define
typedef
inline

которые находятся вне NOALIGN struct

или

например, функции наподобие:
Код: Выделить всё
inline double DoubleRand(double low, double high)
{
  return low + (double)Rand()/(double)RandMax*(high - low);
}


Ничего страшного?
Последний раз редактировалось Rolex 24 апр 2021, 14:16, всего редактировалось 2 раз(а).
Вернуться к началу

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 » 24 апр 2021, 14:02

Ничего страшного. Все негеройские структуры, а тем более, не структуры будут работать с любым выравниванием. Выравнивание нужно для совместимости структур homm3.h и других хедеров с оригинальными геройскими.
Вернуться к началу

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

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

Сообщение Rolex » 24 апр 2021, 14:14

Есть. Теперь все работает и не вылетает.

Теперь нужно сделать так, что когда вот эта галка в Системных опциях выкл, то не показывать диалог и для жилищ 1-го уровня.

Изображение

А что там с AI, он будет этим пользоваться? Всмысле нанимать грейженных, вместо обычных, когда есть средства?
Вернуться к началу

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 » 24 апр 2021, 14:17

Версия, которая учитывает твик HD.UI.AdvMgr.SkipMapMsgs:

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

Patcher* _P;
PatcherInstance* _PI;

int __stdcall setCreatures(LoHook* h, HookContext* c)
{
    _Dwelling_* dwelling = (_Dwelling_*)c->esi;
    int upgMonId = CALL_1(int, __fastcall, 0x47AAD0, dwelling->creature_types[0]);
   
    if ( upgMonId != ID_NONE && dwelling->creature_types[1] == ID_NONE ) {
        dwelling->creature_types[1] = dwelling->creature_types[0];
        dwelling->creature_counts[1] = dwelling->creature_counts[0];
        dwelling->creature_types[0] = upgMonId;
        if ( dwelling->defenders.type[0] != ID_NONE )
            dwelling->defenders.type[0] = upgMonId;
    }

    return EXEC_DEFAULT;
}

_Dwelling_* GetDwelling(_int_ dwellingId) {
    return (_Dwelling_ *)(o_GameMgr->Field<int>(0x4E39C) + 92 * dwellingId);
}

int __stdcall afterHiring(LoHook* h, HookContext* c)
{
    // Если нанимаем не в городе
    if ( *(int*)(c->esi + 0x48) != 0x62 )
    {
        _Hero_* hero = &o_GameMgr->hero[o_ActivePlayer->selected_hero_id];
        if ( hero )
        {
            _MapItem_* item = o_GameMgr->Map.GetItem(hero->x, hero->y, hero->z);
            if ( item->object_type == 0x11 )
            {
                _Dwelling_* dwelling = GetDwelling(item->setup);
                if ( dwelling && dwelling->creature_types[1] != ID_NONE )
                {
                    dwelling->creature_counts[0] = min(dwelling->creature_counts[0], dwelling->creature_counts[1]);
                    dwelling->creature_counts[1] = dwelling->creature_counts[0];

                    c->return_address = 0x55121B;
                    return NO_EXEC_DEFAULT;
                }
            }
        }
    }

    return EXEC_DEFAULT;
}

int __stdcall skipMessages(LoHook* h, HookContext* c)
{
    if ( _P->VarGetValue("HD.UI.AdvMgr.SkipMapMsgs", 1) )
    {
        c->return_address = 0x4A1917;
        return NO_EXEC_DEFAULT;
    }

    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    static bool plugin_On = false;

    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = true;
            _P = GetPatcher();
            _PI = _P->CreateInstance((char*)"HD.Plugin.NewDwellings");
            _PI->WriteLoHook(0x4B85EE, setCreatures);
            _PI->WriteLoHook(0x5510B1, afterHiring);
            _PI->WriteHexPatch(0x4A197B, "90 90");
            _PI->WriteHexPatch(0x4AB812, "90 90");
            _PI->WriteLoHook(0x4A17BD, skipMessages);
        }
    }

    return TRUE;
}


Цитата:
А что там с AI, он будет этим пользоваться? Всмысле нанимать грейженных, вместо обычных, когда есть средства?

Будет ли он вообще расходовать золото на покупку существ в двеллингах 1-го уровня. Можете проверить.
Вернуться к началу

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

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

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

AlexSpl писал(а):

Функцию afterHiring(), вероятно, можно сделать более компактной, но я не знаю, есть ли в recruitManager указатель на объект, в котором мы нанимаем существ.

Кстати, получилось найти указатель на объект в recruitManager? Или его там нет?

AlexSpl писал(а):

Будет ли он вообще расходовать золото на покупку существ в двеллингах 1-го уровня. Можете проверить.

Надо бы, чтобы расходовал. AI, как и игрок, должны быть в равных условиях.
Вернуться к началу

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 » 24 апр 2021, 14:23

Цитата:
Кстати, получилось найти указатель на объект в recruitManager? Или его там нет?

Нужно смотреть H3API (если там есть структура recruitManager). А так, без разницы, каким способом мы находим указатель: через героя или через менеджер.

Цитата:
Надо бы, чтобы расходовал. AI, как и игрок, должны быть в равных условиях.

У нас пока нет доказательств того, что он не расходует.
Вернуться к началу

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

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

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

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 » 24 апр 2021, 14:31

Я хотел предложить то же самое Вам :smile2: Сейчас Вы генератор идей для плагинов. Посмотрите, сколько таких, со своими идеями, в ветке предложений для HotA. Их идеи так и останутся идеями, ведь не у каждого есть свой персональный AlexSpl :smile2: Я про то, что нужно хотя бы что-то делать руками. Мне интереснее подсказать, помочь, а не писать плагины с нуля под заказ.
Вернуться к началу

Пред.След.

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

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

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

cron