Объявления

Друзья, если не получается зарегистрироваться, напишите на почту 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 » 15 окт 2020, 10:05

Патч на Удачу/Неудачу нейтралов писался чуть позже, поэтому разные адреса получились. А так да, склеить патч и хук хорошая идея с технической точки зрения.

stack->luck, stack->isLucky, stack->PlayMagicAnimation(); и т.п. мы не можем писать, т.к. для этого потребуется изменённая библиотека homm3.h, которой нет в первом сообщении. А ещё лучше перейти на H3API от RoseKavalier.
Вернуться к началу

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 » 15 окт 2020, 13:37

Альтернативный способ подсчёта эффекта Неудачи (работает аналогично Удаче, т.е. не трогает Jousting Bonus):

Код: Выделить всё
int __stdcall ApplyLuckBonuses(LoHook* h, HookContext* c)
{
    int BonusDamage = *(int*)(c->ebp - 0x10);
    int BasicDamage = *(int*)(c->ebp + 8);
    int LuckFlag = *(int*)(c->ebx + 0x70);

    switch ( LuckFlag ) {
        case -1: BonusDamage -= BasicDamage / 2; break;
        case 1:  BonusDamage += BasicDamage; break;
    }
   
    *(int*)(c->ebp - 0x10) = BonusDamage;

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

...

// Закомментировать HiHook из предыдущего примера перед использованием
_PI->WriteLoHook(0x4430A3, ApplyLuckBonuses);
Последний раз редактировалось AlexSpl 15 окт 2020, 13:53, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение Rolex » 15 окт 2020, 13:52

igrik писал(а):

Rolex , просмотрите плагин/мод adfontes. В нём половина вашей работы уже сделана.

Спасибо. Видел когда-то этот мод. Видите ли там уж слишком много изменений:
Цитата:
Была усилена куча различных навыков, заклинаний и существ - этот пункт настолько масштабен, что очень трудно будет описать его всего парой строк

Существ, по-моему, лучше вообще не трогать. А с некоторыми навыками и заклами тоже очень спорно. И если тебя что-то не устраивает, то приходится с этим мирится, ибо изменить это без правки исходников нет возможности.
Именно поэтому мне больше по душе чистый SoD/Complete с некоторыми подключаемыми плагинами. Это очень удобно. Сам решаешь, какие изменения/исправления/дополнения тебе нужны и подключаешь необходимый плагин.
В этом плане мне нравится SOD_SP от RoseKavalier. Любое исправление/дополнение можно быстро отключить и настроить все под себя через менюшку самого плагина.

Кстати, по-моему, вроде как вы помогали RoseKavalier в переводе SOD_SP на русский язык. Я писал ранее, там в SOD_SP есть ошибка в русском переводе. Было бы неплохо исправить это в новой версии плагина.

Цитата:
При отображении возможного количества убитых существ при показе возможного урона пишет:
(убьет X из Y).
Что соответствует (kills X out of Y). Хотя убивает обычно больше X. Проблема в самом переводе на русский. В английской версии все верно (kills X to Y). Правильней было бы выводить:
(убьет от X до Y)
А еще лучше, как в HotA:
(убьет: X-Y)


* * *
Еще есть несколько мелких хотелок, которые бы хотелось сделать.
1. Можно ли сделать окно просмотра героя на пользовательских картах таким же, как и на рандомных?
 скрин
Изображение

2. Есть плагин, где ПКМ по монстрам на карте дает расширенную информацию о них. Вроде, код igrika, хотя не уверен. Он же встроен в Ad Fontes.
 скрин
Изображение

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS

#include "stdafx.h"
#include "patcher_x86.hpp"
#include "homm3.h"

Patcher* _P;
PatcherInstance* _PI;

static _bool_ plugin_On = 0;

_bool_ isRusLng;

int __stdcall Y_LoadAllTXTinGames(LoHook* h, HookContext* c)
{
   if (o_CreatureInfo[0].name_single[0] != 'P') {
      isRusLng = 1;
   }
   else {
      isRusLng = 0;
   }
   return EXEC_DEFAULT;
}

int c_neu_rmb_id;

int __stdcall c_get_neu_rmb(LoHook* h, HookContext* c)
{
   c_neu_rmb_id = c->esi;

   return EXEC_DEFAULT;
}

int __stdcall c_neu_rmb_public(LoHook* h, HookContext* c)
{
   int c_neu_lv = o_pCreatureInfo[c_neu_rmb_id].level + 1;
   int c_neu_at = o_pCreatureInfo[c_neu_rmb_id].attack;
   int c_neu_df = o_pCreatureInfo[c_neu_rmb_id].defence;
   int c_neu_sp = o_pCreatureInfo[c_neu_rmb_id].speed;
   int c_neu_hp = o_pCreatureInfo[c_neu_rmb_id].hit_points;
   int c_neu_d1 = o_pCreatureInfo[c_neu_rmb_id].damage_min;
   int c_neu_d2 = o_pCreatureInfo[c_neu_rmb_id].damage_max;
   char* c_neu_ds = o_pCreatureInfo[c_neu_rmb_id].specification_description;

   if (isRusLng == 1)
   {
      sprintf(o_TextBuffer, "%s\n\nУровень: {%d}, Атака: {%d}, Защита: {%d},\nЗдоровье: {%d}, Урон: {%d}-{%d}, Скорость: {%d}.\n\n\n%s", o_TextBuffer, c_neu_lv, c_neu_at, c_neu_df, c_neu_hp, c_neu_d1, c_neu_d2, c_neu_sp, c_neu_ds);
   }
   else
   {
      sprintf(o_TextBuffer, "%s\n\nLevel: {%d}, Attack: {%d}, Defense: {%d},\nHealth: {%d}, Damage: {%d}-{%d}, Speed: {%d}.\n\n\n%s", o_TextBuffer, c_neu_lv, c_neu_at, c_neu_df, c_neu_hp, c_neu_d1, c_neu_d2, c_neu_sp, c_neu_ds);
   }
   return 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("HD.Plugin.AIValue");

// check language after loading all txt files
_PI->WriteLoHook(0x4EDFFD, Y_LoadAllTXTinGames);

// advanced rmb on neutrals
_PI->WriteLoHook(0x52FFEC, c_get_neu_rmb);
_PI->WriteLoHook(0x530020, c_neu_rmb_public);
_PI->WriteByte(0x530026, 120); // public y size
_PI->WriteByte(0x53002D, 100); // public y pos
_PI->WriteByte(0x530170, 217); // private y pos

      }
   }

   return TRUE;
}

Так вот, если использовать ужатый шрифт, который использует Ad Fontes, то вроде норм. А вот если взять шрифт из Хота, который более читабелен, но менее вместительный, то уже под описание всего 2 строки и все печально.
Можно ли под описание абилки в это окно добавить еще пару строк, например. Если да, то как?

3. При посещении банков существ выводить информацию об их охране (именно в момент посещения и вывода окна Хотите сразится...).
 скрины
Изображение
Изображение

4. Показ доступных для найма существ в внешних жилищах и Лагерях беженцев (по клику правой кнопкой мыши)
 скрины
Изображение
Изображение

5. Инфо о стоимости улучшения существ (по клику правой кнопкой мыши или при наведении на кнопку апгрейда).
 скрины
Изображение
Изображение
Последний раз редактировалось Rolex 17 окт 2020, 15:08, всего редактировалось 3 раз(а).
Вернуться к началу

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 » 15 окт 2020, 15:59

Цитата:
1. Можно ли сделать окно просмотра героя на пользовательских картах таким же, как и на рандомных?

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

Понял :smile1: При старте карты. Тогда можно. Может, это сделано из-за того, что нужно исключать тех героев, параметры которых изменены автором карты?
Вернуться к началу

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

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

Сообщение Rolex » 15 окт 2020, 16:09

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

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

Может, это сделано из-за того, что нужно исключать тех героев, параметры которых изменены автором карты?

Хз, может быть. Если так, то для таких героев можно выводить старое окно (сравнивая параметры каждого героя по выбранной карте с дефолтными), а для остальных - новое. Или же еще упростить и проверять изменялись ли на выбранной карте хоть какие-то параметры по каким-либо героями, и если да, то выводить старое окно на этой карте, иначе, если ничего не менялось - новое. Конечно, я не знаю всех нюансов. Поэтому, если это действительно сложно и много кодить, то тогда не стоит и браться.
Последний раз редактировалось Rolex 16 окт 2020, 06:22, всего редактировалось 4 раз(а).
Вернуться к началу

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

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

Сообщение igrik » 15 окт 2020, 19:52

AlexSpl писал(а):

Понял :smile1: При старте карты. Тогда можно. Может, это сделано из-за того, что нужно исключать тех героев, параметры которых изменены автором карты?

Именно. Слишком сложный код будет по отслеживанию настроенных героев в редакторе карт. Тут игра не стоит свеч. Поэтому данный функционал был убран из НЕслучайных карт.
Вернуться к началу

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

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

Сообщение igrik » 15 окт 2020, 19:54

Rolex писал(а):

Кстати, по-моему, вроде как вы помогали RoseKavalier в переводе SOD_SP на русский язык. Я писал ранее, там в SOD_SP есть ошибка в русском переводе. Было бы неплохо исправить это в новой версии плагина.

Цитата:
При отображении возможного количества убитых существ при показе возможного урона пишет:
(убьет X из Y).
Что соответствует (kills X out of Y). Хотя убивает обычно больше X. Проблема в самом переводе на русский. В английской версии все верно (kills X to Y). Правильней было бы выводить:
(убьет от X до Y)
А еще лучше, как в HotA:
(убьет: X-Y)

Спасибо. Я исправлю и перенаправлю изменения RoseKavalier.
Вернуться к началу

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 » 16 окт 2020, 09:22

Цитата:
Можно ли под описание абилки в это окно добавить еще пару строк, например. Если да, то как?

Попробуйте увеличить вертикальный размер текстового поля, отведённого под описание:

Код: Выделить всё
_PI->WriteByte(0x530026, 120); // public y size
Вернуться к началу

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

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

Сообщение Rolex » 16 окт 2020, 10:26

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 » 16 окт 2020, 11:17

Да, действительно исчезает, так как там размер char (от -128 до 127), и размеры, немного больше 127, считаются отрицательными. +7 пикселей Вам, конечно, мало помогут :smile2:

Однако хорошая новость в том, что сама функция принимает размеры int, поэтому это текстовое поле всё-таки можно увеличить сверх 127 пикселей по вертикали.
Вернуться к началу

Пред.След.

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

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

Сейчас этот форум просматривают: Yandex [bot] и гости: 1