Объявления

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

Не думал, что такая, казалось бы, простая задача, окажется сложной. Дело в том, что если текущий игрок исключается из игры во время своего хода, то у следующего некому отнимать длительность Disguise (у меня хук стоит на конец хода игрока). Не знаю, есть ли такая проблема в Вашем коде, Ben80. Но для моего нужен дополнительный хук: если игрок исключается из игры во время своего хода, он должен при этом уменьшить длительность Disguise следующего игрока. Не такая большая проблема (просто обновим ссылки), но всё же стоит исправить.

Ben80. Если в Вашем коде нет такой проблемы (у Вас длительность уменьшает текущий игрок, только не понял, когда: до или после его хода), можете переделать мой код так, чтобы не был нужен дополнительный хук?
Вернуться к началу

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 » 11 окт 2017, 18:59

Фикс.

Код: Выделить всё
// Если герой исключается из игры, не забываем уменьшить длительность Disguise для следующего
_PI->WriteLoHook(0x4F1865, decDisguise);

Обновил код и ссылку здесь и на HC.

Что делает? Перед тем, как игрок исключается из игры, он уменьшает длительность Disguise для следующего, как если бы он просто завершил ход.
Вернуться к началу

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

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

Сообщение Ben80 » 11 окт 2017, 19:17

AlexSpl писал(а):

Не думал, что такая, казалось бы, простая задача, окажется сложной. Дело в том, что если текущий игрок исключается из игры во время своего хода, то у следующего некому отнимать длительность Disguise (у меня хук стоит на конец хода игрока). Не знаю, есть ли такая проблема в Вашем коде, Ben80. Но для моего нужен дополнительный хук: если игрок исключается из игры во время своего хода, он должен при этом уменьшить длительность Disguise следующего игрока. Не такая большая проблема (просто обновим ссылки), но всё же стоит исправить.

Ben80. Если в Вашем коде нет такой проблемы (у Вас длительность уменьшает текущий игрок, только не понял, когда: до или после его хода), можете переделать мой код так, чтобы не был нужен дополнительный хук?


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

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

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

Сообщение Ben80 » 11 окт 2017, 19:19

AlexSpl писал(а):

Если в Вашем коде нет такой проблемы (у Вас длительность уменьшает текущий игрок, только не понял, когда: до или после его хода), можете переделать мой код так, чтобы не был нужен дополнительный хук?


Концепции принципиально разные, либо одна, либо - другая. Поэтому я мог бы переделать Ваш код, но он стал бы на 95% похож на мой :smile1:
Вернуться к началу

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 » 11 окт 2017, 19:21

Короче, я исправил свой код. Уже не буду переделывать, но Вы обратите внимание на этот момент, когда будете делать улучшенный плагин с Visions.
Вернуться к началу

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

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

Сообщение Ben80 » 11 окт 2017, 19:23

Я тут под вечер решил поразвлечься - написал фикс для навыка Оружейник (Защита). В SoD этот навык не уменьшает, а увеличивает урон от башен. Сорри, код неформатированный. Не смог написать проверку на версию EXE - хотел вставить в хук - если Хота, то не выполнять код, если Сод - выполнять.

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

Patcher* _P;
PatcherInstance* _PI;


int __stdcall changeArrowTowerDamage(LoHook* h, HookContext* c)
{
   long double fix = CALL_2(long double, __thiscall, 0x443AB0, c->ebx, 1);
   fix = c->eax * fix * fix;
   c->eax = (int)fix;

   return EXEC_DEFAULT;
}


BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
static _bool_ plugin_On = 0;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if (!plugin_On)
{
plugin_On = 1;

_P = GetPatcher();
_PI = _P->CreateInstance("HD.Plugin.SiegeArmorerFix");

_PI->WriteLoHook(0x46594B, changeArrowTowerDamage);

}
break;

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Вернуться к началу

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

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

Сообщение Ben80 » 11 окт 2017, 19:24

AlexSpl писал(а):

Короче, я исправил свой код. Уже не буду переделывать, но Вы обратите внимание на этот момент, когда будете делать улучшенный плагин с Visions.


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

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 » 11 окт 2017, 19:25

Не доверяйте декомпилятору. Функция в Героях никак не может возвращать long double. Ориентируйтесь на то, в какой регистр процессора/сопроцессора/ячейку памяти попадает результат.
Вернуться к началу

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

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

Сообщение Ben80 » 11 окт 2017, 19:28

В STx ячейки, наверно. То есть float, как в случае с EagleEye ?
Вернуться к началу

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 » 11 окт 2017, 19:31

В большинстве случаев float (4 байта), но может быть и double (8 байтов). long double - это просто размер регистров ST(x).

Это даже следует из здравого смысла: я сомневаюсь, что программер объявит функцию, которая принимает в качестве аргументов float, а возвращает long double:

long double someFunc(float arg) {} - это lol.
Последний раз редактировалось AlexSpl 11 окт 2017, 19:34, всего редактировалось 1 раз.
Вернуться к началу

Пред.След.

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

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

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