Объявления

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

Цитата:
Но что-то mySpecDesc.fullName не отображается.

А я не знаю, где оно используется. Везде - короткое.

Опять же, код, меняющий описания и значения из txt, лучше поместить в afterInit().
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 890
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 49 раз.

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

Сообщение Rolex » 02 ноя 2020, 12:04

AlexSpl писал(а):

А я не знаю, где оно используется. Везде - короткое.

Я что-то изначально подумал, что это заголовок для desc. Хотя надо было так:
Код: Выделить всё
mySpecDesc.desc = "{Специализация - Золото}\n\nУвеличивает ежедневный доход королевства на 500 золотых."


AlexSpl писал(а):

Опять же, код, меняющий описания и значения из txt, лучше поместить в afterInit().

А в чем принципиальная разница? Ранее вы так рекомендовали, а теперь все через afterInit()...
Вернуться к началу

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 » 02 ноя 2020, 12:27

Цитата:
А в чем принципиальная разница? Ранее вы так рекомендовали, а теперь все через afterInit()...

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

offlineigrik  
Подмастерье
Подмастерье
 
Сообщения: 108
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 84 раз.

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

Сообщение igrik » 02 ноя 2020, 15:05

Rolex писал(а):

igrik писал(а):

5) https://github.com/igrikRS/HoMM3-Plugin ... Killed.cpp
6) https://github.com/igrikRS/HoMM3-Plugin ... escription (написан в двух вариантах для разных заголовочников) (скрины тут http://wforum.heroes35.net/showthread.p ... #pid104441)

Спасибо. Видно, что все писалось под WoG. Какие-то спец проверки. Основной алгоритм понятно, что тот же, но вот некоторые моменты и особенности реализации...

А можно ли подправить код под SoD/Complete, ибо я у себя их даже собрать не могу. В SoD_SP эти пункты также реализованы, исходники вроде в общем доступе, их бы только отыскать среди всего кода, подправить и прикрутить мультиплеер.

Возможно, использовались расширенные библиотеки под WoG (которых у меня нет) и, может быть, нужны еще какие-то доп настройки студии. Используется Visual Studio 2015.

Конечно этих данных у вас нет. Я уже давно наполняю свои заголовочники. Но для вас они не имеют смысла - мои заголовочники уже очень, очень сильно переплетены с WOGом, и находить и выправлять их под SOD у меня нет никакого желания.
Самое верное решение для вас - использовать заколовочники Кавалериста. Они более структурированные, намного объёмнее по данным, и написаны как раз под SoD. Именно на них вам нужно тренироваться писать плагины. Лично я для SODа пишу именно на них. А для ВОГа на своих. И там и там я использую VS 2008.

Свои же примеры я показал в качестве образка как это можно сделать.

* * * *

Я смотрю вы текст пишете прямо в плагин - не самый лучших ход, как по мне.
Найдите место, где грузятсся все txt файлы. Поставьте хук на одну из них (желательно одну из последних), в этом хуке грузите свой txt, а в описания потом подставте свои строки. На самом деле это достаточно просто делается. Пример опять же можно увидеть в моих исходниках плагинов.
Вернуться к началу

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 » 02 ноя 2020, 15:47

Есть вопрос: имеется плагин. Код разбит на два лоухука, потому что я не знаю, как вернуть пару регистров eax:edx из макроса CALL_X(). Функция PlayWAVFile() как раз возвращает такую пару, а WaitForWavToPlay() её принимает как два разных аргумента.
Вернуться к началу

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

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

Сообщение Ben80 » 02 ноя 2020, 16:05

А ASM хук если написать ?
Вернуться к началу

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 » 02 ноя 2020, 16:46

Слишком много кода для asm-хука. Мне не нужно, чтобы макрос обязательно возвращал значения именно в регистрах eax, edx. Важно, чтобы он понимал, что результат функции - в eax:edx, и я смог получить эти два значения.
Вернуться к началу

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

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

Сообщение Ben80 » 02 ноя 2020, 16:51

Тогда еще более интересное предложение :smile1: - усовершенствовать патчер. Правда, исходники есть только для старой версии (2.3 или 2.8, не помню точно). Но старая версия содержит полный функционал, вроде даже asm хуки есть.
Вернуться к началу

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 » 02 ноя 2020, 17:02

Декомпилятор делает хитро:

Код: Выделить всё
v24 = sub_59A770(aRegenerWav);
...
v25 = v15;
...
sub_59A7C0(-1, v24, v25);

Но локальной переменной v15 ничего не присваивается. Она просто объявлена как int v15; // edx. Разумеется, такой код на C++ не работал бы (значение v15 не меняется с момента объявления).

Саму функцию декомпилирует так:
Код: Выделить всё
struct _RTL_CRITICAL_SECTION *__thiscall sub_59A770(char *this)
{
  struct _RTL_CRITICAL_SECTION *v2; // eax
  struct _RTL_CRITICAL_SECTION *v3; // esi

  if ( !this )
    return (struct _RTL_CRITICAL_SECTION *)qword_6992A8;
  v2 = (struct _RTL_CRITICAL_SECTION *)sub_55C930(this);
  v3 = v2;
  if ( !v2 )
    return (struct _RTL_CRITICAL_SECTION *)qword_6992A8;
  v2[1].LockSemaphore = HANDLE_FLAG_PROTECT_FROM_CLOSE;
  sub_59A510(v2);
  return v3;
}

Патчер умеет возвращать struct _RTL_CRITICAL_SECTION * (QWORD)?
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 890
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 49 раз.

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

Сообщение Rolex » 02 ноя 2020, 19:02

Такой вопрос: А как получить количество оставшихся выстрелов в бою у текущего стреляющего стека героя?

Вот так получается получить константу, то есть кол-во, которое всегда идет со старта у текущего стреляющего отряда:
Код: Выделить всё
o_pCreatureInfo[o_BattleMgr->GetCurrentStack()->creature_id].shots;


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

Пред.След.

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

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

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

cron