Объявления

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

Дроби (тип float) удобней, кстати, менять так (пример из кода плагина, меняющего Eagle Eye):

Код: Выделить всё
// Меняем коэффициенты
float eagleEyeCoefs[] = {0.00f, 0.30f, 0.35f, 0.40f};

_PI->WriteDword(0x63EA2C, (int&)eagleEyeCoefs[1]);
_PI->WriteDword(0x63EA30, (int&)eagleEyeCoefs[2]);
_PI->WriteDword(0x63EA34, (int&)eagleEyeCoefs[3]);

Т.е. сразу можно писать понятное всем число :smile1:
Вернуться к началу

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

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

Сообщение Rolex » 04 окт 2020, 17:41

AlexSpl писал(а):

Цитата:
Возникло еще пару вопросов:
1. А есть ли вообще смысл менять значение навыка на уровне None? Вроде как заклинания мы можем использовать на уровне None, там обычно они равны Basic. А навыки вроде же сразу идут с Basic.
2. А возможно ли как-то прямо из кода плагина также исправить описание (без правки текстовиков в TXTEdit). То есть изменить дефолтные описания на те значения, которые устанавливает плагин.

1. Скорее всего, нет. Сделано для универсальности. Но утверждать не могу.
2. Посмотрите тему с готовыми плагинами. Там как раз есть код, меняющий описания из плагина.

Спасибо. Глянул код плагина Мистицизм.

Код: Выделить всё
struct SecSkillDesc
{
   char* Name;
   char* BasicDesc;
   char* AdvancedDesc;
   char* ExpertDesc;
};

SecSkillDesc Necromancy =
{
   "{Некромантия}",
   "{Базовая Некромантия}\n\nПозволяет поднять 5% убитых в битве существ в виде скелетов.",
   "{Продвинутая Некромантия}\n\nПозволяет поднять 10% убитых в битве существ в виде скелетов.",
   "{Эксперт Некромантия}\n\nПозволяет поднять 15% убитых в битве существ в виде скелетов."
};


Со структруй и ее описанием разобрался. Но вот само изменение описания идет через LoHook. Появляються новые адреса и вот здесь уже мало что ясно. Как мне узнать эти адреса для Некромантии, например, непонятно. Плюс нужно еще узнать id Некромантии. Или может есть другой способ изменить описание, без LoHook?

Код: Выделить всё
_PI->WriteLoHook(0x4E6D77, changeMysticismDesc);

int __stdcall changeMysticismDesc(LoHook* h, HookContext* c)
{
   *(SecSkillDesc*)(*(int*)0x67DCF0 + 8 * 16) = MysticismDesc; // Mysticism has id 8 in homm3_ids
   return EXEC_DEFAULT;
}
Вернуться к началу

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 » 04 окт 2020, 18:24

Здесь Вам нужно поменять только ID (его можно посмотреть в том же гайде, ссылкой на который я делился): 12. Адреса хуков никогда не меняйте, если, конечно, не пишете свой. 0x67DCF0 - указатель на адрес таблицы с описаниями. Его, разумеется, тоже менять не нужно. 16 - размер одной структуры с описанием навыка (4 байта на каждый указатель на строку).
Вернуться к началу

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

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

Сообщение Rolex » 04 окт 2020, 19:19

AlexSpl писал(а):

Здесь Вам нужно поменять только ID (его можно посмотреть в том же гайде, ссылкой на который я делился): 12. Адреса хуков никогда не меняйте, если, конечно, не пишете свой. 0x67DCF0 - указатель на адрес таблицы с описаниями. Его, разумеется, тоже менять не нужно. 16 - размер одной структуры с описанием навыка (4 байта на каждый указатель на строку).

Да, действительно, сравнил коды Мистицизма и Имущества, адреса одинаковы. Спасибо.
Вернуться к началу

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 » 04 окт 2020, 19:43

Цитата:
1) Навык некромантия должен поднимать 5%/10%/15% погибших после боя в виде Скелетов вместо 10%/20%/30%.
2) Амулет Гробовщика должен добавалять 2.5% к показателю некромантии вместо 5%, Сутана Вампира — 5% вместо 10%, Сапоги Мертвеца — 7.5% вместо 15%. Плащ Короля Нежити должен давать герою без некромантии 15% некромантии вместо 30%.
3) Усилитель Некромантии должен добавалять 5% некромантии всем героям вместо 10%.
4) Прирост Огненных Птиц и Фениксов нужно снизить до 1 (2 после постройки Замка).

На эти вопросы Вы, я думаю, найдёте ответы в гайде. Первый уже решён. Остальные решаются так же: через WriteDword/WriteHexPatch.

Решение 9-го кто-то публиковал на форуме HeroesCommunity, если BTB не включил его в гайд. Остальные требуют дополнительного исследования кода. Патчем, изменяющим кап Морали/Удачи, я где-то на HC делился. Возможно, в теме "How to edit HotA", но не уверен. Плюс искать нужно. Мне, как и Вам, копаться в старых темах не очень охота. Кое-что исправлено в SoD_SP (посмотрите исходники). Ben80 исходниками плагинов, исправляющих баги, тоже делился.

Отображение урона в том формате, в котором Вы хотите, тоже простая задача. Простая в реализации, но много кода. Я знаю, что это такое :smile1: В LMOracle для Героев 1 идёт просчёт урона для всех возможных ситуаций: атака/ответка, мораль/удача, абилки существ... И это *очень* много кода. Казалось бы, что такого в том, чтобы просто посчитать прямой урон и урон ответкой. Когда я начал писать код, я понял, как сильно я заблуждался :smile1: Так это Герои 1..

* * *
В Героях 3 точный урон будет "плавать". Если точный не нужен, то, конечно, всё упрощается. Но всё равно придётся прошерстить Физмиг: столько же абилок у существ... Я до сих пор не знаю всех правил, когда юнит отвечает, а когда нет :smile14:

Самая сложная ситуация - это двойная рукопашная атака. В Героях 3 нужно просчитать диапазон прямого урона, диапазон потерь атакуемого стека, диапазон ответного урона, если он будет; не умрёт ли атакующий стек от ответки и сможет ли ответить (из-за того, что будет некому уже отвечать, или из-за абилки), и - наконец - диапазон урона при второй атаке. Затем просуммировать эти два диапазона уронов :smile2:

Например, попробуйте просчитать полный урон стека Крестоносцев, атакующих Ифритов или Могучих Горгон (ого, я реально не помню, работает ли их абилка на ответке). Тут, кстати, не будет рандома. В цикле атака-ответка рандом фиксированный.

Понятно, что так сильно загоняться не стоит. Но если уж писать подобный алгоритм, то стоит учесть, что знание диапазона прямого урона - это не всё, что нужно для решения "уравнения" в случае двойной рукопашной атаки. Всё-таки придётся знать точный (точнее - значение ГПСЧ на момент атаки), потому что он определит весь дальнейший ход событий. Можно пойти другим путём: перебрать все возможные варианты и просуммировать диапазоны уронов, но такая подсказка мало Вам поможет, потому что диапазон получится больше, чем Вы ожидаете. Конкретно: от минимального урона до двойного максимального. Так себе информация :smile12:
Вернуться к началу

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

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

Сообщение Rolex » 05 окт 2020, 18:52

AlexSpl писал(а):

Остальные решаются так же: через WriteDword/WriteHexPatch.

Вроде как и также, но не совсем.

Процент нужно 2.5% и 7.5%, а этого нет в гайде. Только
Undertaker's Amulet 23EAE4 (CD CC 4C 3D, or 5%)
Vampire's Cowl 23B8D0 (CD CC CC 3D, or 10%)
Dead Man's Boots 23EB28 (9A 99 19 3E, or 15%)

Нашел близкие. А как вообще узнать нужный процент, если там нужно 17,5%, например?
03% - 8F C2 F5 3C
07% - 29 5C 8F 3D

Взялся для начала за Сутану вампира, там есть нужный процент (5%). Но так и не работает, и описание также не меняется.

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

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

Patcher* _P;
PatcherInstance* _PI;

static _bool_ plugin_On = 0;

struct SecArtDesc
{
   char* Name;
   char* Desc;
};

SecArtDesc NecromancyArtDesc =
{
   "{Сутана Вампира}",
   "{Сутана Вампира}\n\nДобавляет к показателю навыка Некромантия 5%."
};

int __stdcall NecromancyArtChangeDesc(LoHook* h, HookContext* c)
{
   *(SecArtDesc*)(*(int*)0x67DCF0 + 55 * 92) = NecromancyArtDesc;
   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.NecromancyArtChange");
         _PI->WriteDword(0x63E834, 0x3D4CCCCD);
         _PI->WriteLoHook(0x4E6D77, NecromancyArtChangeDesc);
      }
   }

   return TRUE;
}


AlexSpl писал(а):

0x67DCF0 - указатель на адрес таблицы с описаниями.

Как я понимаю, это указатель на адрес таблицы с описаниями ИМЕННО ВТОРИЧНЫХ НАВЫКОВ. Ибо айдишки в гайде перескаються. То есть для артефактов это другая таблица и, следовательно, должен быть другой адрес, как я понимаю. Но вот проблема, этих адресов в гайде, вроде как, нет, а в готовых плагинах нет ни одного, который бы модифицировал арт и вот как узнать мне этот адрес, непонятно. Думаю, именно поэтому не меняется описание. Хотя может еще что-то не так. Ну вроде айди в Hex 37, в десятичной 55. Размер одной структуры с описанием арта должен быть 4 на кол-во столбцов в Artraits.txt, как я понимаю (4 * 23 = 92).

23E834 Vampire's Cowl
0x23E834 + 0x400000 = 0x63E834

"CD CC 4C 3D" => 0x3D4CCCCD

Что-то не так.
У меня почему-то Сила магии и Знания меняються вместо показателя навыка Некромантии.
Вернуться к началу

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

Цитата:
А как вообще узнать нужный процент, если там нужно 17,5%, например?

Цитата:
Конвертер дробей в Hex здесь. Запись 0x98ABCDEF - это строка "парами наоборот": EF CD AB 98.


Цитата:
Как я понимаю, это указатель на адрес таблицы с описаниями ИМЕННО ВТОРИЧНЫХ НАВЫКОВ.

Именно так. Для артефактов нужно искать указатель на таблицу с описаниями. Гляну попозже, если никто не подскажет.

Цитата:
У меня почему-то Сила магии и Знания меняються вместо показателя навыка Некромантии.

Это потому что
Цитата:
The primary attribute bonuses are stored in a table starting at 23E758, with
4 bytes per artifact - 1 each for Attack, Defense, Spell Power, and Knowledge, respectively.

Бонусы к Некромантии могут быть прописаны прямо в коде, но, опять же, нужно смотреть код.

* * *
Amulet of the Undertaker - 0x63EAE4 (0.05 по умолчанию)
Vampire's Cowl - 0x63B8D0 (0.10 по умолчанию)
Dead Man's Boots - 0x63EB28 (0.15 по умолчанию)

Однако нельзя менять эти значения с помощью WriteDword напрямую, потому что они используются и в других местах кода для самых разных целей. Правильно будет изменить эти конкретные значения на значения Ваших переменных, подставляя их в качестве аргумента в инструкции по адресам: 0x4E3FE5, 0x4E402B и 0x4E4072 соответственно. Можно использовать, конечно, и хуки, но это будет слишком накладно в данной ситуации.

* * *
Попробуйте такой код для артефактов на Некромантию:
Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include "patcher_x86.hpp"

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

float Amulet_of_the_Undertaker_Bonus = 0.05f;
float Vampires_Cowl_Bonus = 0.10f;
float Dead_Mans_Boots_Bonus = 0.15f;


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.TestNecroArts");

            _PI->WriteDword(0x4E3FE5 + 2, (int)&Amulet_of_the_Undertaker_Bonus);
            _PI->WriteDword(0x4E402B + 2, (int)&Vampires_Cowl_Bonus);
            _PI->WriteDword(0x4E4072 + 2, (int)&Dead_Mans_Boots_Bonus);
        }
    }

    return TRUE;
}
Последний раз редактировалось AlexSpl 06 окт 2020, 16:31, всего редактировалось 4 раз(а).
Вернуться к началу

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

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

Сообщение Rolex » 06 окт 2020, 16:19

AlexSpl писал(а):

Правильно будет изменить эти конкретные значения на значения Ваших переменных, подставляя их в качестве аргумента в инструкции по адресам: 0x4E3FE5, 0x4E402B и 0x4E4072 соответственно.

Спасибо за ответ. А можно один пример, с функцией и ее вызовом.

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

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

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

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

Сообщение Rolex » 06 окт 2020, 16:50

AlexSpl писал(а):

Выше решение без хуков.

Спасибо. Только бонусы у вас дефолтные. Указал нужные и все работает.

Код: Выделить всё
float Amulet_of_the_Undertaker_Bonus = 0.025f;
float Vampires_Cowl_Bonus = 0.05f;
float Dead_Mans_Boots_Bonus = 0.075f;


AlexSpl писал(а):

Именно так. Для артефактов нужно искать указатель на таблицу с описаниями. Гляну попозже, если никто не подскажет.

Осталось найти адрес с таблицей описания артефактов.

AlexSpl писал(а):

Плащ Короля Нежити должен давать герою без некромантии 15% некромантии вместо 30%.

А для сборного арта, все аналогично или есть нюансы?
Вернуться к началу

Пред.След.

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

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

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