Опрос на сайте
Оцените дизайн сайта

Популярные новости

Magic - TXD Builder 0.9.1

Magic - TXD Builder 0.9.1
Полезная программа для сборки TXD файлов, которая важные параметры, такие как mip map, DXT сжатие... Кроме того, программа

[CLEO]CarRec(plus ObjRec)

[CLEO]CarRec(plus ObjRec)
"CarRec" дает вам возможность записывать движения автомобиля в файл ".cr" для воспроизведения их позднее в ваших скриптах и

Main Menu Scene

Main Menu Scene
"Main Menu Scene" дает вам возможность создавать собственные сцены в "Главном Меню" игры с кастомными картой и скриптом, при

Vertex Alpha в Vice City

Vertex Alpha в Vice City
То, что некогда было доступно лишь в GTA: San Andreas и выше: Vertex Alpha, а потенциально - и физический бленд текстур в

Rollerskates Mod

Rollerskates Mod
Модификация позволяет кататься на роликах, прямо как пляжные девушки.

04 ноябрь 2014

Вывод на экран TXD GTA


После того как мы научились в предыдущих статьях по программированию хорошо работать с памятью игры, то можно уже приступить к практической части. В этом уроке мы будем выводить свою собственную текстуру txd gta, на экран через свой asi плагин. Для того что-бы начать что-то рисовать на экране, вспомним что в каждой игре существует своя функция рендера, где и вызывается отрисовка и затем очистка спрайтов. Также и тут, нам просто необходимо сделать следующие шаги:

  1. 1. Заняться реверсивной инженерией – (но в данном уроке, мы не затроним эту часть)
  2. 2. Переписать не сколько структур
  3. 3. Как минимум объявить прототипы, функций txd
  4. 4. Сделать замену функции – для того что-бы захватиться за рендер


Объявляем структуры и также заголовочный файл .h


Структуры на самом деле с пакета Render Ware, но не совсем оригинальные я пока что сделал это в простом ввиде:

#pragma once
#pragma pack (push, 1)

//Пока объявим такие структуры:
struct RwRGBA {
char red;
char green;
char blue;
char alpha;
};

struct RwRect{
float X1;
float Y1;
float X2;
float Y2;
};

#pragma pack (pop)


Заголовочный файл вы можете назвать также structsVC.h. Пока этих структур для вывода txd gta на экран, на хватит вполне, но по хорошему если заниматься реверсивной инженерией, то у этих RW-ашных структур есть свои обвертки, но пока мы не будем на этом более подробно заморачиватся, так как это уже совсем отдельный разговор и требует своих навыков. После того как мы объявили сам заголовочный файл, то можно приступать уже к самому коддингу cpp файла, ниже я приведу уже готовый код, но далее мы поговорим об подробностях, как оно все работает:

#include "stdafx.h"
#include "structsVC.h"

//Объявляем пустой прототип класса CTexture
class CTexture;

////Вспомогательная функция для замены
void injectFunction (DWORD address, DWORD function) {
DWORD _old;
VirtualProtect((LPVOID)address,4, PAGE_READWRITE, &_old);
BYTE * patch = (BYTE *)address;
*patch = 0xE9; // JMP
*(DWORD *)(patch+1) = (function-(address+5));
VirtualProtect((LPVOID)address,4, _old, &_old);
}

//Объявляем прототип CTexture
auto CTexture__draw = (void (__thiscall*)(CTexture *, RwRect *posInfo, RwRGBA *v1_color))0x00578710;

//Также другие функции
auto _txdAdd = (int (__cdecl*)(char *name) )0x0580F00;
auto _txdLoad = (int (__cdecl*)(int a, char *Pathname) )0x0580CD0;
auto _txdAddRef = (int (__cdecl*)(int a) )0x0580A60;
auto txdIndexByName = (int (__cdecl*)(char *name) )0x0580D70;
auto _txdSetCurrent = (int (__cdecl*)(int index) )0x0580AD0;
auto RwReadTexture = ( CTexture * (__cdecl*)(char *name, int a2) )0x064E110;

//Здесь объявим строки
char tex_name[] = "gtavicecity";
char txd_name[] = "gtavc";
char path_txd[] = "MODELS/GTAVC.TXD";

//Объявим тут данные
RwRect Rect;
RwRGBA vcol_1;

//Отрисовка
void drawTexture() {

_txdSetCurrent(txdIndexByName(txd_name));
CTexture * tex = RwReadTexture(tex_name, 0);

//Тут мы про инициализируем цвета и положение
vcol_1.alpha = 255;
vcol_1.blue = 255;
vcol_1.green = 255;
vcol_1.red = 255;

Rect.X1 = 0.0;
Rect.Y2 = 0.0;
Rect.X2 = 256.0;
Rect.Y1 = 256.0;

//Вот сама отрисовка текстуры
CTexture__draw(tex, &Rect, &vcol_1);
};

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
//Имя самого файла txd
int ref = _txdAdd(txd_name);

//Путь по которому будем загружать txd
_txdLoad(ref, path_txd);
_txdAddRef(ref);

//Заменяем функцию на нашу
injectFunction(0x043E490, (DWORD)drawTexture);
}break;

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}


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

void injectFunction (DWORD address, DWORD function)


– мы о ней уже ранее говорили в этой статье, это лишь то что помогает подменить функции в игре на свою, обычным прыжком, тут все понятно двигаем дальше.
Объявление прототипов и переменных

Тут же мы объявили все нам нужные прототипы функций из базы Alien:

//Объявляем прототип CTexture
auto CTexture__draw = (void (__thiscall*)(CTexture *, RwRect *posInfo, RwRGBA *v1_color))0x00578710;

//Также другие функции
auto _txdAdd = (int (__cdecl*)(char *name) )0x0580F00;
auto _txdLoad = (int (__cdecl*)(int a, char *Pathname) )0x0580CD0;
auto _txdAddRef = (int (__cdecl*)(int a) )0x0580A60;
auto txdIndexByName = (int (__cdecl*)(char *name) )0x0580D70;
auto _txdSetCurrent = (int (__cdecl*)(int index) )0x0580AD0;
auto RwReadTexture = ( CTexture * (__cdecl*)(char *name, int a2) )0x064E110;


Если вы хотите рассмотреть более подробно как они работают, то тогда идите в базу и переходите по адресам на кнопку G, рассматривая как и где они раньше использовались и как вызывались. Пока мы эту часть также глубоко не будет рассматривать, так как урок может длиться долго.


//Здесь объявим строки
char tex_name[] = "gtavicecity";
char txd_name[] = "gtavc";
char path_txd[] = "MODELS/GTAVC.TXD";

//Объявим тут данные
RwRect Rect;
RwRGBA vcol_1;



Это уже наши переменные, с названиями самого файла txd, имени текстуры и путь MODELS/GTAVC.TXD в эту директорию мы для примера поместим нашу готовую текстуру с эмблемой “grand theft auto vice city” скачать ее можно будет с примером ниже.
Инициализация и отрисовка txd

Начнем сперва с инициализации, обратим внимание на этот код:

 case DLL_PROCESS_ATTACH:
{
//Имя самого файла txd
int ref = _txdAdd(txd_name);

//Путь по которому будем загружать txd
_txdLoad(ref, path_txd);
_txdAddRef(ref);

//Заменяем функцию на нашу
injectFunction(0x043E490, (DWORD)drawTexture);
}break;


Изначально, вы выполняем наши функции прототипов, добавляя сам txd файл и при этом указывая путь к нему, все также делается как было в процессе самой оригинальной игры. Далее подменяем эту функцию 0x043E490 на нашу drawTexture(). По адресу 0x043E490, находилась совсем пустая функция, я решил за нее зацепиться прикол, в том что она также вызывается в отрисовке игры, где отрисовывается сам игровой hud. Процесс Тамйера в любом случае не прокатил бы, а вот за такие вещи для отрисовок самый раз нужно хвататься в идеальном варианте. Но имейте введу, что если будут два плагина пытаться заменять свои функции в этом участке, то будет работать последний плагин, а не первый который обратиться, обычно для таких целей разрабатывают какой нибудь плагин менеджер со своим SDK, что-бы плагины не мешали друг-другу.

//Отрисовка
void drawTexture() {

_txdSetCurrent(txdIndexByName(txd_name));
CTexture * tex = RwReadTexture(tex_name, 0);

//Тут мы про инициализируем цвета и положение
vcol_1.alpha = 255;
vcol_1.blue = 255;
vcol_1.green = 255;
vcol_1.red = 255;

Rect.X1 = 0.0;
Rect.Y2 = 0.0;
Rect.X2 = 256.0;
Rect.Y1 = 256.0;

//Вот сама отрисовка текстуры
CTexture__draw(tex, &Rect, &vcol_1);
};



Ну и наконец сама отрисовка, текстуры txd gta, принцип тут просто, мы заполняем цвета отрисовки и координаты по принципу точки A(X1, Y2) и точки B(X2, Y1). После чего если было сделано все правильно то будет выглядит в игре так:

Вывод на экран TXD GTA


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

TXD_GTA.rar [51,64 Kb] (cкачиваний: 32)

Данный урок показал, что можно создавать достаточно отличные gta vice city моды, например можно сделать новый худ и просто то что позволит ваша фантазия. Это еще один урок, который показывает что asi плагины, способны сделать все что угодно с игрой.

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
4 августа 2015 23:40
Prographer написал:
Гости
Комментариев: 0 Новостей: 0
//Здесь объявим строки
char tex_name[] = "gtavicecity";
char txd_name[] = "gtavc";
char path_txd[] = "MODELS/GTAVC.TXD";

//Объявим тут данные
RwRect Rect;
RwRGBA vcol_1;

Я так понял, что не обязательно использовать char, а можно подключить <string.h> и использовать его?

(Цитировать)

4 августа 2015 23:42
SektorAdmin написал:
Администраторы
Комментариев: 9 Новостей: 93
Нет, именно char - функции принимают указатель на байт-строку.

(Цитировать)

Добавить свой комментарий

Полужирный Наклонный текст Подчёркнутый текст Зачёркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Вставка ссылкиВставка защищённой ссылки Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Другие материалы

Программирование спидометра для GTA на C++

Программирование спидометра для GTA на C++
Приветствую вас, дорогие модмейкеры в предыдущих уроке мы научились рисовать спидометр, но рисунки спидометра без

Вывод на экран GXT текста в GTA VC

Вывод на экран GXT текста в GTA VC
Настала пора поработать не много с текстами в GTA Vice City, а это значит что в этом уроке мы научимся выводить текст GXT,

Замена функций GTA Vice City на свою

Замена функций GTA Vice City на свою
После того как мы в предыдущих статьях, научились уже более менее хоть к чему-то. Теперь же мы перейдем к тому вопросу как

Вызов функций и процедур в GTA Vice City

Вызов функций и процедур в GTA Vice City
Вся игра состоит на самом деле из функций и процедур а также методов различных классов, о которых мы поговорим позднее.
Ads

Группа GTA Builder
Наши партнеры

GTA FreeRunning Story