Объявления
Поздравляем
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 » 09 сен 2017, 13:09

Всё понятно, почему. Именно в этой функции происходит инициализация этого поля (см. 462904h и 462A93h). Поэтому хук надо ставить ниже, когда инициализация выполнена.

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

Нужно убедиться, что и для всех остальных игроков код работает. Лучше всё-таки o_ActivePlayerID, мне кажется.
Вернуться к началу

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

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

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

Поэкспериментирую, когда еще время появится.

Пока вот как-то так (для 2 игроков точно работает):

Код: Выделить всё
   int attackerHeroOwner = *(int*)(c->ebx + 0x54A8);
   int defenderHeroOwner = *(int*)(c->ebx + 0x54AC);

   int currentSide = 1;
   int mojID = CALL_1(_int_, __thiscall, 0x4CE6E0, *(int*)0x699538);
   if(attackerHeroOwner == mojID)
      currentSide = 0;
Последний раз редактировалось Ben80 09 сен 2017, 13:25, всего редактировалось 1 раз.
Вернуться к началу

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

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

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

AlexSpl писал(а):

Поэтому хук надо ставить ниже, когда инициализация выполнена.


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

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

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

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

AlexSpl писал(а):

Цитата:
Так что не знаю, с чем связать вот уже 2-й раз встречающуюся ситуацию с плагином для заклинания Ослепление -
при попытке применить выдается сообщение "Это заклинание не подействует ни на кого". Артефактов у вражеского героя никаких нет.

С кодом всё в порядке. Может на троглодитов нападаете? :smile1:


Кстати, в натуре на троглодитов нападал. Вернее, у героя был значок смелости, насколько вспомнил сейчас, а я как-то забыл, что он не только боевой дух поднимает.
Вернуться к началу

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

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

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

Кстати, из структуры Героя почему-то так и не удалось получать овнера
_int8_ owner_id; // +34

мусор в этом поле.
И не только в контексте 0x462C7D
Вернуться к началу

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

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

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

AlexSpl писал(а):

Лучше всё-таки o_ActivePlayerID, мне кажется.


Потестировал немного.
При игре с компом играю красным и получаю ID 1 из-за того, что атакер - комп, а не я.
То есть некорректно работает (должен был получить ID 0).
Вернуться к началу

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, 13:56

Так, а зачем нам всякие оунеры? Выучить заклинание может любой герой, у которого есть Eagle Eye (только компу диалог показывать не нужно).

Цитата:
А куда именно его бы можно поставить ?


Код: Выделить всё
int __stdcall eagleEyeSpell(LoHook* h, HookContext* c)
{
    char Text[200]; // Текстовый буфер
    sprintf(Text, "{LoHook @ %08X}\n\nEagle Eye Level of hero[0]: %d\nEagle Eye Level of hero[1]: %d", h->GetAddress(),
        o_BattleMgr->hero[0]->second_skill[HSS_EAGLE_EYE], o_BattleMgr->hero[1]->second_skill[HSS_EAGLE_EYE]);
    CALL_12(void, __fastcall, 0x4F6C00, Text, 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);

    return EXEC_DEFAULT;
}

...

_PI->WriteLoHook(0x462C7D, eagleEyeSpell);


В этой функции можно и заклинания раздавать обоим героям.
Вернуться к началу

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

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

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

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

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

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

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

AlexSpl писал(а):

В этой функции можно и заклинания раздавать обоим героям.


Раздавать то их можно, но источник раздачи у них неодинаков.
Вернуться к началу

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

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

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

Как ни смешно, пока что данный вызов является единственным способом правильно получить ID (в контексте 0x462C7D).

int mojID = CALL_1(_int_, __thiscall, 0x4CE6E0, *(int*)0x699538);
Вернуться к началу

Пред.След.

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

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

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