Все игры
Загрузка...
Календарь
    Декабрь 2016    →
ПнВтСрЧтПтСбВс
 1234
567891011
12131415161718
19202122232425
262728293031 
Лучшие пользователи
У вас есть игровая приставка?

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

13 мая 2016
Сразу предупреждаю будет сложно, но не все так страшно, как кажется.
Давайте напишем простой плагин, функцией которого будет: по нажатию клавиши, даем нашему игроку кучу баксов, для богатой и счастливой жизни! 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
Тем у кого не получилось, дарю плагин AsiPlugin.rar и исходник проекта lesson.rar.

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


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

Статья эксклюзивна для сайта Gamemodding.net, при копировании материала необходимо указать ссылку на сайт.
Опубликовал: smalloff Скачиваний: 30 Комментарии: 7
- +26 +
Похожие моды
  • Mod Loader  v0.2.4

    Mod Loader v0.2.4

    ASI плагин для Grand Theft Auto San Andreas, который существенно упрощает установку любых...

  • Мыть пол

    Мыть пол

    Теперь в доме Джонсонов (Первый дом CJ'я) можно будет вымыть пол! Для этого вам необходимо взять...

  • Пишем скрипт для смены скина игрока...

    Продолжение серии статей по CLEO скриптингу для начинающих. В этой статье вы научитесь менять скин...

  • Пишем свой первый CLEO скрипт

    Эта статья предназначена для тех, кто хочет освоить программирование под библиотеку CLEO в GTA San...

Комментарии
  • gamemoddersamp
    gamemoddersamp Оффлайн
     Пользователь 14
    - +2 +
    Спасибо,cделал свой первый ASI Скрипт...
    8 июня 2016 09:09
  • ABCTPNETZ_4rus
    ABCTPNETZ_4rus Оффлайн
     Пользователь 21
    - -4 +
    как вы тупо всё обьясняете
    11 июня 2016 16:38
  • smalloff
    smalloff Оффлайн
     Модератор Журналист Модмейкер 23904
    - +1 +
    ABCTPNETZ_4rus, Можешь лучше? Пожалуйста. Пиши и отправляй в модерацию. winked
    з.ы. хотелось бы подробнее узнать в чем тупость, дабы исправиться. Давно зарегестрирован на сайте, грамотен и желаешь помочь проекту? Умеешь публиковать моды и у тебя уже есть публикации на сайте?
    Хочешь стать модератором? Пиши, помогу.
    14 июня 2016 12:05
    ответ на комментарий ABCTPNETZ_4rus
  • xXxVAMPIR4IKxXx
    xXxVAMPIR4IKxXx Оффлайн
     Пользователь 269
    - +2 +
    вроде всё понятно, но вот я не понял откуда ты взял вот эту функцию void OnTimer(HWND hwnd, UINT msg, UINT idTimer, DWORD dwTime)
    24 июля 2016 15:01
  • Pobeda1945
    Pobeda1945 Оффлайн
     Пользователь 466 7-е место
    - 0 +
    Хорошая статья полезная
    24 июля 2016 15:17
  • smalloff
    smalloff Оффлайн
     Модератор Журналист Модмейкер 23904
    - 0 +
    xXxVAMPIR4IKxXx, Это функция обратного вызова для таймера WinApi, их еще называют callback (обратный вызов).
    А если простыми словами - стандартная виндовая функция, которая используется для связи с приложением через таймер. т.е. когда ты создаешь таймер, ты указываешь какую функцию тебе нужно вызвать в момент прохождения цикла времени. Таймер каждый раз вызывает эту функцию, в нашем случае по истечении 200 миллисекунд и соответственно срабатывает проверка на нажатие клавиши.
    Подробнее о том как устроен таймер читай здесь
    . Давно зарегестрирован на сайте, грамотен и желаешь помочь проекту? Умеешь публиковать моды и у тебя уже есть публикации на сайте?
    Хочешь стать модератором? Пиши, помогу.
    25 июля 2016 09:33
    ответ на комментарий xXxVAMPIR4IKxXx
  • xXxVAMPIR4IKxXx
    xXxVAMPIR4IKxXx Оффлайн
     Пользователь 269
    - 0 +
    Спасибо теперь всё понятно
    25 июля 2016 15:16
    Информация

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