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


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 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)
Поблагодарили: 2155 раз.

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

Сообщение AlexSpl » 12 сен 2022, 03:47

Цитата:
/nwcgrail?

Видимо, стандартных чит-кодов недостаточно. Когда писал читы для TE, тоже хотел сделать мгновенный телепорт в выбранную клетку карты (DD задолбаешься кастовать, если карта большая, а в Тройке ещё и подземный уровень есть, куда просто так не попасть).

Цитата:
How can it be done? Does such a plugin exist already?

It can be done by calling the same function the game uses for DD. As for the second part, I doubt such a plugin exists, though the very idea was already implemented in some plugins (I can recall a plugin for ERA which introduces a new spell called Vertical, this spell instantly teleports a hero down to the underground).

* * *
You need to call this function (0x41DAB0) to teleport hero to packedXYZ:

Код: Выделить всё
advManager::TeleportTo(this, hero, packedXYZ, akSpellTraits[SPL_DIMENSION_DOOR].wav_name, 0, 1, 0);

So, basically you hook the function which intercepts keystrokes, write simple interface for XYZ input, and, finally, call the above function. To make things even simpler, hook cheat-codes function and parse new cheat, e.g. nwcteleportmeto0320451. You can shorten "teleportmeto" part though :smile1:
Вернуться к началу

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

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

Сообщение AlexSpl » 23 окт 2022, 14:48

Обратил внимание на то, что при вызове элементалей в потерях после битвы иногда указывается рандомное число погибших элементалей при игре с плагином NewSpells. В процессе закрытия данной issue вышел уже на баг оригинала (тестировал на HD 5.4 R7). А баг заключается вот в чём: если противник не полностью добивает стек наших элементалей, то в потерях будет указано корректное число погибших элементалей, однако если противник полностью уничтожает стек элементалей, а мы призываем новый стек элементалей, то в потерях будет не сумма убитых элементалей, а только кол-во погибших элементалей в последнем вызванном стеке :!: В плагине ситуация ещё усугубляется тем, что там можно вызывать до трёх разных существ: Фей, Огненных птиц и какой-то один тип элементалей.

1.jpg
1.jpg (104.71 КБ) Просмотров: 882

Например, это скрин после битвы на оригинале, в которой на самом деле погибло два стека огненных элементалей по 4 элементаля в каждом.

* * *
Проверил на "ванильных" Героях (SoD 3.2 без HD мода) и в HotA. Баг присутствует и в этих версиях. Почему это баг? Если вызвать последовательно два стека элементалей (второй до того, как первый погибнет), то кол-во убитых элементалей будет отображено верно.

* * *
Чтобы решить эту проблему, потребуется вектор погибших существ, а не массив экземляров класса army. Конечно, если мы действительно хотим отображать потери существ, которые не дают опыт. Но я бы не заморачивался и просто не отображал таких существ в потерях. Какая вообще разница, сколько призванных существ мы уничтожили, если это ни на что не влияет? :smile1:
Вернуться к началу

offlineАватара пользователя
Владимир  
Эксперт
Эксперт
 
Сообщения: 1031
Зарегистрирован: 30 окт 2012, 18:37
Пол: Не указан
Награды: 3
Высшая медаль (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (1)
Поблагодарили: 614 раз.

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

Сообщение Владимир » 24 окт 2022, 04:11

А воскрешать призванных фей и огнептиц у вас можно? Если да, то проблема решается только одним способом - не отображать призванных в потерях.
Элементали не воскрешабельны, поэтому, наверное, можно было бы так: если призываем новый отряд из 4 элементалей взамен уничтоженного, он призывается как "отряд, в котором всего 8 элементалей, но 4 уже погибли". Вопрос - нужно ли подобное хитрозакрученное нечто.
Вернуться к началу

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

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

Сообщение AlexSpl » 24 окт 2022, 10:14

Цитата:
А воскрешать призванных фей и огнептиц у вас можно?

Нет, призванных существ нельзя воскрешать.

Цитата:
Если да, то проблема решается только одним способом - не отображать призванных в потерях.

Так и сделал. Призыв - такое же заклинание, как и Клон. А клоны в потери не идут. Теперь будет легче верить в битвы без потерь с использованием призыва :smile2:
Вернуться к началу

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

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

Сообщение AlexSpl » 25 окт 2022, 22:47

Пофиксил функцию взвешивания заклинания Anti-Magic для плагина NewSpells:

Код: Выделить всё
// Anti-Magic
int type_AI_spellcaster::get_antimagic_cancel_value(army* current_army, TSkillMastery mastery) const
{
   int spellValueSum = 0;
   int dispelLevel;
   type_enchant_data enchantData;

   switch (mastery) {
      case eMasteryAdvanced:
         dispelLevel = 4;
         break;
      case eMasteryExpert:
         dispelLevel = 5;
         break;
      default:
        dispelLevel = 3;
   }
   
   for (int iSpell = SPELL_SHIELD; iSpell < SPELLS_NUM; ++iSpell)
   {
      int (__thiscall type_AI_spellcaster::*value_func)(army* const, type_enchant_data) const = this->get_enchantment_function((SpellID)iSpell);
         
      if (current_army->spellInfluence[iSpell] && value_func && dispelLevel >= o_Spell[iSpell].level)
      {
         enchantData.spell = (SpellID)iSpell;
         enchantData.check_resistance = 0;
         enchantData.mastery = (TSkillMastery)activeSpellMastery[current_army->group][current_army->index][iSpell];
         enchantData.power = current_army->spellInfluence[iSpell];
         enchantData.duration = current_army->spellInfluence[iSpell];
         
         current_army->CancelIndividualSpell(iSpell);
         if (o_Spell[iSpell].type < 0 == (current_army->group == this->our_group))
            spellValueSum += (this->enemy_caster->*value_func)(current_army, enchantData);
         else
            spellValueSum -= (this->*value_func)(current_army, enchantData);
      }
   }
   
   return spellValueSum;
}

int type_AI_spellcaster::get_antimagic_value(army* const Army, type_enchant_data data) const
{
   army* current_army = new army;
   current_army->copyConstructor(Army);

   int cancelValue = get_antimagic_cancel_value(current_army, data.mastery);
   
   delete current_army;

   return cancelValue + get_protection_value(Army, eSchoolAll, o_Spell[SPELL_ANTI_MAGIC].effect[data.mastery], data.duration, 0);
}

Также поместил заклинание Fear в категорию лишающих атаки заклинаний/эффектов, в которую также входят Blind, Stone Gaze и Paralyze. Может, это как-то поможет AI выбирать заклинания эффективнее :smile1:
Вернуться к началу

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

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

Сообщение AlexSpl » 26 окт 2022, 10:47

Так, Anti-Magic не отменяет положительные эффекты, поэтому кейс else (spellValueSum -= (this->*value_func)(current_army, enchantData);) следует убрать. Итого, в функции взвешивания Anti-Magic оказалось два бага: она не учитывала уровень развития Магии Земли и она не учитывала, что при наложении Anti-Magic положительные эффекты не снимаются.

С другой стороны, минус к сумме за положительные эффекты может как-то компенсировать то, что герой больше не сможет их вешать, что тоже имеет смысл. Однако функция однозначно называется get_cancel_value() и используется также для Cure и Dispel. Как Вы думаете, следует ли оставить минус за положительные эффекты, т.е. может ли моё предположение о компенсации быть верным? Но ведь и другая сторона не сможет вешать отрицательные эффекты тоже :smile5: Думаю всё-таки убрать. Пусть вес Anti-Magic будет суммой весов отменённых отрицательных эффектов и веса защиты от всех стихий.

* * *
Обновил плагин NewSpells до версии 1.03 RC2.
Вернуться к началу

offlinevovacyxov  
имя: Влaдимир
 
Сообщения: 9
Зарегистрирован: 08 ноя 2022, 12:30
Пол: Мужчина
Поблагодарили: 3 раз.

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

Сообщение vovacyxov » 08 ноя 2022, 12:53

Добрый день уважаемые, не могу нигде найти плагин для удаления взятого вторичного навыка. Заранее спасибо! Сам к сожалению плагины делать неумею. Буду благодарен если поможете.
Вернуться к началу

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

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

Сообщение AlexSpl » 09 ноя 2022, 09:52

Вам нужна демонстрация удаления или вторичный навык должен удаляться при каком-то условии/триггере?
Вернуться к началу

offlinevovacyxov  
имя: Влaдимир
 
Сообщения: 9
Зарегистрирован: 08 ноя 2022, 12:30
Пол: Мужчина
Поблагодарили: 3 раз.

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

Сообщение vovacyxov » 09 ноя 2022, 14:20

AlexSpl писал(а):

Вам нужна демонстрация удаления или вторичный навык должен удаляться при каком-то условии/триггере?

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

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

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

Сообщение AlexSpl » 09 ноя 2022, 14:54

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

Пред.След.

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

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

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