#1 17-12-2009 10:23

WinuX
Registered: 06-03-2009
Posts: 138

Прочитать имя машины

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

03C0: 4@ = actor $PLAYER_ACTOR car
0A97: 6@ = car 4@ struct
0A8E: 7@ = 6@ + 0x22
0A8D: 7@ = read_memory 7@ size 2 virtual_protect 0

п.с. и ещё, где-то я видел справку по GTX, там было написано, как задать вставку строки, сменить цвет текста и т.п. Только не помню, где...

Offline

#2 19-12-2009 17:54

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Прочитать имя машины

Ммм
не проще ли по опкоду?
0@ = Car.model(1@)
Это абсолютно тоже самое!


I know everything and nothing...

Offline

#3 20-12-2009 09:20

Alien
Registered: 12-10-2008
Posts: 564

Re: Прочитать имя машины

имена машин содержатся в структуре CModelCars. По смещению 0x32.
Если что, вот мой опкод для получения GXT машины.

char CScriptThread::opcode_0B0D(void)
{
	//0B0D: %2s% = car_model %1o% GXT
	getNumberParams(this, 1);
	WORD modelid = opcodeParams[0]._i;
	DWORD modelcar = *(DWORD*)(modelid << 2 + 0xA9B0C8);
	strcpy(getPointerParam(this, 1), (char*)(modelcar + 0x32));

	return 0;
}

Last edited by Alien (20-12-2009 09:20)

Offline

#4 20-12-2009 10:43

GTASA
Registered: 13-09-2008
Posts: 476

Re: Прочитать имя машины

Alien, а ты можешь написать код с call_func, где будет получаться GXT определенной тачки?

Offline

#5 20-12-2009 13:50

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Прочитать имя машины

Alien wrote:

имена машин содержатся в структуре CModelCars. По смещению 0x32.
Если что, вот мой опкод для получения GXT машины.

char CScriptThread::opcode_0B0D(void)
{
    //0B0D: %2s% = car_model %1o% GXT
    getNumberParams(this, 1);
    WORD modelid = opcodeParams[0]._i;
    DWORD modelcar = *(DWORD*)(modelid << 2 + 0xA9B0C8);
    strcpy(getPointerParam(this, 1), (char*)(modelcar + 0x32));

    return 0;
}

А не проще описать один раз структуры и массивы, чтобы потом с указателями так не возиться?

// должно быть описано где-то в начале один раз
CBaseModelInfo ** g_ppModels = reinterpret_cast<CBaseModelInfo **>(0xA9B0C8);

// а дальше так
char CScriptThread::opcode_0B0D(void) {
    //0B0D: %2s% = car_model %1o% GXT
    getNumberParams(this, 1); 
    WORD modelid = opcodeParams[0]._i;
        strcpy (getPointerParam (this, 1),  reinterpret_cast<CVehicleModelInfo *>(g_ppModels[modelid])->m_szGameName);
    return 0;
}

Структуры моделей у меня были описаны (надо будет выложить вариант с правильными названиями из IV).

PS. По аналогии с gta_dll неспешно пишется iv_dll. Кому-нибудь это будет интересно?

Offline

#6 20-12-2009 14:29

Alien
Registered: 12-10-2008
Posts: 564

Re: Прочитать имя машины

listener wrote:

А не проще описать один раз структуры и массивы, чтобы потом с указателями так не возиться?

Были такие намерения. Но для одного только того, чтобы прочитать значение DWORD'а по смещению не посчитал нужным описывать класс. Да еще и не один, а вместе с родителем и хотя бы одним виртуальным методом. По нулевому смещению ведь vmt... Короче говоря, слишком геморройно это оказывается на деле.

listener wrote:

PS. По аналогии с gta_dll неспешно пишется iv_dll. Кому-нибудь это будет интересно?

Лично мне будет.=) Профессиональный код всегда интересно почитать. Да еще и по вопросам, связанным с реверс инжинирингом.

GTASA wrote:

Alien, а ты можешь написать код с call_func, где будет получаться GXT определенной тачки?

Специально для таких, как ты есть опкод 0B0D.

Offline

#7 20-12-2009 20:07

WinuX
Registered: 06-03-2009
Posts: 138

Re: Прочитать имя машины

Alien, спасибо. Опять я тормознул - решение было совсем рядом.

Offline

Board footer

Powered by FluxBB