Объявления

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

Цитата:
У меня в экзешнике героев 156, как и в исходниках homm3.h

HotA патчит оригинальные инструкции уже после запуска игры. Так что это:

Код: Выделить всё
loc_4C7D8F:
lea     eax, [ebx+21725h]
mov     ecx, 156

превращается в вот это:

Код: Выделить всё
loc_4C7D8F:
lea     eax, [ebx+1613565h]
mov     ecx, 178

В оригинальном коде смещение 21725h постоянное, в HotA - нет. Поэтому героя с порядковым номером i из _GameMgr_ нужно получать следующим образом:

Код: Выделить всё
_Hero_* hero = o_GameMgr->GetHero(i);

Тогда следующий код:

Цитата:
Код: Выделить всё
int __stdcall makeDisguiseCounter(LoHook* h, HookContext* c)
{
   _GameMgr_* GM = (_GameMgr_*)c->ebx;
   _int_ id = GM->GetMeID();
   int addressTempModFlags = c->ebx + 0x21725;
   for(int i=0; i<156; i++)
   {
      if(*(_int8_*)(addressTempModFlags - 227) == id)
         *(_dword_*)(addressTempModFlags + 9) = -1;
      addressTempModFlags =+ 1170;
   }
       return EXEC_DEFAULT;
}

можно переписать так:

Код: Выделить всё
int __stdcall resetDisguise(LoHook* h, HookContext* c)
{
    for (_Hero_* hero = o_GameMgr->GetHero(0); hero != o_GameMgr->GetHero(o_HEROES_COUNT - 1); ++hero)
        if ( hero->owner_id == o_GameMgr->GetMeID() ) hero->disguise = -1;

    return EXEC_DEFAULT;
}

или так:

Код: Выделить всё
int __stdcall resetDisguise(LoHook* h, HookContext* c)
{
    for (int i = 0; i < o_HEROES_COUNT; ++i)
        if ( o_GameMgr->GetHero(i)->owner_id == o_GameMgr->GetMeID() ) o_GameMgr->GetHero(i)->disguise = -1;

    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 » 29 сен 2017, 20:50

Важное уточнение. o_GameMgr->GetMeID() возвращает ID только для игроков-людей. Так, например, если у нас есть 6 игроков-людей и 2 компа, то во время хода обоих компов o_GameMgr->GetMeID() будет возвращать 5, т.е. ID последнего походившего игрока-человека (Player 6). В случае с Disguise o_GameMgr->GetMeID() прокатывает, потому что компы не кастуют Disguise. Но попробуйте вручную прописать значение поля disguise для героя компа, и оно не сбросится кодом выше. Поэтому нужно использовать o_ActivePlayerID:

Код: Выделить всё
int __stdcall resetDisguise(LoHook* h, HookContext* c)
{
    for (int i = 0; i < o_HEROES_COUNT; ++i)
        if ( o_GameMgr->GetHero(i)->owner_id == o_ActivePlayerID ) o_GameMgr->GetHero(i)->disguise = -1;

    return EXEC_DEFAULT;
}


Далее, в сетевой игре o_ActivePlayerID и o_GameMgr->GetMeID() - совершенно разные значения. Разницу между ними отлично демонстрирует следующий пример. По сети играют два человека: красный и синий. Ход красного.

У красного: o_ActivePlayerID = 0, o_GameMgr->GetMeID() = 0.
У синего: o_ActivePlayerID = 0, o_GameMgr->GetMeID() = 1.

Так что, o_GameMgr->GetMeID() следует использовать только тогда, когда необходимо идентифицировать себя как игрока в не зависимости от того, чей сейчас ход (актуально для игры по сети).
Вернуться к началу

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

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

Сообщение Ben80 » 30 сен 2017, 04:30

То есть данный код
Код: Выделить всё
int __stdcall resetDisguise(LoHook* h, HookContext* c)
{
    for (int i = 0; i < o_HEROES_COUNT; ++i)
        if ( o_GameMgr->GetHero(i)->owner_id == o_ActivePlayerID ) o_GameMgr->GetHero(i)->disguise = -1;

    return EXEC_DEFAULT;
}


является окончательным и он будет корректно работать во всех ситуациях, в том числе по сети и в том числе для компов ?

Еще есть адрес 69CCF4. Это то что используется в процедуре 4C6CA0, только не для Disguise целей, конечно.
В сетевых процедурах 69CCF4 тоже вроде как используется.
Вернуться к началу

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

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

Сообщение Ben80 » 30 сен 2017, 04:35

Кстати, Вы ведь специально поправили код, чтобы он был универсальным (и для SoD, и для HotA).
А HotA оно вообще надо ? Вы вроде раньше писали, что в HotA баг Disguise уже поправлен.
Или Вы поправили, чтобы весь плагин с улучшенным Disguise, когда он будет дописан, мог работать и в SoD, и в HotA ?
Вернуться к началу

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

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

Сообщение Ben80 » 30 сен 2017, 07:04

Ben80 писал(а):


Еще есть адрес 69CCF4. Это то что используется в процедуре 4C6CA0, только не для Disguise целей, конечно.
В сетевых процедурах 69CCF4 тоже вроде как используется.


А, это же и есть o_ActivePlayerID !
Вернуться к началу

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

Цитата:
он будет корректно работать во всех ситуациях, в том числе по сети и в том числе для компов ?

Да. Активный игрок - это игрок, который ходит.

Цитата:
Вы вроде раньше писали, что в HotA баг Disguise уже поправлен.

Исправлено в HD:

Цитата:
[+] исправлено заклинание "Маскировка" (disguise):
тепреь заклинание имеет смысл использовать всем игрокам: действие залинания спадает перед началом следующего хода сколдовавшего игрока, а не как в оригинале - после окочания хода игрока 'последнего' цвета.
исправление маскировки включено, если включена опция "Fix gameplay bugs" в HiRez.ini (т.е. так же как и для исправления продажи артефактов и для исправления подглядываний).
Если у кого-то из игроков включена опция исправления багов, а у кого-то- нет, то маскировка будет вести себя либо по-старому, либо по-новому (в зависимости от очередности игроков). Если у одного из игроков включена опция исправления багов, а другой использует более раннюю версию HD, или вовсе не использует HD, то заклинание (в зависимости от очередности игроков) будет себя вести либо по-новому, либо маскировка будет висеть на герое вплоть до его увольения или проживания в таверне 1 день.


Нужно будет проверить.
Вернуться к началу

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

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

Сообщение Ben80 » 30 сен 2017, 10:41

Ну, по крайней мере в версии 4.207 так не работает, баг остается. HD+ включен.
Версия 2.59 - это ведь вроде даже для другого экзешника версия, от SoD, а не от Complete, как более поздние версии.
Вернуться к началу

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

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

Сообщение Ben80 » 30 сен 2017, 10:48

В версии 3.45 у меня тоже не работает.
Хотя в ini файле:

Код: Выделить всё
<HD+> = 2
{
   fixes gameplay bugs (Artifacts merchant, "Not Me", Refugee camp, endless AI turns, Clone cast, AI with Angelic Alliance, Quick Combat flying creatures bug, AI vs AI battles bugs, ... )
   adds Protected saved games, Replayable Quick Combat, ...
   ATTENTION! You should turn this options off if you play pure SoD offline tournament!
   0 - option is turned off
   1 - option is turned on for SoD/Complete/HotA only
   2 - option is turned on
   default value is 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 » 02 окт 2017, 00:00

Сообщают, что Ваш плагин (http://forum.df2.ru/index.php?showtopic=30848&view=findpost&p=744804) не работает. Проверил, действительно не работает.
Вернуться к началу

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

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

Сообщение Ben80 » 02 окт 2017, 03:26

NewEagleEyeAlex.zip
(9.41 КБ) Скачиваний: 232
Пока не знаю, в чем дело, у меня работает.
Вот этот самый файл. Версия HD мода 4.207 RC3.

Может быть, пришлeте мне тот, который у Вас работает, или сами выложите ?
Тестировал на 1 компе (хот-сит).
Вернуться к началу

Пред.След.

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

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

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