Опрос на сайте
Какая серия GTA вам больше всего нравиться?

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

[CLEO]CarRec(plus ObjRec)

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

Magic - TXD Builder 0.9.1

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

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
Модификация позволяет кататься на роликах, прямо как пляжные девушки.

03 ноябрь 2014

Вызов методов класса в GTA Vice City


После того как мы разобрались в предыдущей статье, как вызывать функцию по адресу, теперь можно переходить к вызову методов класса. Принцип вызова метода почти такой же, но разница лишь в том, что надо еще передавать адрес самого объекта, к которому принадлежит метод. Для примера сделаем вызов нескольких методов CCamera (камеры) игры. Для начала как обычно откроем базу и затем перейдем по адресу 0046B863 используя как обычно кнопку “G” :

Вызов методов класса в GTA Vice City


Здесь я выделил адреса, которые нам нужны будут для объявлений прототипов, это для Camera__WidescreenOff 0046B863 и для CCamera__WidescreenOn 0046B875. Обратите внимания я также выделил еще ecx регистр внутри метода CCamera__WidescreenOff, это и есть то, что внутри идет обращение к полям самого объекта CCamera. Значит вывод какой? ECX – содержит указатель на сам объект и нам обязательно надо его знать адрес, иначе мы не сможем вызывать правильно метод и игра может завершиться ошибкой. Хорошо, не беда, для этого последуем по порядку действий и узнаем наконец адрес объекта, который содержится непосредственно в ecx. Сперва нам надо узнать откуда вызывается сам метод, для этого наведем курсор на его название “Camera__WidescreenOff” и затем нажмем кнопку X. Перед нами появится такое окошко со списком где вызывается наш метод:

Вызов методов класса в GTA Vice City


Кликнем левой кнопкой мыши из списка самый первый вызов и затем, попадем вот сюда:

Вызов методов класса в GTA Vice City


Теперь обратите внимание я выделил красным маркером наконец сам объект _camera. Почему это он? Да потому-что перед вызовом метода “Camera__WidescreenOff”, в ecx как раз и передается его адрес. Вот таким образом вы всегда можете отличить методы от функций и также заглянув во внутрь самого метода, удостоверяясь что действительно он обращаться сразу же к ecx как чтением или записью. Далее просто кликнем левой кнопкой мышью по _camera и мы попадем теперь вот сюда:

Вызов методов класса в GTA Vice City


Ну вот наконец-то! Мы нашли адрес самого объекта я его выделил красным маркером, вот он 007E4688. Ну что дорогие любители моддинга, данные мы все собрали которые были нам нужны, ну а теперь переходим к написанию кода C++ для нашего плагина:


#include "stdafx.h"

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

//Объявляем прототипы методы камеры
auto CCamera__WidescreenOff = (void (__thiscall*)(CCamera * camera))0x046B863;

auto CCamera__WidescreenOn = (void (__thiscall*)(CCamera * camera))0x046B875;

//Подхватываем переменную это наш объект CCamerа
auto _camera = (CCamera*)0x07E4688;

//Для клавиши
bool isPress = false;

//Код обработки нажатия M
void Update() {

if (!GetKeyState(0x4D) > 0 ){
CCamera__WidescreenOff(_camera);
isPress = false;
}

if ( (GetKeyState(0x4D) > 0 ) && (isPress == false) ) {
isPress = true;
CCamera__WidescreenOn(_camera);
}

};

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;
}


Обратите внимание что сразу бросается новое в глаза, это какой-то пустой класс прототип и другие странные объявления прототипов функций. Сейчас начнем по порядку и рассмотрим наконец как это все работает.

class CCamera;


Это обыкновенный прототип класса, так как у нас пока, нет не каких его исходных кодов, при больших разработках лучше объявлять все это с именами, так что не чего не обычного в нем нет. Теперь рассмотрим наши прототипы методы:

auto CCamera__WidescreenOff = (void (__thiscall*)(CCamera * camera))0x046B863;
auto CCamera__WidescreenOn = (void (__thiscall*)(CCamera * camera))0x046B875;


Это тоже самое как и в том примере, работает, но есть не большие разницы. Заместо метода передачи параметров (__cdecl) как в предыдущей статье, мы уже используем (__thiscall*). Второе адрес самого объекта, входит как первый параметр, как указатель CCamera * camera, так что тут всегда первый параметр, должен быть наш адрес самого объекта, будьте внимательными! Только лишь потом можно уже передавать параметры, если метод принимает конечно же.

auto _camera = (CCamera*)0x07E4688;


Тут все просто, мы уже этот материал проходили, это подхват переменной это тот самый наш адрес объекта. Таким образом мы можем подхватывать не только обычные типы, но и объекты классов, структуры и даже массивы. Ну в результате если мы сделали все правильно, то по нажатию в игре кнопке “M” у нас будет выглядеть в игре так:

Вызов методов класса в GTA Vice City


Стоит опять нажать кнопку M, как мы запрограммировали в коде, то вызовется другой метод, который спрячет эти полосы. Приятного вам моддинга дорогие друзья!

call_mt_plugin.rar [22,04 Kb] (cкачиваний: 31)

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

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

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

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

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

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

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

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

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

Подхват переменных в GTA Vice City

Подхват переменных в GTA Vice City
Сейчас в начале разберем вкратце, что же за такой подхват переменных в GTA Vice City. Например мы просто объявляем некую
Ads

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

GTA FreeRunning Story