Настала пора поработать не много с текстами в GTA Vice City, а это значит что в этом уроке мы научимся выводить текст GXT, стандартными функциями игры. Конечно это еще не все возможности, но мы пока рассмотрим самый простейший способ вывода текста, путем вызовов прототипов. Об этом способе вызова было написано ранее и прочитать урок можно тут это нужно читать тем, кто еще не знает что это за метод.
Теперь приступим к делу, и решим вопрос, исходя чего объявлять нам прототипы? Конечно долго углубляться в реверсивную инженерию не будем, так как это отдельный материал но рассмотрим уже найденный участок кода.
Открываем базу IDA для GTA Vice City и перейдем на адрес
004BBE90, для реализации нашей задачи,нам лишь нужно то что выделено красным прямоугольником на рисунке:
Как видно из куска кода, что тут задействованы 2 функции, включая одну из них метод класса CText, сперва идет вызов самого метода
CText__locate которая по названию таблицы GXT возвращает нужный нам текст, например из
american.gxt, но скорее всего он уже загружен в память а не просто идет прямое обращение к файлу. Что-бы знать как работают функции конкретно, их нужно отдельно разбирать, а это другой разговор. Тут же вторая функция под названием StyledText_0, в качестве первого параметра принимает саму строку и затем выполняет показ ее в экране игры. Вот теперь таким образом мы видим что можно объявить прототипы с нужными параметрами и затем ими воспользоватся в любой области кода, в нашем проекте. Ниже теперь рассмотрим непосредственно сам код плагина на C++:
#include "stdafx.h"
//Подхватим объект и получим на него указатель
class CText;
auto gText = (CText*)0x094B220;
//Объявляем прототип StyledText
auto _StyledText_0 = (void (__cdecl*)(wchar_t * gtaText, int time, __int16 style))0x0584050;
//Объявляем прототип метода класса CText *
auto CText__locate = (wchar_t *(__thiscall*)(CText *, char *entryName))0x0584F30;
//Для клавиши
bool isPressM = false;
bool isPressN = false;
//Код обработки
void Update() {
//Код нажатия M
if (!GetAsyncKeyState(0x4D) != 0 )
isPressM = true;
if ( (GetAsyncKeyState(0x4D) != 0 ) && (isPressM == true) ){
_StyledText_0(L"GTA SHOW TEXT", 3000, 3);
isPressM = false;
}
//Код нажатия N
if (!GetAsyncKeyState(0x4E) != 0 )
isPressN = true;
if ( (GetAsyncKeyState(0x4E) != 0 ) && (isPressN == true) ) {
isPressN = false;
_StyledText_0(CText__locate(gText, "BUSTED"), 3000, 4);
}
};
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;
}
Тут приведен пример, вызова функций на клавишу “N” из самой таблицы GXT, и не посредственно с обычным текстом на клавишу “M”. Принцип работы совсем прост:
Как обычно, что-бы вызывать метод, сперва мы должны получить указатель на сам объект:
auto gText = (CText*)0x094B220;
Этот материал мы проходили в предыдущих уроках, как хвататься за объект и.т.п.
Это сам прототип функции:
auto _StyledText_0 = (void (__cdecl*)(wchar_t * gtaText, int time, __int16 style))0x0584050;
Имеет первый параметр сам текст в кодировке UNICODE, второй параметр это время показа текста, а третий стиль самого текста, который был изначально сделан R*-ом.
auto CText__locate = (wchar_t *(__thiscall*)(CText *, char *entryName))0x0584F30;
Это уже у нас прототип метода класса CText, в качестве первого параметра, прототип принимает сам указатель на объект, об этом мы также говорили, а второй параметр это название gxt из таблиц.
void Update()...
Тут у нас совсем уже просто, это процедура обработчика, которая выполняется таймером. Имейте введу что для практического урока, таймер хорошо подходит в этих целях, а вот уже когда вы будете разрабатывать моды gta vice city, то вам рекомендовано обработку делать в самой процессе игры, туда внедряться. Еще один момент используются функция
GetAsyncKeyState для проверки нажатий клавиш, так вот опять таки в играх она совсем особо не подходит, гораздо лучше было бы использовать набор функций от самой игры или Direct Input, так как они работают во множество раз быстрей, а производительность в играх, это важный момент. Ну вот собственно и все, обычный практический урок мы закончили, а вам дорогие друзья приятного моддинга и как всегда вам исходник.
gtx_textDraw.rar [7,84 Kb] (cкачиваний: 72)Компилируйте и пробуйте.