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: 16657
|
|
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: 16657
|
|
09.03.2012 21:30 |
|
Berserker
Posts: 16657
|
|
20.03.2012 15:13 |
|
Berserker
Posts: 16657
|
|
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: 16657
|
|
20.03.2012 16:30 |
|