Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 16 авг 2019, 08:01

AlexSpl писал(а):

Как именно не работает? Навигация генерируется в Хижинах? Если её предлагают на левел-апах, то нужно прописать ей нулевой вес.

Да предлагают на левел-апах.
AlexSpl писал(а):

то нужно прописать ей нулевой вес.

Как это сделать?
Вернуться к началу

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

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

Сообщение igrik » 16 авг 2019, 08:15

я думаю хук в этом месте при старте новой карты 0x4C25E0 (загрузка сохранения читает из 0x4BCCE3)
o_GameMgr->Field<_byte_>(0x4E658 +HSS_NAVIGATION) = 1; //o_GameMgr->BannedSkills[HSS_NAVIGATION]

Потому что проверка при лейвел-апах как раз идет на поле o_GameMgr->BannedSkills
Последний раз редактировалось igrik 16 авг 2019, 09:02, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5048
Зарегистрирован: 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)
Поблагодарили: 1934 раз.

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

Сообщение AlexSpl » 16 авг 2019, 08:28

*(int*)0x67DCEC + (HeroClass << 6) + 0x18 - адрес таблицы весов вторичных навыков для героев класса HeroClass (0 - Рыцарь и т.д.). Вес Навигации для класса HeroClass будет равен *(char*)(*(int*)0x67DCEC + (HeroClass << 6) + 0x18 + HSS_NAVIGATION). Посмотрите SDK RoseKavalier. Может, там уже описана нужная структура (поищите текстовым поиском 0x67DCEC). Менять веса лучше всего после загрузки sstraits.txt.

Кстати, после весов идёт массив bool (1 байт) запрещённых навыков. Алгоритм повышения уровня работает именно с этими структурами.

Попробуйте поставить LoHook после загрузки sstraits.txt (0x4EDEF0) и прописать для Рыцаря:

*(char*)(*(int*)0x67DCEC + 0x18 + HSS_NAVIGATION) = 0; // Вес = 0
*(char*)(*(int*)0x67DCEC + 0x18 + HSS_NAVIGATION + 28) = 0; // Здесь не уверен (м.б., в данном случае это массив разрешённых навыков; если не получится, попробуйте 1)
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5048
Зарегистрирован: 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)
Поблагодарили: 1934 раз.

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

Сообщение AlexSpl » 16 авг 2019, 09:22

Проверил с помощью LMOracle для Рыцаря. Навигацию не предлагают:

Код: Выделить всё
int __stdcall DisableSecondarySkills(LoHook* h, HookContext* c)
{
   *(char*)(*(int*)0x67DCEC + 0x18 + HSS_NAVIGATION) = 0;

   return EXEC_DEFAULT;
}

...
_PI->WriteLoHook(0x4EDEF0, DisableSecondarySkills);
Вернуться к началу

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

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

Сообщение igrik » 16 авг 2019, 09:23

Зачем так сложно? При загрузке после sstraits.txt будет достаточно сложно регулировать когда отключать навигацию на картах без воды, а потом проверять когда её включать. А еще сложнее восстанавливать шансы выпадения навигации для всех классов при старте игры с водой.
Вот вполне рабочий код, и не нужно лезть в шансы выпадения втор.навыков в классах героев.
Код: Выделить всё
int __stdcall Y_BannedSSkills(LoHook* h, HookContext* c)
{
   if ( *(int*)(*(int*)0x69FC44 + 0x18B8) == 0 ) // наличие воды: 0-нет, 1-норма, 2-острова
   {
      if (c->esi == 6) // id вторичного навыка после навигации ( HSS_NAVIGATION +1) 
      {
         o_GameMgr->Field<_byte_>(0x4E658 +HSS_NAVIGATION) = 1; //o_GameMgr->BannedSkills[HSS_NAVIGATION]
      }      
   }

   return EXEC_DEFAULT;
}

...
_PI->WriteLoHook(0x4C25CF, Y_BannedSSkills);

Это первое.
Второе: проверка на генерацию навыков в университете при старте идет с проверкой опять же на поле o_GameMgr->BannedSkills, загрузка сохранения читает из этого же поля.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5048
Зарегистрирован: 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)
Поблагодарили: 1934 раз.

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

Сообщение AlexSpl » 16 авг 2019, 09:28

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

Код: Выделить всё
TWeights = record
  PW, PW10: array[0..3] of BYTE;
  SW: array[SS_PATHFINDING..SS_FIRST_AID] of BYTE;
  SR: array[SS_PATHFINDING..SS_FIRST_AID] of Boolean;
end;


Вот так алгоритм находит сумму весов навыков:

Код: Выделить всё
if ( ((*Hero).Skill[i] >= MinLevel) && ((*Hero).Skill[i] < MaxLevel) && (i != LeftSkill) )
            if ( (!(*Weights).SR[i]) && ((*Weights).SW[i]) ) SUM_W += (*Weights).SW[i]; else
                if ( (*Hero).Skill[i] > 0 ) ++SUM_W;


Здесь SW и SR у каждого класса разные.
Последний раз редактировалось AlexSpl 16 авг 2019, 09:42, всего редактировалось 1 раз.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 16 авг 2019, 09:39

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

Да точно код рабочий, и делает все что нужно - запрещает навыки и на левел-апах и в объектах на карте.

А вот рабочий код с RK SDK:
Код: Выделить всё
P_Main->bannedSkills[NH3Skills::NAVIGATION] = 1;

Жалко только что rmg->waterAmount не работает, приходится доставать его из _RMGStruct_.
Последний раз редактировалось as239 16 авг 2019, 09:57, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5048
Зарегистрирован: 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)
Поблагодарили: 1934 раз.

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

Сообщение AlexSpl » 16 авг 2019, 09:45

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

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

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

Сообщение igrik » 16 авг 2019, 10:20

AlexSpl писал(а):

Просто интересно: если существует глобальный массив запрещённых навыков, тогда зачем у каждого класса есть свой (см. 28 байтов после весов вторичных навыков для каждого класса)?

У каждого класса есть взможность изучить втор.навык с определенным шансом.
Возьмём к примеру Некромантов - им всегда нужно выучить Некромантию и запрещено учить Лидерство. Я думаю в этих полях как раз и хранятся эти данные. Также некоторым классам запрещено изучать магию воды, огня и т.д.
Последний раз редактировалось igrik 16 авг 2019, 12:52, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5048
Зарегистрирован: 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)
Поблагодарили: 1934 раз.

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

Сообщение AlexSpl » 16 авг 2019, 10:36

Да, получается, что так. Нужно проверить, перегружают ли эти поля глобальный запрет: если, например, глобально запретить Некромантию, будут ли Рыцари Смерти и Некроманты её качать (без навыка Некромантии на старте)?

Проверил. Качают. Т.е. у этого массива более высокий приоритет.

Ошибся в коде. Нет, не качают. Т.е. глобальный массив запрещает даже Некромантию!
Вернуться к началу

Пред.След.

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

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

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