XEPOMAHT
Posts: 2356
|
(21.08.2021 23:22)Raistlin Wrote: На мой взгляд, исправить стоит, но не хуком, а бинарником - можно просто скопировать байт-код, поменяв его части местами.
На мой взгляд, этот корявый хук вообще можно выключить. Т.к. он и установлен неудачно (ставить надо было непосредственно на 440253h), и выполняет мусор. А вообще, данная штука может быть реализована обычным бинарным пачтем, т.к. выше данной функции можно освободить место для кода (9 байт как минимум), задействуя +10 байт кода самой функции, который будет затёрт. Итого, 19 байт, в которые может без проблем уместиться проверка на монстра.
(21.08.2021 23:22)Raistlin Wrote: Так, при желании, любой сможет это отключить, а также не будет потенциальных конфликтов с другими модами, которые захотят повлиять на вероятности старости.
В Тифоне расширены сами кейсы, поэтому что есть этот воговский хук, что его нет - особой разницы нет. Т.к. % срабатывания старения выставляется непосредственно в редакторе монстров (20, 40 и 100), ну и можно "старить" без проверки на "живность" (например Анубис старит всех без разбору ).
|
|
22.08.2021 00:01 |
|
daemon_n
Posts: 4343
|
|
22.08.2021 00:16 |
|
Berserker
Posts: 16657
|
|
22.08.2021 00:20 |
|
daemon_n
Posts: 4343
|
Найден серьёзный Баг (оригинала), сработает и в WOG/ERA
Как все мы знаем, ограничение числа стеков в бою с каждой стороны - 20 ед.
Призыв элементалей хоть и занимает число стеков, но где-то за 3 ед до лимита эта величина подчищается.
Но с опытом существ/санта гремлинами/прочими скриптами доступно заполнение массива другими существами. + добавим поднятие Пит-лордами.
Проще говоря, на таких значениях можно выйти сверх лимита. И это возможно сделать подняв отряд пит-лордами либо призвав элементалей (для ИИ - нет проверки!!!), так понимаю, воскрешением тоже - 0x005A777B - адрес ошибки (v12->SlotIndex = this; )
Может, через ERM оно решается, но лучше через плагин
Новейший Heroes Launcher
|
|
19.09.2021 15:59 |
|
XEPOMAHT
Posts: 2356
|
(19.09.2021 15:59)daemon_n Wrote: Проще говоря, на таких значениях можно выйти сверх лимита. И это возможно сделать подняв отряд пит-лордами либо призвав элементалей (для ИИ - нет проверки!!!), так понимаю, воскрешением тоже - 0x005A777B - адрес ошибки (v12->SlotIndex = this
Может, через ERM оно решается, но лучше через плагин
Проверки на лимит количества отрядов должны быть в коде, если их там нет (например в ВоГе не всегда, в скриптах - тем более), то нужно добавлять. combatManager врядли кто-то станет патчить для увеличения количества стеков - там куча данных, использующихся в плагинах, в общем совместимость будет практически никакая. В рамках обособленного мода типа HoA или MoP такую штуку можно сделать, но для ERA - абсолютно лишено смысла
(This post was last modified: 19.09.2021 19:28 by XEPOMAHT.)
|
|
19.09.2021 19:26 |
|
daemon_n
Posts: 4343
|
|
19.09.2021 19:55 |
|
Berserker
Posts: 16657
|
|
19.09.2021 21:33 |
|
igrik
Posts: 2819
|
Вообще то такая проверка есть (0x479A54)
Но она не работает и выход из функции ни на что не влияет (функции вызывающие эту продолжают выполнять свой код не обращая внимание на "неуспех" текущей. Отсюда и вылеты)
Code:
////// начальная часть кода функции BattleMgr_Add_New_StackBySpell ////
stackFlags = &bm->stacks[21 * Side].Flags;
// (132-80)=52 -> creature_id != NONE
while ( *(stackFlags - 80) != -1 )
{
// !count && flag_DIE && flag_SUMMON
if ( !*(stackFlags - 38) && ((unsigned int)*stackFlags >> 21) & 1 && ((unsigned int)*stackFlags >> 22) & 1 )
{
stackID = i;
bool_isFindNewStackID = TRUE;
goto ifFindStack;
}
// try to find next
++i;
stackFlags += 338;
// if maximum
if ( i >= 20 )
return 0;
}
stackID = i;
ifFindStack:
UPD: И что в итоге: например разберём код воскрешения пит-лордов (0x5A776F)
Code:
// (тут, если id нового стека не найдет, в v12 будет возвращён ноль)
v12 = BattleMgr_Add_New_StackBySpell(bm, v11, 48, v10, v5->hex_ix, 0, 1);
// просто перезапись адреса стека (в данном случае нуля)
v13 = v12;
// и тут закономерно получаем вылет при попытке взятия смещения у нуля:
v12->SlotIndex = (int)this;
game bug fixes extended.dll || My Plugins || My GitHub
|
|
20.09.2021 09:01 |
|
Berserker
Posts: 16657
|
|
20.09.2021 09:39 |
|
igrik
Posts: 2819
|
Берс исправление я вижу так:
Патчим лоухуком 3 ВЫЗОВА функции BattleMgr_Add_New_StackBySpell (0x479A30)
И если у этой функции результат равен нулю, завершаем вызывающие функции (благо они все типа void, и их завершение не критично для игры. Можно и сообщение добавить о невозможности вызова, призыва или воскрешения)
Кстати, в ВОГе тоже есть всего один вызов такой функции (0x714DA7), который обрабатывает ВСЕ вызовы монстров в ВОГе, и после идёт проверка на ноль, так что ВОГ это сделал безопасно, в отличие от СОДа.
game bug fixes extended.dll || My Plugins || My GitHub
|
|
20.09.2021 09:48 |
|
daemon_n
Posts: 4343
|
|
20.09.2021 10:17 |
|
Berserker
Posts: 16657
|
|
20.09.2021 12:58 |
|