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


Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

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

AlexSpl писал(а):

Цитата:
При игре с компом играю красным и получаю ID 1 из-за того, что атакер - комп, а не я.

Естественно, нападает же он в свой ход.


Нет, не естественно. ID - это красный, синий и тд. И это не зависит от того, чей ход.

И только вот этот вызов и дает правильный ID
Код: Выделить всё
CALL_1(_int_, __thiscall, 0x4CE6E0, *(int*)0x699538)
Вернуться к началу

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, 17:32

Цитата:
Кроме того, придется уделить некоторое внимание размеру кода, входящего в патч (уже встречал некое неприятное предупреждение от программы с сопутствующими глюками).

Насколько мне известно, никаких ограничений на размер плагинов нет.

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

Указатель на героя (с помощью него можно получить имя героя и его пол), а также ID выученных заклинаний, я думаю :smile1:

А вообще, о каких аргументах речь? Показывать обычное текстовое сообщение: "Герой такой-то выучил то-то и то-то".
Последний раз редактировалось AlexSpl 09 сен 2017, 17:45, всего редактировалось 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, 17:35

Цитата:
Нет, не естественно. ID - это красный, синий и тд. И это не зависит от того, чей ход.

Понятное дело. Но o_ActivePlayerID - это ID игрока, который ходит.

Цитата:
CALL_1(_int_, __thiscall, 0x4CE6E0, *(int*)0x699538)

Это то же самое, что и o_GameMgr->GetMeID(), т.е. ID нашего игрока.

* * *
Доверяй, но проверяй. Оказывается, массив _byte_ spell_level[70]; // +1072 никакого отношения к уровню не имеет. _byte_ spell[70]; // +1002 - это массив заклинаний, которые герой выучил (0 - не знает, 1 - знает), а _byte_ spell_level[70]; // +1072 - это массив заклинаний, которые герой может кастовать (0 - не может, 1 - может). Поэтому код на предыдущей странице нужно переписать следующим образом:

Код: Выделить всё
for (int iSide = ATTACKER; iSide <= DEFENDER; ++iSide)
{
    if ( !o_BattleMgr->hero[iSide] || !o_BattleMgr->hero[1 - iSide] ) continue;
   
    for (int iSpell = SPL_QUICKSAND; iSpell <= SPL_AIR_ELEMENTAL; ++iSpell)
    {
        if ( canLearn(iSide, iSpell) )
        {
            o_BattleMgr->hero[iSide]->spell[iSpell] = 1;
            o_BattleMgr->hero[iSide]->spell_level[iSpell] = 1;
        }
   
    }
}
Вернуться к началу

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

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

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

AlexSpl писал(а):

А вообще, о каких аргументах речь? Показывать обычное текстовое сообщение: "Герой такой-то выучил то-то и то-то".


Да, можно просто использовать ту функцию, которую Вы мне показывали ранее -
CALL_12(void, __fastcall, 0x4F6C00, Text, 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
Вернуться к началу

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

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

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

Но хотелось бы конечно лучше использовать красивый диалог с иконками -

004F7D20 ; int __fastcall DisplayComplexDialog(int Mes, int a2, int a3, int a4, int a5)

Здесь 5 аргументов.
Можете уточнить их ?
Вернуться к началу

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

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

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

Копипаста из patcher_x86.hpp -

///////////////////////////////////////////////////
// Метод GetMaxPatchSize
// Библиотека patcher_x86.dll накладывает некоторые ограничения
// на максимальный размер патча,
// какой - можно узнать с помощью метода GetMaxPatchSize
// (на данный момент это 8192 байт, т.е. дохрена :) )
virtual int __stdcall GetMaxPatchSize() = 0;

Но я думаю, что проблемы, которые у меня были, другого рода, там с размером стэка что-то было связано.
Или просто мой код в каком-то месте был "волшебный" в отрицательном смысле - поскольку когда экспериментировал со всеми этими ID, постоянно то удалял какие-то куски кода, то добавлял.
Вернуться к началу

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

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

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

Для плагина EagleEye я использовал несколько массивов int.
Полагаю изменить их на массивы _byte_ либо более активно задействовать в коде
(*(_Spell_**)0x687FA8)

чтобы не создавать массивов fireSpells, waterSpells и тд.
Вернуться к началу

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, 19:16

Цитата:
Здесь 5 аргументов.
Можете уточнить их ?

Нужно анализировать. Это __fastcall функция (первые два аргумента в ecx и edx). Первый аргумент, очевидно, текстовое сообщение. Второй - указатель на непонятную структуру (в частности, по адресу [edx + 4] хранится ID заклинания (int). Третий, похоже, ID игрока. 4-й и 5-й не разбирал, можно писать -1, -1.
Последний раз редактировалось AlexSpl 09 сен 2017, 20:05, всего редактировалось 1 раз.
Вернуться к началу

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

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

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

AlexSpl писал(а):

Второй - указатель на непонятную структуру (в частности, по адресу [edx+4] хранится ID героя (int), а затем следует ID выученного заклинания (int).


Возможно, это как раз _BattleMgr_
Там, правда, в начале идет _byte_ field_0[452]

Последний аргумент - это вроде как либо 15000, либо 0, судя по С коду:
Код: Выделить всё
v34 = 15000;
  if ( !NetworkGame || dword_006977D8 )
  {
    dword_006977D4 = 0;
    v34 = 0;
  }


И 3 и 4 аргументы - по минус единице.
Вернуться к началу

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

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

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

Что пишется в эту непонятную структуру (где выученные заклинания и всякая всячина), наверно, можно понять из процедуры sub_005A9760. Но понять это очень сложно :smile1:
Вернуться к началу

Пред.След.

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

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

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

cron