| XEPOMAHT   
   
   Posts: 2481
 
 | 
			| 
 
				 (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: 4366
 
 |  | 
	| 22.08.2021 00:16 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 22.08.2021 00:20 |  | 
	
		| daemon_n   
   
   Posts: 4366
 
 | 
			| 
 
				Найден серьёзный Баг (оригинала), сработает и в WOG/ERA 
Как все мы знаем, ограничение числа стеков в бою с каждой стороны  - 20 ед. 
Призыв элементалей хоть и занимает число стеков, но где-то за 3 ед до лимита эта величина подчищается.
 
Но с опытом существ/санта гремлинами/прочими скриптами доступно заполнение массива другими существами. + добавим поднятие Пит-лордами.
 
Проще говоря, на таких значениях можно выйти сверх лимита. И это возможно сделать подняв отряд пит-лордами либо призвав элементалей (для ИИ - нет проверки!!!), так понимаю, воскрешением тоже - 0x005A777B - адрес ошибки (v12->SlotIndex = this; )
 
Может, через ERM оно решается, но лучше через плагин  
 
  
 Новейший Heroes Launcher
 |  | 
	| 19.09.2021 15:59 |  | 
	
		| XEPOMAHT   
   
   Posts: 2481
 
 | 
			| 
 
				 (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: 4366
 
 |  | 
	| 19.09.2021 19:55 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 19.09.2021 21:33 |  | 
	
		| igrik   
   Posts: 2821
 
 | 
			| 
 
				Вообще то такая проверка есть (0x479A54) 
Но она не работает и выход из функции ни на что не влияет (функции вызывающие эту продолжают выполнять свой код не обращая внимание на "неуспех" текущей. Отсюда и вылеты)
 
UPD: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:
  И что в итоге: например разберём код воскрешения пит-лордов (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: 16785
 
 |  | 
	| 20.09.2021 09:39 |  | 
	
		| igrik   
   Posts: 2821
 
 | 
			| 
 
				Берс исправление я вижу так: Патчим лоухуком 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: 4366
 
 |  | 
	| 20.09.2021 10:17 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 20.09.2021 12:58 |  |