Игры

Пишем простой ASI плагин для GTA San Andreas

Сразу предупреждаю будет сложно, но не все так страшно, как кажется.
Давайте напишем простой плагин, функцией которого будет: по нажатию клавиши, даем нашему игроку кучу баксов, для богатой и счастливой жизни! <!--smile:smile-->smile<!--/smile-->
Статья для новичков, опытным кодерам она будет бесполезна.

Ближе к делу! Для начала скачайте интегрированную среду для разработки, а простыми словами - программу, в которой программисты творят свои чудеса. Я выбрал бесплатную и довольно удобную, а самое главное простую - Dev C++ 5.11.
Скачать ее можно здесь
Вы можете выбрать, что угодно, например Code Blocks, или Visual Studio C++, дело вкуса, рекомендую Code Blocks.


Заранее предупреждаю, если вы не смогли установить себе данную программу, или скачать, то дальше вам не стоит читать эту статью.

Запускаем программу, щелкаем в меню - создать ---> проект и выбираем DLL.
Пишем простой ASI плагин


Сохраняем наш проект в любую, заранее созданную папку, под именем AsiPlugin.
Перед нами открывается исходный код проекта, ничего не трогаем, все что вам сейчас нужно - это функция под названием DllMain.
Пишем простой ASI плагин


Что такое DllMain? Это функция, которая может быть вызвана игрой при запуске и соответственно, все, что вы задумали выполнится в этом участке кода. Для нашего маленького эксперимента нам понадобится следующий участок кода:


case DLL_PROCESS_ATTACH:
{
	// сюда мы запишем наше действие и оно выполнится.
	break;
}



Что нам нужно для того чтобы пополнить счет игрока? Правильно, сначала узнать когда мы нажали на клавишу!
Я дам вам шаблон данной функции и им можно будет пользоваться в дальнейшем.


void OnTimer(HWND hwnd,   UINT msg, UINT idTimer, DWORD dwTime)
{
   if (GetAsyncKeyState(0x47) & 0x8000) // если нажали на G, 0x47 - код клавиши
   {
	   // то тут выполняем наш код
   }	
}


Коды для клавиатуры можно найти здесь.
Данный участок кода, постоянно будет повторяться и каждый раз будет проверяться состояние клавиши G.

Далее самое сложное. Нам нужен адрес переменной, которая хранит в себе количество денег игрока. При помощи этого адреса мы считаем деньги в нашу переменную и запишем новую сумму.
Заходим сюда (здесь вы найдете основные адреса перменных игры)

Видим наш адрес: 0xB7CE50 - [dword] Деньги.
Как этим пользоваться спросите вы? Объясняю!

Что-бы прочитать количество денег в переменную, вам нужно объявить переменную и проделать следующий фокус с указателем на этот адрес:

DWORD Many = *(DWORD*)0xB7CE50; // получаем деньги.
*(DWORD*)0xB7CE50 = 1000000; // даем денег игроку

В итоге получим следующий код:

	   
DWORD Many = *(DWORD*)0xB7CE50; // сколько денег у игрока?
if(Many<99999999) //  если меньше 99999999
{
       *(DWORD*)0xB7CE50 = 99999999; // то берем себе кругленькую сумму
}



Далее нам необходимо запустить таймер, который будет выполнять нашу функцию и каждый раз спрашивать: нажали ли мы клавишу?
Делается это так - SetTimer(0, 0, 200, (TIMERPROC)OnTimer); // 200 интервал в миллисекундах

В итоге получим следующий код:


void OnTimer(HWND hwnd,   UINT msg, UINT idTimer, DWORD dwTime)
{
   if (GetAsyncKeyState(0x47) & 0x8000) // если нажали G
   {
     DWORD Many = *(DWORD*)0xB7CE50; // получаем количетсво денег
     if(Many<99999999) // если денег меньше 99999999
     {
	 *(DWORD*)0xB7CE50 = 99999999; // то забираем себе кучу баксов	
     }
   }	
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
	
switch(fdwReason)
{
	case DLL_PROCESS_ATTACH:
	{
	   SetTimer(0, 0, 200, (TIMERPROC)OnTimer); // запускаем наш таймер
		break;
	}
	case DLL_PROCESS_DETACH:
	{
	      break;
	}
	case DLL_THREAD_ATTACH:
	{
		break;
	}
	case DLL_THREAD_DETACH:
	{
		break;
	}
}
	
   return TRUE;
}


Теперь нам осталось скомпилировать нашу программу и попробовать ее в игре. Сразу хочу обратить внимание. Выберите 32 битный компилятор в Dev C++, иначе наш плагин работать не будет.
Смотрите картинку, как это сделать и что нажать для компиляции.
Пишем простой ASI плагин


Получилось без ошибок? Если да, то идем в папку с нашим проектом и находим файл DLL, который у нас получился. Переименовываем расширение в ASI и кидаем в папку с игрой. Важно! Не забудьте установить AsiLoader, или CLEO 4.
Вот и все. Запускайте игру и жмите G. Все работает? Молодцы, поздравляю!
Спросите что дальше? Отвечу: изучайте программирование, быть может из вас получится гуру моддинга, а может быть и круче. <!--smile:smile-->smile<!--/smile-->
Тем у кого не получилось, дарю плагин AsiPlugin.rar и исходник проекта lesson.rar.

Полезные ссылки:
Книги по программированию можно скачать здесь.
Адреса и функции Gta San Andreas, там же можно найти базу для IDA, в которой много чего интересного. Как пользоваться IDA боюсь, нужна отдельная статья.


Спасибо за внимание, надеюсь статья понравилась! Всем удачи!
p.s: Если статья вызовет интерес, то в следующей статье научу пользоваться функциями GTA и к примеру спавнить машины.

Статья эксклюзивна для сайта Gamemodding.net, при копировании материала необходимо указать ссылку на сайт.
391
7
31
Нравится:  31
smalloff
smalloff

Опубликовано 13 мая 2016

В избранное
Поделиться
Поделиться:

Комментарии (7)

Информация
Для того, чтобы оставлять комментарии к данной публикации необходимо зарегистрироваться .

Правила сайта и политика конфиденциальности

© 2012-2024 GameModding.com Все права защищены.