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: 16788 
	
		
	 | 
	
		
 | 
	| 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: 16788 
	
		
	 | 
	
		
 | 
	| 19.09.2021 21:33 | 
	
		
	 | 
	
		
		igrik 
 
 
		
		
		
			
			
			
 
 
			
Posts: 2821 
	
		
	 | 
	
		
			
			 
			
				Вообще то такая проверка есть (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: 16788 
	
		
	 | 
	
		
 | 
	| 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: 16788 
	
		
	 | 
	
		
 | 
	| 20.09.2021 12:58 | 
	
		
	 |