You are not logged in.
Pages: 1
Необходимо прочитать имя машины, в которой сейчас находится игрок. Всё, что я сумел найти, это определение номера модели:
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
имена машин содержатся в структуре 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
Alien, а ты можешь написать код с call_func, где будет получаться GXT определенной тачки?
Offline
имена машин содержатся в структуре 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
А не проще описать один раз структуры и массивы, чтобы потом с указателями так не возиться?
Были такие намерения. Но для одного только того, чтобы прочитать значение DWORD'а по смещению не посчитал нужным описывать класс. Да еще и не один, а вместе с родителем и хотя бы одним виртуальным методом. По нулевому смещению ведь vmt... Короче говоря, слишком геморройно это оказывается на деле.
PS. По аналогии с gta_dll неспешно пишется iv_dll. Кому-нибудь это будет интересно?
Лично мне будет.=) Профессиональный код всегда интересно почитать. Да еще и по вопросам, связанным с реверс инжинирингом.
Alien, а ты можешь написать код с call_func, где будет получаться GXT определенной тачки?
Специально для таких, как ты есть опкод 0B0D.
Offline
Alien, спасибо. Опять я тормознул - решение было совсем рядом.
Offline
Pages: 1