Объявления
Поздравляем
Roman2211


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineBlackBred  
имя: Sergey
 
Сообщения: 1
Зарегистрирован: 20 авг 2020, 18:21
Пол: Мужчина
Поблагодарили: 0 раз.

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

Сообщение BlackBred » 20 авг 2020, 18:47

Добрый день!
Подскажите, пожалуйста, возможно существует какой-то проект плагина или набор проектов, которые можно было бы использовать в качестве экзамплов? Интересует проект под Microsoft Visual Studio.

Извиняюсь если эта информация уже есть в этой теме, а я ее просто не заметил. Никогда не занимался моддингом, но очень хотелось бы разобраться в том как можно модифицировать homm3. Заранее спасибо за ответ!
Вернуться к началу

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

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

Сообщение as239 » 22 авг 2020, 05:51

А как правильно добавить генератор объекта?
В 0x539000 он не добавляется, хотя сам объект и его свойства есть.
Пробую так:
Код: Выделить всё
RMG_ObjectGenerator ogFactory;
   ogFactory.vTable = (h3func*)0x640B74;
   ogFactory.type = 20;
   ogFactory.subtype = 1;
   ogFactory.value = 3000;
   H3Vector<RMG_ObjectGenerator*> *genobjects = &rmg->objectGenerators;
   THISCALL_4(int, 0x5FE2D0, &genobjects, &genobjects + 8, 1u, &ogFactory);
Вернуться к началу

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

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

Сообщение RoseKavalier » 23 авг 2020, 17:11

BlackBred писал(а):

Добрый день!
Подскажите, пожалуйста, возможно существует какой-то проект плагина или набор проектов, которые можно было бы использовать в качестве экзамплов? Интересует проект под Microsoft Visual Studio.

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

https://handbookhmm.ru/forum/viewtopic.php?f=56&t=529

as239 писал(а):

А как можно понять что игрок нажал "Tab" и пишет сообщение?
А то если он это делает в городе и вводит символ "e", то открывается окно обмена между героями.

Код: Выделить всё
struct H3ScreenlogEdit : H3DlgEdit
{
    BOOL8 enteringText; // +70
};

Код: Выделить всё
auto edit = P_TownMgr()->dlg.Get<H3ScreenlogEdit>(7001); // only done by hdmod
if (!edit || !edit->enteringText)
{....}


Pay attention to the type of objectGenerators and I suggest simply using the built-in H3Vector member functions.

At some point I will write constructors for RMG object generators - I haven't had the time and it isn't high on the list of priority - so you can write something like:
Код: Выделить всё
rmg->objectGenerators.Add(new RMG_ObjectGenerator(20, 1, 3000));

or

rmg->AddObjectGenerator(20, 1, 3000);
Вернуться к началу

offlineigrik  
Подмастерье
Подмастерье
 
Сообщения: 108
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 84 раз.

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

Сообщение igrik » 26 авг 2020, 05:26

as239 писал(а):

А как можно понять что игрок нажал "Tab" и пишет сообщение?
А то если он это делает в городе и вводит символ "e", то открывается окно обмена между героями.

Я не знаю как это работает, но я решал эту проблему простой проверкой if( true ):
https://github.com/igrikRS/HoMM3-Plugins/blob/master/wog%20native%20dialogs/wog%20native%20dialogs/src/TownHeroesMeet.cpp#L15

Для полноты картины обозначу, что я пробовал решать через проверку активности чата, но я всегда ловил вылеты, если чат активен (хотя я уверен, что код был на 1000% правильный.)


Ben80 писал(а):

Автор: Ben80
Название: ViewMagicGuild

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

Ben80, у тебя достаточно не удобная реализация. Герой гость не может зайти в гильдию, а верхний герой не может купить книгу, даже запроса на это нет.
Вот намного более изящное решение
Код: Выделить всё
// возможность заходить в гильдию магов без наличия книги и денег
_PI->WriteHexPatch(0x5CEA83, "EB74");
_PI->WriteHexPatch(0x5CEACD, "2800");
Вернуться к началу

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

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

Сообщение RoseKavalier » 26 авг 2020, 12:58

igrik писал(а):

as239 писал(а):

А как можно понять что игрок нажал "Tab" и пишет сообщение?
А то если он это делает в городе и вводит символ "e", то открывается окно обмена между героями.

Я не знаю как это работает, но я решал эту проблему простой проверкой if( true ):
https://github.com/igrikRS/HoMM3-Plugins/blob/master/wog%20native%20dialogs/wog%20native%20dialogs/src/TownHeroesMeet.cpp#L15

Для полноты картины обозначу, что я пробовал решать через проверку активности чата, но я всегда ловил вылеты, если чат активен (хотя я уверен, что код был на 1000% правильный.)


if (true) is completely discarded by the compiler... i.e. it does nothing at all.
I'm not doubting that it somehow managed to work but I'd attribute that to random luck and note that can break at any time, leaving you wondering months later why it doesn't work anymore.
Game code checks offset 0x70 of H3ScreenlogEdit before assigning text to chat edit, and so should plugins.

What does this do?
Код: Выделить всё
hdv(_bool_, "HotA.SwapMgrCalledFromTown") = 1;
Вернуться к началу

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 » 26 авг 2020, 14:32

Чтобы понять, в чём причина изменения поведения плагина после вставки if ( true ), нужно сравнить выходные бинарные файлы. А вообще, это, конечно, странно...
Вернуться к началу

offlineigrik  
Подмастерье
Подмастерье
 
Сообщения: 108
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 84 раз.

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

Сообщение igrik » 27 авг 2020, 05:53

RoseKavalier писал(а):

What does this do?
Код: Выделить всё
hdv(_bool_, "HotA.SwapMgrCalledFromTown") = 1;

При вызове диалога обмена героев, HD мод проверяет данный твик, и если он true, то HD мод блокирует вот эти кнопки
Изображение
Вернуться к началу

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

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

Сообщение Ben80 » 08 сен 2020, 13:36

igrik писал(а):

Ben80, у тебя достаточно не удобная реализация. Герой гость не может зайти в гильдию, а верхний герой не может купить книгу, даже запроса на это нет.
Вот намного более изящное решение
Код: Выделить всё
// возможность заходить в гильдию магов без наличия книги и денег
_PI->WriteHexPatch(0x5CEA83, "EB74");
_PI->WriteHexPatch(0x5CEACD, "2800");


igrik, извиняюсь, но ты пишешь какой-то абсурд. При подключении плагина ViewMagicGuild все работает точно также, как в оригинале, за исключением одного момента - верхнему герою не предлагают купить книгу, идет сразу заход в гильдию.
Твое решение я видел до того, как написал плагин - не только не могу назвать его "изящным", а сказал бы что оно вообще никак не решает проблему - поскольку деньги то обычно у игрока есть (следовательно, код плагина не сработает), да вот расходовать их на книгу не всегда хочется (по крайней мере не в данный момент и не для данного героя).
Вернуться к началу

offlineigrik  
Подмастерье
Подмастерье
 
Сообщения: 108
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 84 раз.

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

Сообщение igrik » 10 сен 2020, 07:44

Ben80 писал(а):

igrik писал(а):

igrik, извиняюсь, но ты пишешь какой-то абсурд. При подключении плагина ViewMagicGuild все работает точно также, как в оригинале, за исключением одного момента - верхнему герою не предлагают купить книгу, идет сразу заход в гильдию.

Не знаю, где ты увидел тут абсурд.

Я вижу 3 проблемы твоего плагина:

А. Гарнизонный герой
1) герой без книги НЕ может купить книгу, если ему это требуется (перемещение героя вниз не считается!)

Б. Герой гость
2) Игрок с героем без книги НЕ может увидеть заклинания в гильдии магов, если он не хочет покупать книгу.
3) Игрок с героем без книги НЕ может увидеть заклинания в гильдии магов, если он НЕ может купить книгу.

Ben80 писал(а):

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

Так в том то и дело!
Ситуация "А": деньги есть, книги нет:
- покупаем книгу -> заходим в гильдию
- отказываемся от покупки книги -> заходим в гильдию

Ситуация "Б": денег нет, книги нет:
- получаем сообщение, что денег на книгу нет -> и заходим в гильдию

ИТОГ: Мы всегда и при любых раскладах можем зайти в гильдию магов и увидеть в ней заклинания гильдии.

Вот где ты тут увидел, что "оно вообще никак не решает проблему"?
Вернуться к началу

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

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

Сообщение Ben80 » 10 сен 2020, 08:09

igrik писал(а):

А. Гарнизонный герой
1) герой без книги НЕ может купить книгу, если ему это требуется (перемещение героя вниз не считается!)


Считается :smile1:
Это совсем нетрудно.

igrik писал(а):

Б. Герой гость
2) Игрок с героем без книги НЕ может увидеть заклинания в гильдии магов, если он не хочет покупать книгу.
3) Игрок с героем без книги НЕ может увидеть заклинания в гильдии магов, если он НЕ может купить книгу.


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

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

igrik писал(а):

- отказываемся от покупки книги -> заходим в гильдию


А, ну это совсем другое дело. В оригинале же так нельзя сделать, к сожалению.
Просто из комментариев на гитхабе к твоему коду я это не просек.
Тогда да, соглашусь, что твой вариант лучше. Но слово "изящнее" насмешило. Не балетом, чай, занимаемся :smile1:
Вернуться к началу

Пред.След.

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

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

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