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


Друзья, если не получается зарегистрироваться, напишите на почту 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 сен 2017, 20:50

Нашёл. Вот эта функция в цикле пишет выученные с помощью Eagle Eye заклинания:

Код: Выделить всё
.text:00469C26 call    sub_4D95A0


Чуть выше условный переход, который необходимо заменить на безусловный:

Код: Выделить всё
.text:00469C23 jg      short loc_469C2B


Итого, весь патч, убирающий эффект Eagle Eye в конце боя:

Код: Выделить всё
// меняем условные переходы на безусловные
_PI->WriteHexPatch(0x469C23, "EB");
_PI->WriteHexPatch(0x476996, "E9 DD 01 00 00");


Патчи выше на 100% безопасны: первый безусловный переход (вместо условного) означает, что заклинание герой не выучил, потому что не повезло (ему никогда не повезёт), второй просто убирает диалог(и). Кстати, второй патч может быть избыточным. Нужно тестить.

* * *
Потестил. Работает. Оба патча нужны.
Последний раз редактировалось AlexSpl 09 сен 2017, 16:23, всего редактировалось 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 сен 2017, 21:30

Цитата:
Магия воздуха не нужна. Она влияет только на диапазон коэффициентов, который доступен в диалоге.

Дело в том, что float в int запихнуть можно (оба 4 байта), но больше туда ничего не влезет. Поэтому хранить там нужно только небольшие целые числа. Уровень Магии Воздуха будет выступать селектором таблицы коэффициентов.

packed_info = Длительность (нужна, т.к. будет уменьшаться) <+> Уровень Магии Воздуха (на момент каста) <+> Положение ползунка (выбранный коэффициент в виде целого числа, т.е. индекс)

Цитата:
Есть идея переделать заклинание Маскировка - давать диалоговое окно с ползунком, примерно как при разделении отрядов. На осн уровне Воздуха шкала с 3 значениями 0.66 - 1 - 1.5, на продв. 7 значений - 0.33 - 0.5 - 0.66 - 1 - 1.5 - 2.0 - 3.0, на эксперте 9 значений 0.2 - 0.33 - 0.5 - 0.66 - 1 - 1.5 -2.0 - 3.0 - 5.0.


Код: Выделить всё
float coef = 1.00; // Для основного уровня Магии Воздуха можно придумать коэффициент поинтереснее :)
float coefBasic[] = {0.66, 1.00, 1.50};
float coefAdvanced[] =  {0.33, 0.50, 0.66, 1.00, 1.50, 2.00, 3.00};
float coefExpert[] =  {0.20, 0.33, 0.50, 0.66, 1.00, 1.50, 2.00, 3.00, 5.00};

switch ( lvlAirMagic ) {
    case 1: coef = coefBasic[nDialog]; break;
    case 2: coef = coefAdvanced[nDialog]; break;
    case 3: coef = coefExpert[nDialog]; break;
}


nDialog - выбранное с помощью ползунка значение.

При таком подходе можно не париться насчёт того, какие и сколько коэффициентов (положений ползунка) на заданном уровне Магии Воздуха. Если понадобится изменить коэффициенты или увеличить их кол-во, достаточно будет поправить массивы выше.
Вернуться к началу

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

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

Сообщение Ben80 » 09 сен 2017, 09:47

Есть небольшая проблема для плагина EagleEye -
здесь почему-то всегда 1 (а не 0 или 1)
cmAddr + 0x132C0

В принципе, есть способ проверять ID героев через структуру Player по адресу 0x69CCFC
(только в реале там почему-то не оказалось _word_ field_2)

То есть можно сравнивать ID героев с ID из
int attackerHero = *(int*)(c->ebx + 0x53CC);
int defenderHero = *(int*)(c->ebx + 0x53CC + 4);
Вернуться к началу

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

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

Сообщение Ben80 » 09 сен 2017, 11:16

Оказалось, что activePlayer - это всегда attacker, а не текущий игрок, для которого исполняется код.
Вернуться к началу

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 » 09 сен 2017, 12:48

0x132C0 - это текущая сторона в бою: 0 - атакующая (левая), 1 - обороняющаяся (правая).

Цитата:
В принципе, есть способ проверять ID героев через структуру Player по адресу 0x69CCFC

ID нашего игрока можно получить с помощью функции o_GameMgr->GetMeID();

Цитата:
То есть можно сравнивать ID героев с ID из
int attackerHero = *(int*)(c->ebx + 0x53CC);
int defenderHero = *(int*)(c->ebx + 0x53CC + 4);

Да, можно так. hero[0] - это инициатор битвы.

Цитата:
Оказалось, что activePlayer - это всегда attacker, а не текущий игрок, для которого исполняется код.

:smile5: Player - это игрок (красный, синий и т.д.).
Вернуться к началу

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

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

Сообщение Ben80 » 09 сен 2017, 12:53

У меня в заголовочных файлах GetMeID возможно только для _GameMgr_

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

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

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

Сообщение Ben80 » 09 сен 2017, 12:58

AlexSpl писал(а):

0x132C0 - это текущая сторона в бою: 0 - атакующая (левая), 1 - обороняющаяся (правая).


Это я знаю, так вот в процедуре 0x462600 по адресу 0x132C0 - всегда 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 » 09 сен 2017, 12:59

Цитата:
То есть код как бы для обоих сразу выполняется без возможности разделить его для одного игрока и для другого.

o_GameMgr->GetMeID() - это ID нашего игрока. Есть ещё поле o_ActivePlayerID (*(_int_*)0x69CCF4).

Цитата:
Это я знаю, так вот в процедуре 0x462600 по адресу 0x132C0 - всегда 1, независимо от того, влево мы или вправо.

В LMOracle для определения текущей стороны я использовал 0x132B8. А почему в 0x132C0 всегда 1, нужно уточнять.
Вернуться к началу

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

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

Сообщение Ben80 » 09 сен 2017, 13:06

Мой ID удалось получить:

int mojID = CALL_1(_int_, __thiscall, 0x4CE6E0, *(int*)0x699538);

Спасибо !
Вернуться к началу

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

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

Сообщение Ben80 » 09 сен 2017, 13:09

AlexSpl писал(а):

Есть ещё поле o_ActivePlayerID (*(_int_*)0x69CCF4).


Пробовал час назад, с activeplayer не получилось ничего (потому что активом был атакером все время, вроде так).

И вот с этой штукой не получилось
#define o_MeID *(_int_*)0x6995A4

Там кажется нолик был все время.
Вернуться к началу

Пред.След.

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

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

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