Вся игра состоит на самом деле из функций и процедур а также методов различных классов, о которых мы поговорим позднее. Данный урок покажет как написать правильно код, для того что-бы вызывать какую-то функцию и что для этого вам нужно будет. Для этого нам как обычно понадобиться база GTA Vice City для IDA pro что-бы, находить там функции игры, а затем их вызывать. Все доступные функции можно найти в этом списке:

Обратите внимание на то, что есть как функции с именами sub так и есть с нормальными номерами. Изначально когда игру открыли программой IDA pro, то получили на самом деле все функции с названием sub и прочие участки. Дело в том что игра была написана на C++ и после компиляции, были утеряны все названия функций, классов, переменных, а знаете почему? Да потому-что они в процессорных командах вообще не нужны, игра будет исполнится не на именных функциях и во все. Единственно вы будете находить, строки которые оставили разработчики, например различные параметры, названия для отладки и прочее такое. Ну так вообщем имена всяких функций, классов, переменных, в языках высокого уровня, являться лишь, абстрактной вещью, это сделано лишь для человека, что-бы тот смог, строить программную логику в удобном виде. Конечно же человеку, размышлять легче в словах, чем в процессорных командах, по этому вам придется еще познакомиться с ассемблером по глубже. Ладно это была краткая теория, сейчас приступим к нашему примеру, для этого мы возьмем функцию спавна транспорта и вывозим ее, через свой плагин. Вот она как выглядит:

Что-бы быстро перейти к этой функции в базе, как я уже говорил ранее нажмите клавишу G, и затем вбейте адрес 004AE8F0 который я пометил на скрине, а это и есть адрес нашей функции в памяти. Так посмотрели, что к чему теперь можно приступать к разработке кода:
#include "stdafx.h"
//Объявляем прототип спавна
auto _spawnCarAtPlayerLocation = (void (__cdecl*)(signed int modelIndex))0x04AE8F0;
//Для клавиши
bool isPress = false;
//Код обработки нажатия M
void Update() {
if (!GetKeyState(0x4D) > 0 )
isPress = false;
if ( (GetKeyState(0x4D) > 0 ) && (isPress == false) )
{
isPress = true;
_spawnCarAtPlayerLocation(162);
}
};
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//Тут установим таймер
SetTimer(0,0, 16, (TIMERPROC)Update);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Теперь разберем самый интересный момент, это наш прототип функции, как же он работает?
auto _spawnCarAtPlayerLocation = (void (__cdecl*)(signed int modelIndex))0x04AE8F0;
Все на самом то деле, просто сперва объявляем auto – это автоматический позволяет привести тип, переменной, он значительно сокращает на код. Далее открывается первая скобка мы пишем void это подобно тому как мы объявляем процедуру в C++, если это функция, которая возвращает параметр, то там мы пишем результат. Дальше метод передачи параметров, в нашем случае это – (__cdecl*), также надо учитывать его соответственно, иначе мы в своих разработках, можем все вызывать ошибочно имейте это введу. Далее еще открываться скобка, в ней мы прописываем наши передаваемые параметры, все точно также как мы объявляем обычную функцию, ну и затем закрываем. Теперь закрывается первая скобка, ну и рядом пишется наш адрес. Таким образом вы просто объявили прототип, якобы эта функция у нас находиться по адресу, теперь мы можем ее вызывать где нам захочется. Если мы сделали все правильно, то зайдя в игру, мы сможем накидать танки на букву “M” :

Да-да, конечно же танка, мы передаем этой функции _spawnCarAtPlayerLocation параметр ID 162, а это и есть танк. Таким образом вы сможете делать spawn любых транспортных средств в игре, даже вертолеты и лодки. Конечно это уже можно назвать читерство, но не забывайте что мы просто это пробовали ради примера. Таким образом вы сможете объявлять теперь прототипы, на любые вам известные функции и процедуры в базе, а затем их вызывать.
Скачать пример вызова функций [21,98 Kb] (cкачиваний: 70)Рекомендация:Тренируйтесь, на различных функциях, которые есть уже в базе, лишь таким образом только вы хорошо освоите этот материал.