MOP 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 1468 
	
		
	 | 
	
		
			
			 
			
				 (22.02.2012 17:38)totkotoriy Wrote:  И еще хотел спросить что за адрес 6992D0 в этой команде mov eax,DWORD PTR DS:[0X6992D0]? Он для другого хука будет такой же? 
heroWindowManager. 
Для каждого хука свой затираемый этим хуком код.
			  
			
			
  
Circle of destruction, hammer comes crushing 
Powerhouse of energy 
Whipping up a fury, dominating flurry 
We create the battery
			
		 |  
	 
 | 
	| 22.02.2012 19:30 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				era.h, которую точно принимает MSVC++ 9.0 прилагается к  тому, что я делал выше.
 
totkotoriy, если ты не осилил плагин, которыя я для тебя переписал, вот упрощённый и чуть более плотно прокомментированный вариант. Тут создаётся триггер, в него передаются и из него принимаются параметры !!SN:X. Разумеется, тут ничего особенного не происходит, но триггер вызывается. 
Это код на MSVC++ 9.0, по идее должен компилироваться, если положить рядом era.h, расширение плагина для работоспособности нужно изменять на "era" после компиляции.
 
#include "era.h"  
 
//Переменная битов целей атакующей стороны (1-й - 21-й биты). 
unsigned int LeftSideBits = 0; 
 
//Переменная битов целей защищающейся стороны (1-й - 21-й биты). 
unsigned int RightSideBits = 0; 
 
//Номер стека - основной цели. 
int MainTarget = -1; 
 
//Номер атакующего стека. 
int Atacker = -1; 
 
 
 
//Триггер до удара. 
void __declspec(naked) Damage_trigger() 
{    __asm    {     // Сохраняем все регистры.     pushad           //Обнуляем переменные-параметры.     mov LeftSideBits, 0     mov RightSideBits, 0     mov MainTarget, 0     mov Atacker, 0          /*      ...Тут идёт код, вычисляющий переменные-параметры...     */               //Записываем цели в параметры !!SN:X.     mov edi, EventParams // Это специальный масив Эры для передачи параметров. При помощи erm-команды !!SN:X можно будет их считать в скрипте.     mov eax, LeftSideBits     mov [edi], eax // EventParams[0] = LeftSideBits;     mov eax, RightSideBits     mov [edi + 4], eax // EventParams[1] = RightSideBits;          //Записываем номер основной цели в параметры !!SN:X.     mov eax, MainTarget     mov [edi + 8], eax // EventParams[2] = MainTarget;          //Записываем номер атакующего стека в параметры !!SN:X.     mov eax, Atacker     mov [edi + 12], eax // EventParams[3] = Atacker;          //Вызываем ERM-функцию 78001 (перед ударом), из неё получаем параметры для записи в переменные целей.     push 78001     mov eax, 0x74CE30     call eax     add esp, 4          //Считываем новые цели из параметров !!SN:X.     mov edi, EventParams // В erm-коде с помощью команды !!SN:X в этот массив был записаны новые значения. Мы можем их считать и что-нибудь изменить в зависимости от них.     mov eax, [edi]     mov ebx, [edi + 4] 
     //Записываем новые цели в переменные целей.     mov LeftSideBits, eax // LeftSideBits = EventParams[0];     mov RightSideBits, ebx // RightSideBits = EventParams[1];               /*      ...Тут могли бы обрабатываться параметры и что-нибудь изменяться...     */          // Восстанавливаем все регистры.     popad               //Вызываем затёртую функцию (вместо вызова этой функции в игре теперь стоит вызов кода этого хука, поэтому вызываем её вручную).     mov eax, 0x465BC0     call eax          // push + ret = jmp (то есть это просто прыжок на адрес 0x44134B, возвращение из хука в код игры).     push 0x44134B     ret    } 
} 
 
 
//После кода WoG. 
void __stdcall OnAfterWoG(PEvent Event) 
{    //Создание триггера до удара.    Hook(Damage_trigger, HOOKTYPE_JUMP, 5, (void*)0x441346); 
} 
 
 
 
//Начало. 
extern "C" __declspec(dllexport) BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID lpReserved) 
{    if (reason == DLL_PROCESS_ATTACH)    {     DisableThreadLibraryCalls(hInst);     // Инициализация, создание связи с Эрой.     ConnectEra();          // Регистрируем обработчик, который запустится после выполнения кода WoG в начале запуска программы и вызовет указанную функцию.     RegisterHandler(OnAfterWoG, "OnAfterWoG");         }    return TRUE; 
};  
			 
			
			
			
		 |  
	 
 | 
	| 22.02.2012 21:48 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 22.02.2012 22:22 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				Да, я отстал от жизни, и SDK у меня там для 1.9.    Ну, впрочем это непринципиально, старое, по крайней мере, то, что я использовал, не менялось.
			  
			
			
			
		 |  
	 
 | 
	| 22.02.2012 22:39 | 
	
		
	 | 
	
		
		kostya_76 
 
 
		
		
		
			
			
			 
			
Posts: 33 
	
		
	 | 
	
		
			
			 
			
				 (22.02.2012 17:38)totkotoriy Wrote:  Костян, и можешь еще прислать скомпилиный этот код? я скомпилил его чуть по другому (без era.h) и у меня все равно в игре вылетает( 
Вот 
Только работать будет лишь под Эрой, коль скоро функция оттуда вызывается. 
 
Кстати, имена людей коверкать нехорошо   
			 
			
			
			
		 |  
	 
 | 
	| 22.02.2012 23:14 | 
	
		
	 | 
	
		
		totkotoriy 
 
 
		
		
		
			
			
			
 
 
			
Posts: 873 
	
		
	 | 
	
		
			
			 
			
				 (22.02.2012 21:48)Sav Wrote:  totkotoriy, если ты не осилил плагин, которыя я для тебя переписал, вот упрощённый... 
Попробуй тут осилить когда кто на чем пишет, а ты ни того не другого не знаешь... Спасибо, будем разбираться...
  (22.02.2012 23:14)kostya_76 Wrote:   (22.02.2012 17:38)totkotoriy Wrote:  Костян, и можешь еще прислать скомпилиный этот код? я скомпилил его чуть по другому (без era.h) и у меня все равно в игре вылетает( 
 
Вот  
Только работать будет лишь под Эрой, коль скоро функция оттуда вызывается.  
 
Кстати, имена людей коверкать нехорошо   
По мне так Костян - это ещё уважительнее чем просто Костя... 
Спасибо, всё работает, наверное я ещё и неправильно код на С++ в прошлый раз написал.  
Может ещё обясните как вычесляется адрес (например 0X6992D0), который затирается хуком?
			  
			
			
  
Ты роешься в моих паках, но ты делаешь это без уважения...
			
				
(This post was last modified: 23.02.2012 14:23 by totkotoriy.)
 
			 
		 |  
	 
 | 
	| 23.02.2012 13:37 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				totkotoriy Wrote:Может ещё обясните как вычесляется адрес (например 0X6992D0), который затирается хуком? 
Эм, смотрится в дизассемблере, что находится по адресу, куда будет ставиться хук и дописывается в начало или конец кода хука.
			  
			
			
			
		 |  
	 
 | 
	| 23.02.2012 14:27 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				Кто-нибудь может дать описание всем полям из cranim.txt или хотя бы некоторым (кроме x-смещения прямоугольника с количеством существ, периода между проигрываниями анимации кривляния и периода анимации движения)? В принципе я и сам разберусь, но если кто это уже сделал, не хотелось бы зря тратить время.
			 
			
			
			
		 |  
	 
 | 
	| 04.03.2012 12:37 | 
	
		
	 | 
	
		
		totkotoriy 
 
 
		
		
		
			
			
			
 
 
			
Posts: 873 
	
		
	 | 
	
		
			
			 
			
				 (10.02.2012 18:26)MOP Wrote:  Уже несколько человек спрашивало… 
Code: 
 ; Обновить экран встречи героев 
!!UN:C6962576/4/?y1; [6A3D90h] - swapManager 
!!SN:E5957888/2/y1;
  
Не помню, но артефакты в слотах, вроде, обновляются отдельно. 
А может подскажите тогда ещё как обновлять отряды у героев в экране встречи? А то почему-то они таки не обновляются   ...
			  
			
			
  
Ты роешься в моих паках, но ты делаешь это без уважения...
			
				
(This post was last modified: 06.03.2012 23:54 by totkotoriy.)
 
			 
		 |  
	 
 | 
	| 06.03.2012 23:51 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				Раз никто не знает насчёт cranim.txt, вот я разобрал структуру, к которой это сводится в игре: 
// Структура боевой анимации существа. Заполняется из cranim.txt. 
struct struct_CreatureAnim 
{     short X_UpRight_Bullet_Shift_word10; // Смещение снаряда по X при стрельбе вправо-вверх     short Y_UpRight_Bullet_Shift_word12; // Смещение снаряда по Y при стрельбе вправо-вверх     short X_Right_Bullet_Shift_word14; // Смещение снаряда по X при стрельбе вправо     short Y_Right_Bullet_Shift_word16; // Смещение снаряда по Y при стрельбе вправо     short X_DownRight_Bullet_Shift_word18; // Смещение снаряда по X при стрельбе вправо-вниз     short Y_DownRight_Bullet_Shift_word1A; // Смещение снаряда по Y при стрельбе вправо-вниз     float BulletDefFramesAngles_adword1C[12]; // Угол отклонения снаряда от горизонтали для каждого кадра def`а (от -90.0 до 90.0)     int X_CountShowingRect_Shift_dword3C; // Смещение изображения прямоугольника с отображаемым количеством существ по горизонтали в пикселях     int DistanceAttackAnim_ClimaxFrame_dword40; // Число кадров, исходя из которого рассчитывается период каждого кадра анимации дистанционного действия (если <= 0, то берётся реальное число кадров)     int RandomAnim_WaitTime_dword44; // Время между проигрываниями случайной анимации     int MovingAnim_Time_dword48; // Время проигрывания анимации движения     _DWORD DistanceActionAnim_Time_dword4C; // Общее время анимации дистанционного действия (выстрела или колдовства)     _DWORD FlightAnim_FrameDistance_dword50; // Расстояние, на которое перемещается существо за кадр при полёте 
};  
Такие структуры хранятся для каждого существа по адресу, записанному в 0x67FF74, а так же входят в структуру стеков в бою по смещению 110h.
			  
			
			
			
				
(This post was last modified: 29.03.2012 15:45 by Sav.)
 
			 
		 |  
	 
 | 
	| 09.03.2012 21:29 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 09.03.2012 21:30 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 20.03.2012 15:13 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 20.03.2012 15:21 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				Структура стрелковой башни в бою. 
// Структура стрелковой башни в бою. 
struct struct_BattleTower 
{     int CreatureType_dword0; // Тип существа башни     void *Def_dword4; // Загруженный def существа башни     void *BulletDef_dword8; // Загруженный def снаряда башни     int X_Pos_dwordC; // Позиция изображения существа башни по горизонтали в пикселях     int Y_Pos_dword10; // Позиция изображения существа башни по вертикали в пикселях     int Orientation_dword14; // Направление (0 - вправо, 1 - влево)     int AnimSectionNum_dword18; // Номер секции кадров анимации башни     int AnimFrameNum_dword1C; // Текущий кадр секции анимации башни     int StackNum_dword20; // Номер стека башни (сторона-владелец - всегда 1) 
}; 
Хранится в виде 3-элементного массива структур в структуре BattleMgr (*(0x699420)) по смещению 81272. Индекс башни в массиве определяется dword`ом по +38h в структуре её стека (для остальных стеков это поле - позиция на поле боя). 254 - индекс 0, 251 - индекс 1, 255 - индекс 2.
			  
			
			
			
		 |  
	 
 | 
	| 20.03.2012 16:24 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 20.03.2012 16:30 | 
	
		
	 |