27th
Авг

Искусство изменеия GTA

Posted by Chas under Журнал, Статьи

аватар

Здравствуйте, любители гейминга. В данной статье, я хочу показать, как делаются плагины для всем известной GTA. Начнем мы самого простого – это программирование плагинов на Delphi для Grand theft Auto ViceCity. А поняв принцип их работы, никакого труда не составит написать плагин и для других серий GTA…

Виталий Иванов
by VintProg vintprog@gmail.com

Пишем простой плагин для GTA – VC*

Итак, Для работы нам понадобится следующее:

  1. IDE среда Delphi [1]
  2. знание языка
  3. утилита ArtMoney** [2]

И немного теории, что же такое плагины. Плагины – это те же динамические подключаемые библиотеки DLL. Однако часто бывает, что им изменяют расширение.

Возможно, вы спросите: «…как же это работает все?», А работает оно следующим образом… При запуске <gta-sa.exe> загружаются комплектные библиотеки от разработчиков. В одной из этихDLL, в частности – vorbisFile.dll имеется функция загрузки библиотек *.asi, И пожелавшие остаться неизвестными, программисты написали <cleo.asi> и набили ее весьма и весьма полезными функциями, такими как: новые опкоды, загрузка плагинов *.cleo и.т.п. Когда загрузилась библиотека <cleo.asi>, ее код выполняет нужные функции в памяти игры.

* Комментарий автора.
Вы наверняка встречали Cleo на GTA-SA,и видели, что там существует такая библиотека cleo.asi, Так вот она и загружает из папки Cleo – скрипты и сами плагины .cleo.

Именно благодаря этому и появляются новые возможности в игре. А что касается GTA Vice City, то в ней тот же процесс, только библиотеки *.asi загружаются из библиотеки <Mss32.dll>. Отсюда понятно, что для того чтобы писать плагины – необходимо хорошо уметь работать с памятью игры и знать что за значения находятся в игровой памяти в определенном адресе.

** Комментарий редакции.
ArtMoney – программа, предназначенная для редактирования параметров в кмпьютерных играх, для получения бесконечных денег, жизней, патронов и т.п. Она умеет сканировать память или файлы игры для поиска каких-то определенных значений (деньги, ресурсы). Официальный сайт www.artmoney.ru

рисунок

Приступим… Для начала запустим Borland Delphi, после чего кликаем на «File -> New -> other… » и перед нами откроется вот такое окно (см. рисунок 2):

рисунок 2

Рис. 2. Выбор DLL Wizard

Далее выделяем DLL Wizard и жмем OK. Сразу возьмем и сохраним наш проект «File->Save Project As» и под именем ShowMessage, чтобы получилось как показано на рисунке 3:


рисунок 3

Рис. 3. Заготовка плагина

Также можно удалить дерективу {$R *.res} , потому-что для данного плагина мы не будем использовать ресурсы. Из дополнительных модулей оставим лишь – Windows, а остальные удалим. Теперь напишем следующий код:

код:

library ShowMessage;

uses
    Windows;

var HWND : THandle;
begin
     // Получить хендл окна GTA: Vice City
     HWND := FindWindow(nil,’GTA: Vice City’);
     if HWND <> 0 then // Проверка если окно GTA: Vice City
         // существует, то тогда выполнить MessageBox
         MessageBoxA(HWND,’Плагин загружен’,'Сообщение’,0)
end.

И скомпилируем его. Прокомментирую работу данного кода… Когда библиотека загружается, между Begin end начинает выполнятся код, Тут сразу появляется окошко с сообщением. Чтобы это заработало, переименуйте расширение *.DLL на *.ASI или воспользуйтесь директивой {$E.ASI}. После чего, скопируйте библиотеку в каталог GTA и запустите игру GTA-VC.exe, Далее мы увидим окошко, когда загрузится <mss32.dll>. Поздравляю, вы написали свой первый плагин для GTA***!

Пишем простой плагин-трейнер для GTA – VC

Настала пора сделать что-то полезное. Итак, сперва подумаем, что нам еще нужно? А нужно нам сделать плагин-трейнер. Для чего он предназначен? К примеру, мы можем сделать так, чтобы при нажатии определенной кнопки в игре – появлялось окно, в котором можно прибавить деньги игроку. Для этого, запускаем Gta-VC, сворачиваем ее и запускаем ArtMoney. В этой утилите выбираем «Искать -> Объект -> Процесс» и в выпадающем списке, где написано «Выбери процесс», выберем нашу GTA Vice City (см. рисунок 4). Теперь зайдем в GTA-VC и соберем небольшое количество денежных средств (к примеру, как я набрал $18). Судя по представлению «денег» в игре, видно, что они целого числа и можно набрать их в игре большое количество. Отсюда, мы уже знаем тип представления данных «денег».

Это 4-байтные целые числа, которые нам и нужно отыскать (см. рисунок 5).

рисунок 4

Рис. 4. Выбор GTA-VC в ArtMoney

Обратите внимание! Вам необходимо повторить те же действия, как показано на рисунке, только у вас будет свое число. По завершению поиска у вас появится длиннющий список адресов (см. рисунок 6). Но не переживайте по этому поводу. Ведь адрес «денег» мы будем искать более легким методом, На то она и ArtMoney. Следующий шаг будет таков: снова заходим в GTA и либо тратим, либо добавляем деньги к игроку Tommy, запоминаем измененное количество «денег» и сворачиваем GTA. Вписываем новое значение (см. рисунок 7):

*** Комментарий автора.
Если что то не получается то пример расположен в каталоге “Examples\Plugin1”.


рисунок 5

Рис. 5. Поиск значений по заданному типу данных

рисунок 6

Рис. 6. Выборка адресов в ArtMoney


рисунок 7

Рис. 7. Повторный поиск значений по заданному типу данных

Теперь нажимаем «отсеять». Как видите, длина списка адресов значительно уменьшится. И так продолжаем до тех пор, пока не останется один адрес. Если-же все равно остается насколько адресов, то меняем в них значения и проверяем изменилось-ли количество «денег» в GTA (см. рисунок 8). Если все нормально, то нормально. Однако, еще осталось сделать одну проверку на указатель. ArtMoney не закрываем, так все и оставляем. Вырубаем GTA-VC и заново запускаем GTA-VC. В ArtMoney, в выпадающем списке, где написано «Выбери процесс», заново выбираем GTA и повторим операции по изменению значений по адресу местонахождения «денег». Если все работает нормально, то записываем этот адрес в текстовой блокнот и вырубаем GTAVC и выключаем ArtMoney. Теперь он нам не понадобится.

Итак, первый шаг сделан. Мы нашли адрес «денег» и остается лишь написать плагин.

Распишем особенность работы плагина, то есть то – как он будет работать: так, при нажатии кнопки <M> добавляется 1000 долларов, а значит нам нужен обработчик нажатия кнопки. Воспользуемся таймером. Теперь, точно так же как и в первом примере, созадим новый проект DLL и назовем его «MoneyAdds». И напишем следующий код:

**** Комментарий автора.
Хочу напомнить, что не на всех версиях GTA-VC могут быть одинаковые адреса. Так что имейте это ввиду, при написании плагинов.

код:

library MoneyAdds;

{ GTA-VC 1.1 Плагин для добовления денег }

uses Windows;

type // определяем свой тип (указатель целых чисел)
     P_Integer = ^Integer;
var
     GTA_VC_Handle : THandle;
     CurrentMoney : Integer;
     keyUp : boolean;

const // тут твой найденный адрес «денег»
     Address_Money = $0094ADD0;

{$E .asi}

//—- Эта процедура будет вызываться таймером —
procedure Timer_begin;
begin
     // Нажатие и отпуск «M»
     if not GetKeyState($4D) < 0 then keyUp := true;
     if (GetKeyState($4D) < 0) and (keyUp = true) then
     begin
         // Читаем деньги из GTA-VC и присваиваем в CurrentMoney
         CurrentMoney := P_Integer(Address_Money)^;
         // Записываем 1000 + текущие деньги
         P_Integer(Address_Money)^ := CurrentMoney + 1000;
         keyUp := false;
     end
end;

//———————————————————–
begin
     GTA_VC_Handle := FindWindow(nil,’GTA: Vice City’);
     if GTA_VC_Handle <> 0 then
     begin
         SetTimer(GTA_VC_Handle,0,25,@Timer_begin);
     end;
end.

Исходный код этого плагина находится в «Examples\Trainer1» [3]. Вот мы и реализовали плагин-трейнер добавления «денег» по нажатию клавиши «M», Только скажу – не выгодно на каждый плагин делать один таймер, Поэтому имейте ввиду, что таймер нагружает процессор. Для решений данной проблемы можно воспользоваться функциями DirectX для обработки нажатий клавиатуры.

Пишем свой собственный менеджер-загрузчик плагинов

Вы наверняка заметили одну вещь: когда создаешь новый плагин, его приходиться бросать рядом с GTA-VC.exe, А представьте себе, если таких плагинов будет больше десятка? Это не наш метод, поэтому мы напишем свой загрузчик плагинов из отдельно созданного каталога под наши плагины, скажем <bin>. И пускай там будет их хоть 1000!

Итак, запускаем среду Delphi и по аналогии создадим проект DLL-ки. Внутри напишем следующий код:

код:

library LoaderVc;

{ Даная библиотека нужна для загрузки плагинов в GTA-VC }

{$E .ASI}

uses SysUtils, Windows;

var
     SearchRec : TSearchRec;
     filename : pAnsiChar;
const
     dir_bin = ‘Bin\*.bin’;
     dir_dll = ‘Bin\*.dll’;

//— Процедура отыскивает все плагины из папки Bin и
// подгружает их —
procedure Load_libs(FilesName : string);
begin
     if FindFirst(FilesName, faAnyFile, SearchRec) = 0 then
     repeat
         filename := pAnsiChar(‘Bin\’ + SearchRec.name);
         LoadLibrary(filename);
     until FindNext(SearchRec) <> 0;
end;

//————————————————————
begin
     Load_libs(dir_dll);
     Load_libs(dir_bin);
end.

Исходный код этого менеджера-загрузчика находится в «Examples\Loader_VC» [3].

Заключение

Вот теперь готов загрузчик плагинов bin и dll, Теперь достаточно бросить его в корневую папку GTA, создать там каталог <BIN> со всеми нашими плагинами, запустить игру и полюбоваться результатом наших трудов.

Рассматриваемые в данной статье исходники плагина добавления «денег», плагина-трейнера и менеджера-загрузчика полностью приведены в виде ресурсов в теме «Журнал клуба программистов. Пятый выпуск» или непосредственно в архиве с журналом.

Продолжение смотрите в следующем выпуске нашего журнала…

Ресурсы

Статья из пятого выпуска журнала «ПРОграммист».
Скачать этот номер можно по ссылке.
Ознакомиться со всеми номерами журнала.

Обсудить на форуме – Искусство изменеия GTA

Похожие статьи

Теги: |