Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 15 фев 2019, 12:18

Начать можно отсюда:

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

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

int __stdcall shiftBlocks(HiHook* h, _AdvMgr_* advManager, int a2)
{
    _GameMap_* Map = &o_GameMgr->Map;
    _MapItem_* MapItem;

    int Count = 0;
   
    for (int z = 0; z <= Map->has_underground; ++z)
    {
        for (int y = 0; y < o_MapHeight; ++y)
        {
            for (int x = 0; x < o_MapWidth; ++x)
            {
                MapItem = Map->GetItem(x, y, z);
               
                if ( MapItem->GetReal__object_type() == 54 ) ++Count;
            }
        }
    }

    sprintf(o_TextBuffer, "Monsters: %d", Count);
    b_MsgBox(o_TextBuffer, 1);
   
    return CALL_2(int, __thiscall, h->GetDefaultFunc(), advManager, a2);
}

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("HD.Plugin.ShiftBlocks");

            _PI->WriteHiHook(0x406F60, SPLICE_, EXTENDED_, THISCALL_, shiftBlocks);
        }
    }

    return TRUE;
}

Плагин просто показывает кол-во нейтральных отрядов на карте во время её загрузки. На этом этапе можно проверять, блокирует ли монстр дорогу, и если да, сдвигать его. В структуре _MapItem_ есть поле road, с помощью которого можно определить, есть ли на тайле дорога, а также object_type, u3, os_type, но нужно разбираться, какие из этих полей следует скопировать, чтобы переместить монстра. Нужно сравнивать структуру "пустой" клетки и клетки, на которой стоит монстр.

UPD: Ещё и с отрисовкой монстра придётся повозиться. Просто скопировать os_type недостаточно. Да, объект ведёт себя, как монстр, но не выглядит, как монстр :smile1: Похоже, тут дело в полях draw. Я пытался скопировать и их, но, по всей видимости, нужно менять значения draw и для соседних клеток, иначе, например, если скопировать поля draw копейщика в тайл, на котором стоит крестьянин, у последнего только тело копейщика получается, а голова остаётся крестьянская :smile1: Короче, главная проблема будет в корректной отрисовке перемещённого монстра.

Хочется надеяться, что где-то в коде игра сама заполняет эти поля. Тогда было бы намного проще. Т.е., например, стоит на тайле карты монстр (координаты и ID), а уже сама игра при загрузке карты корректно заполняет соседние _MapItem_'ы. Скорее всего, так и есть, иначе бы как игра отрисовывала рандомные шарики монстров (шарики в анимированных монстров на карте)? Нужно искать место, где инициализируется 3-х мерный массив тайлов и уже там пытаться сдвигать монстров. Какая-то функция должна отвечать за конверсию _EditorMapItem_ (?) в _MapItem_. Даже если взять RMG. Я думаю, он не заморачивается с отрисовкой: просто ставит монстра на конкретную клетку, а корретно заполнить _MapItem_'ы - задача, которую выполняет другой алгоритм.

Нужно ставить брейкпоинты на запись в поля draw _MapItem_. Я чувствую, что изобретаю велосипед. Но кто же поделится инфой? :smile2:

* * *
Ещё одна идея пришла: есть же функция, которая корректно убирает монстра с карты, а если та, которая корректно рисует?
Последний раз редактировалось AlexSpl 15 фев 2019, 16:16, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение as239 » 15 фев 2019, 16:15

Цитата:
Начать можно отсюда:

У меня даже в первый цикл не заходит.

Цитата:
например, если скопировать поля draw копейщика в тайл, на котором стоит крестьянин

А если в пустой тайл копировать, то тоже некорректно отображается?

Цитата:
у последнего только тело копейщика получается, а голова остаётся крестьянская

Вот это номер :)
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 15 фев 2019, 16:17

Цитата:
У меня даже в первый цикл не заходит.

В смысле в окошке 0 всегда?

Цитата:
Вот это номер :)

Если все поля draw соседних тайлов заполнить, то всё норм, но должна быть функция, которая это делает. Как я писал выше, есть же функция, которая убирает нейтралов с карты корректно после победы над ними. По идее, должна быть и такая, которая их корректно рисует.
Последний раз редактировалось AlexSpl 15 фев 2019, 16:21, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение as239 » 15 фев 2019, 16:18

AlexSpl писал(а):

Цитата:
У меня даже в первый цикл не заходит.

В смысле в окошке 0 всегда?


Да, вставлял инкремент сразу после первого цикла, тоже 0.
Пробовал как с подземельем так и без.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 15 фев 2019, 16:24

Интересно. Вот dll'ка:

ShiftBlocks.zip
(5.36 КБ) Скачиваний: 200


* * *
Попробуйте ещё заменить Map->has_underground на 0 и потестируйте на карте без подземелья.
Вернуться к началу

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

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

Сообщение as239 » 15 фев 2019, 16:36

AlexSpl писал(а):

Интересно. Вот dll'ка:

ShiftBlocks.zip


* * *
Попробуйте ещё заменить Map->has_underground на 0 и потестируйте на карте без подземелья.


С вашей dll вообще нет сообщения.
С 0 в цикле и без подземелья вылет:

Изображение

ИЗМ: Падает на этой строке:
MapItem->GetReal__object_type()
Последний раз редактировалось as239 15 фев 2019, 16:45, всего редактировалось 2 раз(а).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 15 фев 2019, 16:43

Прикольно. DLL - это уже собранный код. Должна работать всегда. Может, конфликт с другими плагинами? Оставьте только этот плагин и попробуйте. Просто реально странно, что бинарный код как-то по-другому может выполняться на другой машине.
Вернуться к началу

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

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

Сообщение as239 » 15 фев 2019, 16:45

AlexSpl писал(а):

Прикольно. DLL - это уже собранный код. Должна работать всегда. Может, конфликт с другими плагинами? Оставьте только этот плагин и попробуйте. Просто реально странно, что бинарный код как-то по-другому может выполняться на другой машине.


Пробовал без всех плагинов.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 15 фев 2019, 16:48

Ну, тут я уже не знаю, в чём причина :smile5: Это всё равно как если бы Windows на одних компах работала, а на других нет.
Вернуться к началу

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

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

Сообщение as239 » 15 фев 2019, 16:49

AlexSpl писал(а):

Ну, тут я уже не знаю, в чём причина :smile5: Это всё равно как если бы Windows на одних компах работала, а на других нет.


Видимо опять какие-то заморочки виртуалки, сейчас попробую на ноуте с Windows 10.

ИЗМ:
Там все тоже самое:
Ваша dll также молчит.
И на строке вылет:
MapItem->GetReal__object_type()
Последний раз редактировалось as239 15 фев 2019, 16:57, всего редактировалось 2 раз(а).
Вернуться к началу

Пред.След.

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

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

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