Gta3.exe — различия между версиями
Материал из GTAModding.ru
DK22 (обсуждение | вклад) (→Классы коллизии) |
|||
(не показаны 29 промежуточных версий 5 участников) | |||
Строка 1: | Строка 1: | ||
− | Исполняющий файл игры, содержит игровой движок - [[RenderWare]] и много различных игровых ресурсов | + | Исполняющий файл игры, содержит игровой движок - [[RenderWare]] и много различных игровых ресурсов. |
+ | == Исходные коды == | ||
− | == Лимиты == | + | Кроме собственно [[RenderWare]], <code>GTA3.exe</code> содержит специализированную часть кода, написанного программистами [[Rockstar Games]] специально под нужды GTA и встречающийся исключительно в линейке видеоигр серии, начиная с [[GTA III]]. |
+ | |||
+ | === Основные компоненты GTA CORE === | ||
+ | |||
+ | * EventList.cpp - содержит список игровых событий | ||
+ | * Crime.cpp - обеспечивает работу криминальных типов | ||
+ | * Ped.cpp - формирует пути пешеходов на карте из nodes | ||
+ | * PedAI.cpp - задаёт пешеходам определённое поведение | ||
+ | * Pedtype.cpp - обработчик <code>[[PED.DAT]]</code> | ||
+ | * Population.cpp - обработчик <code>[[PEDGRP.DAT]]</code> | ||
+ | * Explosion.cpp | ||
+ | * ProjectileInfo.cpp | ||
+ | * Weapon.cpp - отвечает за оружие в игре | ||
+ | * WeaponInfo.cpp - обработчик <code>[[WEAPON.DAT]]</code> | ||
+ | |||
+ | '''GTA3Portable:''' | ||
+ | |||
+ | * binarytree.cpp | ||
+ | * POLRADIO.CPP | ||
+ | * EmergencyPed.cpp | ||
+ | * CopPed.cpp | ||
+ | * combostate.cpp | ||
+ | * glass.cpp | ||
+ | * automobile.cpp | ||
+ | * world.cpp | ||
+ | * tinyxmlparser.cpp | ||
+ | * fluff.cpp | ||
+ | * player.cpp | ||
+ | * pathrental.cpp | ||
+ | * cranes.cpp | ||
+ | * pedpath.cpp | ||
+ | * civilianped.cpp | ||
+ | * tinystr.cpp | ||
+ | * localareaknowledge.cpp | ||
+ | * trafficlights.cpp | ||
+ | * physical.cpp | ||
+ | * renderer.cpp | ||
+ | * tinyxml.cpp | ||
+ | * shadows.cpp | ||
+ | * dummy.cpp | ||
+ | * objectivefunctions.cpp | ||
+ | * entity.cpp | ||
+ | * streamingnew.cpp | ||
+ | * vehicle.cpp | ||
+ | * garage.cpp | ||
+ | * fecontrollerelement.cpp | ||
+ | * carctrl.cpp | ||
+ | |||
+ | '''GTA3Mobile:''' | ||
+ | |||
+ | * cdstream-tegra.cpp | ||
+ | * font.cpp | ||
+ | * sprite2d.cpp | ||
+ | * Touchscreen.cpp | ||
+ | * samp-oal.cpp | ||
+ | * MobileFrontend.cpp | ||
+ | * RadarMap.cpp | ||
+ | * ImplArrays.cpp | ||
+ | * IOSFile.cpp | ||
+ | * IOSGamepad.cpp | ||
+ | * EmuCustomShader.cpp | ||
+ | |||
+ | === Лимиты === | ||
Как и в любой другой игре, в GTA3 тоже существуют так называемые игровые лимиты. | Как и в любой другой игре, в GTA3 тоже существуют так называемые игровые лимиты. | ||
Строка 8: | Строка 71: | ||
Лимит - определённое ограничение, наложенное разработчиками игры на конкретные виды игровых ресурсов - модели, текстуры, автотранспорт и т.д. Выражены в числовом виде. | Лимит - определённое ограничение, наложенное разработчиками игры на конкретные виды игровых ресурсов - модели, текстуры, автотранспорт и т.д. Выражены в числовом виде. | ||
− | Отредактировать лимиты можно любым HEX-редактором, отрыв в нём gta.exe или их можно изменять непосредственно в игровой памяти посредством написания asi-плагинов или через использование CLEO-скриптов, но это намного сложнее. | + | Отредактировать лимиты можно любым HEX-редактором, отрыв в нём <code>gta.exe</code> или их можно изменять непосредственно в игровой памяти посредством написания <code>*.asi</code>-плагинов или через использование CLEO-скриптов, но это намного сложнее. |
Основные лимиты gta3 по способу хранения можно разделить на одно-байтовые и четырёх-байтовые. Четырёх-байтовые в свою очередь делятся на множество подвидов, с ними можно будет ознакомиться ниже. | Основные лимиты gta3 по способу хранения можно разделить на одно-байтовые и четырёх-байтовые. Четырёх-байтовые в свою очередь делятся на множество подвидов, с ними можно будет ознакомиться ниже. | ||
− | == Классификация | + | === Классификация === |
Данная классификация нестандартна, является результатом любительского подхода к изучению содержимого gta3.exe. Была получена без использования различных декомпиляторов, поэтому что-то ней может не совпадать с тем, что есть на самом деле. | Данная классификация нестандартна, является результатом любительского подхода к изучению содержимого gta3.exe. Была получена без использования различных декомпиляторов, поэтому что-то ней может не совпадать с тем, что есть на самом деле. | ||
− | === Первая категория "Основные Лимиты" === | + | ==== Первая категория "Основные Лимиты" ==== |
− | + | ||
− | + | ||
+ | "Лимит", в данном случае, - параметр, передаваемый в процедуру, которая выделяет память для нового пула, - кол-во элементов в пуле. | ||
Все адреса основных лимитов и их названия представлены ниже (база частично взята из GTA3 Limit Adjuster 1.0), в скобочках указаны их стандартные значения. | Все адреса основных лимитов и их названия представлены ниже (база частично взята из GTA3 Limit Adjuster 1.0), в скобочках указаны их стандартные значения. | ||
− | * 00460C - | + | * 00460C - Directory (512) |
− | * 0069D3 - | + | * 0069D3 - Directory (128) |
− | * 037945 - | + | * 037945 - CopPed (0) |
* 0A186F (0A177F) - PtrNode (30000) - Определяет допустимые объёмы коллизий на игровой карте | * 0A186F (0A177F) - PtrNode (30000) - Определяет допустимые объёмы коллизий на игровой карте | ||
* 0A188C (0A179C) - EntryInfoNode (5400) | * 0A188C (0A179C) - EntryInfoNode (5400) | ||
Строка 34: | Строка 96: | ||
* 0A1937 (0A1847) - Dummy (2802) | * 0A1937 (0A1847) - Dummy (2802) | ||
* 0A1954 (0A1864) - AudioScriptObj (256) | * 0A1954 (0A1864) - AudioScriptObj (256) | ||
− | * 0F54E2 (0F5432) - (16) | + | * 0F54E2 (0F5432) - EmergencyPed (16) |
− | * OF556E (0F54BE) - (17) | + | * OF556E (0F54BE) - EmergencyPed (17) |
− | * 127698 (127458) - (850) | + | * 127698 (127458) - TxdDef (850) |
− | * 15B6B8 (15B588) - (170) | + | * 15B6B8 (15B588) - ProjectileInfo (170) |
− | * 15B6DC (15B5AC) - (174) | + | * 15B6DC (15B5AC) - ProjectileInfo (174) |
− | * 15B700 (15B5D0) - (179) | + | * 15B700 (15B5D0) - ProjectileInfo (179) |
+ | |||
+ | ==== Вторая категория "Пути" ==== | ||
+ | |||
+ | Содержит строковые значения, ссылающиеся на основные игровые ресурсы. Выложены самые интересные, являющиеся полезными для моддинга GTA3. | ||
+ | |||
+ | * 1FD6B0 (1FD498) - fonts.txd | ||
+ | * 1FDB2C (1FD914) - hud.txd | ||
+ | * 1F34B0 (1F33A8) - menu.txd | ||
+ | * 217C80 (217440) - txd.dir | ||
+ | * 217C50 (217410) - txd.img | ||
+ | * 1FFA0C (1FF7F4) - carcols.dat | ||
+ | * 1F4EEC (1F4DDC) - default.dat | ||
+ | * 1F57C4 (1F55AC) - gta3.dat | ||
+ | * 2013D4 (2010B4) - handling.cfg | ||
+ | * 1EE79C - main.scm | ||
+ | * 2033FC (202CC4) - weapon.dat | ||
+ | * 2035BD (202E85) - HEAD RADIO | ||
+ | * 2034F5 (202DBD) - CLASSIC (DOUBLE CLEFF FM) RADIO | ||
+ | * 20350E (202DD6) - KJAH RADIO | ||
+ | * 203527 (202DEF) - RISE FM | ||
+ | * 203540 (202E08) - LIPS 106 | ||
+ | * 203559 (202E21) - GAME FM | ||
+ | * 203572 (202E3A) - MSX FM | ||
+ | * 20358B (202E53) - FLASHBACK 95.6 | ||
+ | * 2035A4 (202E6C) - CHAT | ||
+ | * 20F49D (20ED5D) - GTA3 USER FILES | ||
+ | |||
+ | ==== Третья категория ==== | ||
+ | {{stub}} | ||
+ | |||
+ | === Консоль debugger-а GTA CORE === | ||
+ | |||
+ | Для тестирования GTA3 разработчиками использовалась консоль. В финальной версии она полностью заблокирована (оставили только кастратную возможность ввода чит-кодов без интерфейса командной строки). Текстуры консоли разработчиками были оставлены в <code>frontend.txd</code> и <code>menu.txd</code>. | ||
+ | |||
+ | |||
+ | == Классы и структуры == | ||
+ | ===CAutomobile=== | ||
+ | '''Таблица виртуальных методов''' | ||
+ | Таблица Функция Имя | ||
+ | 0x600C1C 0x4202A0 CAutomobile::~CAutomobile(void) | ||
+ | 0x600C20 0x4951F0 CPhysical::Add(void) | ||
+ | 0x600C24 0x4954B0 CPhysical::Remove(void) | ||
+ | 0x600C28 0x52D190 CAutomobile::SetModelIndex(uint) | ||
+ | 0x600C2C 0x473E90 CEntity::SetModelIndexNoCreate(uint) | ||
+ | 0x600C30 0x473EA0 CEntity::CreateRwObject(void) | ||
+ | 0x600C34 0x473F90 CEntity::DeleteRwObject(void) | ||
+ | 0x600C38 0x495150 CPhysical::GetBoundRect(void) | ||
+ | 0x600C3C 0x531470 CAutomobile::ProcessControl(void) | ||
+ | 0x600C40 0x4961A0 CPhysical::ProcessCollision(void) | ||
+ | 0x600C44 0x496F10 CPhysical::ProcessShift(void) | ||
+ | 0x600C48 0x535180 CAutomobile::Teleport(CVector) | ||
+ | 0x600C4C 0x535B40 CAutomobile::PreRender(void) | ||
+ | 0x600C50 0x539EA0 CAutomobile::Render(void) | ||
+ | 0x600C54 0x4A7DD0 CVehicle::SetupLighting(void) | ||
+ | 0x600C58 0x4A7E60 CVehicle::RemoveLighting(bool) | ||
+ | 0x600C5C 0x53E350 CVehicle::FlagToDestroyWhenNextProcessed(void) | ||
+ | 0x600C60 0x53B270 CAutomobile::ProcessEntityCollision(CEntity *,CColPoint *) | ||
+ | 0x600C64 0x53B660 CAutomobile::ProcessControlInputs(uchar) | ||
+ | 0x600C68 0x52E5F0 CAutomobile::GetComponentWorldPosition(int,CVector &) | ||
+ | 0x600C6C 0x52E660 CAutomobile::IsComponentPresent(int) | ||
+ | 0x600C70 0x52E680 CAutomobile::SetComponentRotation(int,CVector) | ||
+ | 0x600C74 0x52E750 CAutomobile::OpenDoor(int,eDoors,float) | ||
+ | 0x600C78 0x52E910 CAutomobile::ProcessOpenDoor(uint,uint,float) | ||
+ | 0x600C7C 0x52EF10 CAutomobile::IsDoorReady(eDoors) | ||
+ | 0x600C80 0x52EF90 CAutomobile::IsDoorFullyOpen(eDoors) | ||
+ | 0x600C84 0x52EFD0 CAutomobile::IsDoorClosed(eDoors) | ||
+ | 0x600C88 0x52F000 CAutomobile::IsDoorMissing(eDoors) | ||
+ | 0x600C8C 0x53BF40 CAutomobile::RemoveRefsToVehicle(CEntity *) | ||
+ | 0x600C90 0x53BC60 CAutomobile::BlowUpCar(CEntity *) | ||
+ | 0x600C94 0x53BF70 CAutomobile::SetUpWheelColModel(CColModel *) | ||
+ | 0x600C98 0x53C0E0 CAutomobile::BurstTyre(uchar) | ||
+ | 0x600C9C 0x53C5B0 CAutomobile::IsRoomForPedToLeaveCar(uint,CVector *) | ||
+ | 0x600CA0 0x437690 CAutomobile::GetHeightAboveRoad(void) | ||
+ | 0x600CA4 0x53C450 CAutomobile::PlayCarHorn(void) | ||
+ | |||
+ | ===CVector=== | ||
+ | 0x0000 | float x | ||
+ | 0x0004 | float y | ||
+ | 0x0008 | float z | ||
+ | |||
+ | ===CScrollBar=== | ||
+ | {| | ||
+ | |Начало | ||
+ | |0x62F240 | ||
+ | |- | ||
+ | |Кол-во | ||
+ | |11 | ||
+ | |- | ||
+ | |Размер | ||
+ | |0x60 | ||
+ | |} | ||
+ | 0x0000 | DWORD counter | ||
+ | 0x0004 | char *text // Указатель на текущую строку | ||
+ | 0x0008 | CVector pos // Координаты левого нижнего угла | ||
+ | 0x0014 | DWORD textCurrPos | ||
+ | 0x0018 | DWORD textStartPos | ||
+ | 0x001С | float scaleX // Масштабирование/разворот в 2D-системе координат | ||
+ | 0x0020 | float scaleY // Масштабирование/разворот в 2D-системе координат | ||
+ | 0x0024 | float height // Высота | ||
+ | 0x0028 | float intensity // Интенсивность, зависит от расположения камеры и влияет на значения RGB | ||
+ | 0x002C | BYTE renderCharsSets[40] | ||
+ | 0x0054 | BYTE textType // Тип определяет комбинацию текстов, которая будет показана на бегущей строке | ||
+ | 0x0055 | BYTE isUpdated | ||
+ | 0x0056 | BYTE red | ||
+ | 0x0057 | BYTE green | ||
+ | 0x0058 | BYTE blue | ||
+ | 0x0059 | BYTE _pad[3] | ||
+ | 0x005C | float depth // Толщина букв | ||
+ | |||
+ | ===CAntenna=== | ||
+ | {| | ||
+ | |Начало | ||
+ | |0x664680 | ||
+ | |- | ||
+ | |Кол-во | ||
+ | |8 | ||
+ | |- | ||
+ | |Размер | ||
+ | |0x9C | ||
+ | |} | ||
+ | 0x0000 | BYTE isExist | ||
+ | 0x0001 | BYTE isUpdated | ||
+ | 0x0002 | BYTE _pad[2] | ||
+ | 0x0004 | DWORD id | ||
+ | 0x0008 | float length // Длина, для RcBandit равна 1.0 | ||
+ | 0x000С | CVector pointsA[6] | ||
+ | 0x0054 | CVector pointsB[6] | ||
+ | |||
+ | ===CPointlight=== | ||
+ | {| | ||
+ | |Начало | ||
+ | |0x7096D0 | ||
+ | |- | ||
+ | |Кол-во | ||
+ | |32 | ||
+ | |- | ||
+ | |Размер | ||
+ | |0x2C | ||
+ | |} | ||
+ | 0x0000 | CVector pos // Позиция | ||
+ | 0x000C | CVector direction // Направление | ||
+ | 0x0018 | float radius // Радиус | ||
+ | 0x001C | float red // 0.0 - 1.0 | ||
+ | 0x0020 | float green // 0.0 - 1.0 | ||
+ | 0x0024 | float blue // 0.0 - 1.0 | ||
+ | 0x0028 | BYTE type // Тип источника света | ||
+ | 0x0029 | BYTE fogType // Эффект с использованием текстуры pointlight | ||
+ | 0x002A | BYTE generateExtraShadows // Включить создание дополнительных теней для автомобиля игрока | ||
+ | 0x002B | BYTE _pad | ||
+ | |||
+ | ===CBulletTrace=== | ||
+ | {| | ||
+ | |Начало | ||
+ | |0x72B1B8 | ||
+ | |- | ||
+ | |Кол-во | ||
+ | |16 | ||
+ | |- | ||
+ | |Размер | ||
+ | |0x1C | ||
+ | |} | ||
+ | 0x0000 | CVector origin | ||
+ | 0x000C | CVector target | ||
+ | 0x0018 | BYTE isExist | ||
+ | 0x0019 | BYTE timeCounter | ||
+ | 0x001A | BYTE intensity | ||
+ | 0x001B | BYTE _pad | ||
+ | |||
+ | ===CBrightLight=== | ||
+ | {| | ||
+ | |Начало | ||
+ | |0x733A68 | ||
+ | |- | ||
+ | |Кол-во | ||
+ | |32 | ||
+ | |- | ||
+ | |Размер | ||
+ | |0x38 | ||
+ | |} | ||
+ | 0x0000 | CVector corner[4] | ||
+ | 0x0030 | float cameraDistance | ||
+ | 0x0034 | RwRGBA color | ||
+ | |||
+ | ===CRegisteredShadow=== | ||
+ | {| | ||
+ | |Начало | ||
+ | |0x779058 | ||
+ | |- | ||
+ | |Кол-во | ||
+ | |48 | ||
+ | |- | ||
+ | |Размер | ||
+ | |0x30 | ||
+ | |} | ||
+ | 0x0000 | CVector position | ||
+ | 0x000C | float rotationX1 // Эти параметры определяют разворот и размер | ||
+ | 0x0010 | float rotationY1 | ||
+ | 0x0014 | float rotationX2 | ||
+ | 0x0018 | float rotationY2 | ||
+ | 0x001C | float zDistance // Максимальное расстояние между позицией тени и поверхностью, на которую падает тень | ||
+ | 0x0020 | float scale // Масштабирование относительно одного из углов | ||
+ | 0x0024 | WORD intensity | ||
+ | 0x0026 | BYTE type | ||
+ | 0x0027 | BYTE red | ||
+ | 0x0028 | BYTE green | ||
+ | 0x0029 | BYTE blue | ||
+ | 0x002A | WORD flags | ||
+ | 0x002C | RwTexture *texture | ||
+ | ''Типы теней (type)'' | ||
+ | ID Описание Source-Blend Dest-Blend | ||
+ | 0 5 6 | ||
+ | 1 Тень (чёрный цвет) 2 2 | ||
+ | 2 Свет (цвет RGB) 1 4 | ||
+ | |||
+ | ===CShinyText=== | ||
+ | {| | ||
+ | |Начало | ||
+ | |0x87B2D8 | ||
+ | |- | ||
+ | |Кол-во | ||
+ | |32 | ||
+ | |- | ||
+ | |Размер | ||
+ | |0x58 | ||
+ | |} | ||
+ | 0x0000 | CVector corner[4] | ||
+ | 0x0030 | RwTexCoords cornerTexCoords[4] | ||
+ | 0x0050 | float distanceToCamera | ||
+ | 0x0006 | RwRGBA color | ||
+ | |||
+ | ===CRegisteredMotionBlurStreak=== | ||
+ | {| | ||
+ | |Начало | ||
+ | |0x880A00 | ||
+ | |- | ||
+ | |Кол-во | ||
+ | |4 | ||
+ | |- | ||
+ | |Размер | ||
+ | |0x54 | ||
+ | |} | ||
+ | 0x0000 | DWORD id | ||
+ | 0x0004 | BYTE red | ||
+ | 0x0005 | BYTE green | ||
+ | 0x0006 | BYTE blue | ||
+ | 0x0007 | BYTE _pad1 | ||
+ | 0x0008 | CVector partPointsA[3] | ||
+ | 0x002C | CVector partPointsB[3] | ||
+ | 0x0050 | BYTE isPartNeedsToBeRendered[3] | ||
+ | 0x0053 | BYTE _pad2 | ||
+ | |||
+ | ===Радар=== | ||
+ | '''Функции''' | ||
+ | 0x4A3EF0 CRadar::Initialise(void) | ||
+ | 0x4A3F60 CRadar::Shutdown(void) | ||
+ | 0x4A4030 CRadar::LoadTextures(void) | ||
+ | 0x4A4180 CRadar::GetNewUniqueBlipIndex(int) | ||
+ | 0x4A41C0 CRadar::GetActualBlipArrayIndex(int) | ||
+ | 0x4A4200 CRadar::DrawMap(void) | ||
+ | 0x4A42F0 CRadar::DrawBlips(void) | ||
+ | 0x4A4C70 CRadar::Draw3dMarkers(void) | ||
+ | 0x4A4F30 CRadar::LimitRadarPoint(CVector2D &) | ||
+ | 0x4A4F90 CRadar::CalculateBlipAlpha(float) | ||
+ | 0x4A5040 CRadar::TransformRadarPointToScreenSpace(CVector2D &,CVector2D const&) | ||
+ | 0x4A50D0 CRadar::TransformRealWorldPointToRadarSpace(CVector2D &,CVector2D const&) | ||
+ | 0x4A5300 CRadar::TransformRadarPointToRealWorldSpace(CVector2D &,CVector2D const&) | ||
+ | 0x4A5530 CRadar::TransformRealWorldToTexCoordSpace(CVector2D &,CVector2D const&,int,int) | ||
+ | 0x4A5590 CRadar::SetCoordBlip((eBlipType,CVector,int,eBlipDisplay)) | ||
+ | 0x4A5640 CRadar::SetEntityBlip((eBlipType,int,int,eBlipDisplay)) | ||
+ | 0x4A56C0 CRadar::ClearBlipForEntity((eBlipType,int)) | ||
+ | 0x4A5720 CRadar::ClearBlip((int)) | ||
+ | 0x4A5770 CRadar::ChangeBlipColour((int,int)) | ||
+ | 0x4A57A0 CRadar::ChangeBlipBrightness((int,int)) | ||
+ | 0x4A57E0 CRadar::ChangeBlipScale((int,int)) | ||
+ | 0x4A5810 CRadar::ChangeBlipDisplay((int,eBlipDisplay)) | ||
+ | 0x4A5840 CRadar::SetBlipSprite((int,int)) | ||
+ | 0x4A5870 CRadar::ShowRadarTrace(float,float,uint,uchar,uchar,uchar,uchar) | ||
+ | 0x4A59C0 CRadar::ShowRadarMarker(CVector,uint,float) | ||
+ | 0x4A5BB0 CRadar::GetRadarTraceColour(uint,uchar) | ||
+ | 0x4A5C60 CRadar::SetRadarMarkerState(int,uchar) | ||
+ | 0x4A5D10 CRadar::DrawRotatingRadarSprite(CSprite2d *,float,float,float,uchar) | ||
+ | 0x4A5EF0 CRadar::DrawRadarSprite(ushort,float,float,uchar) | ||
+ | 0x4A6020 ClipRadarTileCoords(int &,int &) | ||
+ | 0x4A6060 RequestMapSection(int,int) | ||
+ | 0x4A60A0 RemoveMapSection(int,int) | ||
+ | 0x4A60E0 CRadar::RemoveRadarSections(void) | ||
+ | 0x4A6100 CRadar::StreamRadarSections(int,int) | ||
+ | 0x4A6160 IsPointInsideRadar(CVector2D const&) | ||
+ | 0x4A61C0 GetTextureCorners(int,int,CVector2D *) | ||
+ | 0x4A6250 LineRadarBoxCollision(CVector2D &,CVector2D const&,CVector2D const&) | ||
+ | 0x4A64A0 CRadar::ClipRadarPoly(CVector2D *,CVector2D const*) | ||
+ | 0x4A67E0 CRadar::DrawRadarSection(int,int) | ||
+ | 0x4A69C0 CRadar::DrawRadarMask(void) | ||
+ | 0x4A6B60 CRadar::StreamRadarSections(CVector const&) | ||
+ | 0x4A6C20 CRadar::DrawRadarMap(void) | ||
+ | 0x4A6E30 CRadar::SaveAllRadarBlips(uchar *,uint *) | ||
+ | 0x4A6F30 CRadar::LoadAllRadarBlips(uchar *) | ||
+ | 0x4A7000 `global constructor keyed to'Radar.cpp | ||
+ | '''Переменные''' | ||
+ | 0x5F6EF8 char *gRadarTexNames[64] | ||
+ | 0x6299B8 CVector2D vec2DRadarOrigin | ||
+ | 0x6299C0 DWORD gRadarTxdIds[100] | ||
+ | 0x6ED5E0 CRadarBlip CRadar::ms_RadarTrace[32] | ||
+ | 0x885B24 CSprite2d CRadar::CatSprite | ||
+ | 0x885B58 CSprite2d CRadar::TonySprite | ||
+ | 0x8E2A7C CSprite2d CRadar::RaySprite | ||
+ | 0x8F1A2C CSprite2d CRadar::CopcarSprite | ||
+ | 0x8F1A3C CSprite2d CRadar::LuigiSprite | ||
+ | 0x8F1A40 CSprite2d CRadar::AsukaSprite | ||
+ | 0x8F1B80 CSprite2d CRadar::ElSprite | ||
+ | 0x8F29EC CSprite2d CRadar::SalSprite | ||
+ | 0x8F2BCC CSprite2d CRadar::EightSprite | ||
+ | 0x8F2BE0 CSprite2d CRadar::DonSprite | ||
+ | 0x8F2C00 CSprite2d CRadar::JoeySprite | ||
+ | 0x8F2C68 CSprite2d CRadar::KenjiSprite | ||
+ | 0x8F5830 CSprite2d CRadar::LizSprite | ||
+ | 0x8F5F74 CSprite2d CRadar::SaveSprite | ||
+ | 0x8F5FB4 CSprite2d CRadar::BombSprite | ||
+ | 0x8F6268 CSprite2d CRadar::CentreSprite | ||
+ | 0x8F6274 CSprite2d CRadar::NorthSprite | ||
+ | 0x941534 CSprite2d CRadar::WeaponSprite | ||
+ | 0x9415FC CSprite2d CRadar::IceSprite | ||
+ | 0x94307C CSprite2d CRadar::SpraySprite | ||
+ | '''Константы''' | ||
+ | 0x5F714C float 94.0 - Ширина радара | ||
+ | 0x5F7154 float 40.0 - Смещение радара по X-оси | ||
+ | 0x5F715C float 76.0 - Высота радара | ||
+ | 0x5F7160 float 123.0 - Смещение радара по Y-оси | ||
+ | '''Структуры''' | ||
+ | {| | ||
+ | |Название | ||
+ | |Метка радара | ||
+ | |- | ||
+ | |Начало | ||
+ | |0x6ED5E0 | ||
+ | |- | ||
+ | |Кол-во | ||
+ | |32 | ||
+ | |- | ||
+ | |Размер | ||
+ | |0x30 | ||
+ | |} | ||
+ | 0x0000 | DWORD m_dwBlipColour | ||
+ | 0x0004 | DWORD m_dwBlipType | ||
+ | 0x0008 | DWORD m_dwEntityHandle | ||
+ | 0x000C | CVector2D m_v2dPosn | ||
+ | 0x0014 | CVector m_v3dPosn | ||
+ | 0x0020 | WORD m_wIndex | ||
+ | 0x0022 | BYTE m_bBlipBrightness | ||
+ | 0x0023 | BYTE m_bActive | ||
+ | 0x0024 | float m_f3dMarkerAnimState | ||
+ | 0x0028 | WORD m_wBlipScale | ||
+ | 0x002A | WORD m_wBlipDisplay | ||
+ | 0x002C | WORD m_wBlipSprite | ||
+ | |||
+ | == Классы моделей == | ||
+ | CBaseModelInfo // Отдельно не существует | ||
+ | | | ||
+ | | | ||
+ | +---CSimpleModelInfo // Обьект карты? 5000 обьектов | ||
+ | | | | ||
+ | | | | ||
+ | | +---CTimeModelInfo // Ночной обьект? 30 обьектов | ||
+ | | | ||
+ | | | ||
+ | +---CClumpModelInfo // Обьект с иерархией - сцществует отдельно, 5 обьектов (головы в катсценах) | ||
+ | | | ||
+ | | | ||
+ | +---CVehicleModelInfo // Транспорт, 120 обьектов | ||
+ | | | ||
+ | | | ||
+ | +---CPedModelInfo // Педы, 90 обьектов | ||
+ | | | ||
+ | | | ||
+ | +---CMloModelInfo // 1 обьект, создается секцией sta | ||
+ | | | ||
+ | | | ||
+ | +---CXtraCompsModelInfo // Части педа? 2 обьекта | ||
+ | ===CBaseModelInfo=== | ||
+ | struct CBaseModelInfo | ||
+ | { | ||
+ | void *__vmt; | ||
+ | char m_cName[24]; | ||
+ | CColModel *m_pColModel; | ||
+ | C2dEffect *m_p2dEffect; | ||
+ | WORD m_wObjectDataId; | ||
+ | WORD m_wRefCount; | ||
+ | WORD m_wTxdId; | ||
+ | BYTE m_bType; | ||
+ | BYTE m_bNum2dEffects; | ||
+ | BYTE __field_2C; | ||
+ | BYTE __padding0[3]; | ||
+ | }; | ||
+ | ===CSimpleModelInfo=== | ||
+ | struct CSimpleModelInfo : public CBaseModelInfo | ||
+ | { | ||
+ | RpAtomic *m_pAtomic[3]; | ||
+ | float m_fLodDistance[3]; | ||
+ | BYTE m_bNumAtomics; | ||
+ | BYTE m_bAlpha; | ||
+ | WORD m_wLodFlags; | ||
+ | }; | ||
+ | ===CTimeModelInfo=== | ||
+ | struct CTimeModelInfo : public CSimpleModelInfo | ||
+ | { | ||
+ | DWORD m_dwTimeOn; | ||
+ | DWORD m_dwTimeOff; | ||
+ | DWORD m_dwOtherTimeModelId; | ||
+ | }; | ||
+ | ===CClumpModelInfo=== | ||
+ | struct CClumpModelInfo : public CBaseModelInfo | ||
+ | { | ||
+ | RpClump *m_pClump; | ||
+ | }; | ||
+ | ===CVehicleModelInfo=== | ||
+ | struct CVehicleModelInfo : public CClumpModelInfo | ||
+ | { | ||
+ | BYTE m_bLastCarColorId[2]; | ||
+ | char m_cGameName[32]; | ||
+ | BYTE __padding0[2]; | ||
+ | DWORD m_dwVehicleType; | ||
+ | DWORD m_dwWheelModelIndex; | ||
+ | float m_fWheelScale; | ||
+ | DWORD m_dwNumDoors; | ||
+ | DWORD m_dwHandlingId; | ||
+ | DWORD m_dwClass; | ||
+ | DWORD m_dwLvl; | ||
+ | CVector m_vDummyPos[10]; | ||
+ | DWORD m_dwComprules; | ||
+ | float m_fBikeSteerAngle; | ||
+ | RpMaterial *m_pMaterialPrimary[26]; | ||
+ | RpMaterial *m_pMaterialSecondary[26]; | ||
+ | BYTE m_bPrimaryColorId[8]; | ||
+ | BYTE m_bSecondaryColorId[8]; | ||
+ | BYTE m_bNumColorVariations; | ||
+ | BYTE m_bLastColorVariation; | ||
+ | BYTE m_bCurrentColorId[2]; | ||
+ | RwTexture *m_pEnvironmentTex; | ||
+ | RpAtomic *m_pExtra[6]; | ||
+ | DWORD m_dwNumExtras; | ||
+ | }; | ||
+ | |||
+ | ===CPedModelInfo=== | ||
+ | struct CPedModelInfo | ||
+ | { | ||
+ | DWORD m_dwAnimGroupId; | ||
+ | DWORD m_dwPedtype; | ||
+ | DWORD m_dwStatPedtype; | ||
+ | DWORD m_dwCarsCanDriveMask; | ||
+ | CColModel *m_pHitColModel; | ||
+ | }; | ||
+ | ===CMloModelInfo=== | ||
+ | struct CMloModelInfo : public CClumpModelInfo | ||
+ | { | ||
+ | DWORD __field_34; | ||
+ | DWORD __field_38; | ||
+ | DWORD __field_3C; | ||
+ | }; | ||
+ | ===CXtraCompsModelInfo=== | ||
+ | struct CXtraCompsModelInfo : public CClumpModelInfo | ||
+ | { | ||
+ | DWORD __field_34; | ||
+ | }; | ||
+ | == Классы коллизии == | ||
+ | ===CColModel=== | ||
+ | В оригинальных исходниках R*, класс CColModel выглядел примерно так: | ||
+ | <source lang="cpp">class CColModel | ||
+ | { | ||
+ | public: | ||
+ | CColSphere m_BoundSphere; | ||
+ | CColBox m_BoundBox; | ||
+ | unsigned short m_wNumOfSpheres; | ||
+ | unsigned short m_wNumOfLines; | ||
+ | unsigned short m_wNumOfBoxes; | ||
+ | unsigned short m_wNumOfTriangles; | ||
+ | eLevelName m_ColLevel; | ||
+ | unsigned char m_nFlags; | ||
+ | CColSphere *m_pSpheres; | ||
+ | CColLine *m_pLines; | ||
+ | CColBox *m_pBoxes; | ||
+ | CompressedVector *m_pVertices; | ||
+ | CColTriangle *m_pTriangles; | ||
+ | CColTrianglePlane *m_pTrianglePlanes; | ||
+ | |||
+ | CColModel(); | ||
+ | ~CColModel(); | ||
+ | |||
+ | void operator=(CColModel const &right); | ||
− | + | void GetTrianglePoint(CVector &out, int vertex); | |
+ | void CalculateTrianglePlanes(); | ||
+ | void RemoveTrianglePlanes(); | ||
+ | void SetLinkPtr(CLink<CColModel *> *link); | ||
+ | CLink<CColModel *> *GetLinkPtr(); | ||
+ | void RemoveCollisionVolumes(); | ||
+ | };</source> | ||
+ | {{GTA3-navi}} | ||
+ | [[Категория:GTA 3]] |
Текущая версия на 22:46, 15 октября 2013
Исполняющий файл игры, содержит игровой движок - RenderWare и много различных игровых ресурсов.
Содержание |
Исходные коды
Кроме собственно RenderWare, GTA3.exe
содержит специализированную часть кода, написанного программистами Rockstar Games специально под нужды GTA и встречающийся исключительно в линейке видеоигр серии, начиная с GTA III.
Основные компоненты GTA CORE
- EventList.cpp - содержит список игровых событий
- Crime.cpp - обеспечивает работу криминальных типов
- Ped.cpp - формирует пути пешеходов на карте из nodes
- PedAI.cpp - задаёт пешеходам определённое поведение
- Pedtype.cpp - обработчик
PED.DAT
- Population.cpp - обработчик
PEDGRP.DAT
- Explosion.cpp
- ProjectileInfo.cpp
- Weapon.cpp - отвечает за оружие в игре
- WeaponInfo.cpp - обработчик
WEAPON.DAT
GTA3Portable:
- binarytree.cpp
- POLRADIO.CPP
- EmergencyPed.cpp
- CopPed.cpp
- combostate.cpp
- glass.cpp
- automobile.cpp
- world.cpp
- tinyxmlparser.cpp
- fluff.cpp
- player.cpp
- pathrental.cpp
- cranes.cpp
- pedpath.cpp
- civilianped.cpp
- tinystr.cpp
- localareaknowledge.cpp
- trafficlights.cpp
- physical.cpp
- renderer.cpp
- tinyxml.cpp
- shadows.cpp
- dummy.cpp
- objectivefunctions.cpp
- entity.cpp
- streamingnew.cpp
- vehicle.cpp
- garage.cpp
- fecontrollerelement.cpp
- carctrl.cpp
GTA3Mobile:
- cdstream-tegra.cpp
- font.cpp
- sprite2d.cpp
- Touchscreen.cpp
- samp-oal.cpp
- MobileFrontend.cpp
- RadarMap.cpp
- ImplArrays.cpp
- IOSFile.cpp
- IOSGamepad.cpp
- EmuCustomShader.cpp
Лимиты
Как и в любой другой игре, в GTA3 тоже существуют так называемые игровые лимиты.
Лимит - определённое ограничение, наложенное разработчиками игры на конкретные виды игровых ресурсов - модели, текстуры, автотранспорт и т.д. Выражены в числовом виде.
Отредактировать лимиты можно любым HEX-редактором, отрыв в нём gta.exe
или их можно изменять непосредственно в игровой памяти посредством написания *.asi
-плагинов или через использование CLEO-скриптов, но это намного сложнее.
Основные лимиты gta3 по способу хранения можно разделить на одно-байтовые и четырёх-байтовые. Четырёх-байтовые в свою очередь делятся на множество подвидов, с ними можно будет ознакомиться ниже.
Классификация
Данная классификация нестандартна, является результатом любительского подхода к изучению содержимого gta3.exe. Была получена без использования различных декомпиляторов, поэтому что-то ней может не совпадать с тем, что есть на самом деле.
Первая категория "Основные Лимиты"
"Лимит", в данном случае, - параметр, передаваемый в процедуру, которая выделяет память для нового пула, - кол-во элементов в пуле. Все адреса основных лимитов и их названия представлены ниже (база частично взята из GTA3 Limit Adjuster 1.0), в скобочках указаны их стандартные значения.
- 00460C - Directory (512)
- 0069D3 - Directory (128)
- 037945 - CopPed (0)
- 0A186F (0A177F) - PtrNode (30000) - Определяет допустимые объёмы коллизий на игровой карте
- 0A188C (0A179C) - EntryInfoNode (5400)
- 0A18A9 (0A17B9) - Peds (140)
- 0A18C6 (0A17D6) - Vehicle (110)
- 0A18E0 (0A17F0) - Buildings (5500)
- 0A18FD (0A180D) - Treadable (1214)
- 0A191A (0A182A) - Object (450)
- 0A1937 (0A1847) - Dummy (2802)
- 0A1954 (0A1864) - AudioScriptObj (256)
- 0F54E2 (0F5432) - EmergencyPed (16)
- OF556E (0F54BE) - EmergencyPed (17)
- 127698 (127458) - TxdDef (850)
- 15B6B8 (15B588) - ProjectileInfo (170)
- 15B6DC (15B5AC) - ProjectileInfo (174)
- 15B700 (15B5D0) - ProjectileInfo (179)
Вторая категория "Пути"
Содержит строковые значения, ссылающиеся на основные игровые ресурсы. Выложены самые интересные, являющиеся полезными для моддинга GTA3.
- 1FD6B0 (1FD498) - fonts.txd
- 1FDB2C (1FD914) - hud.txd
- 1F34B0 (1F33A8) - menu.txd
- 217C80 (217440) - txd.dir
- 217C50 (217410) - txd.img
- 1FFA0C (1FF7F4) - carcols.dat
- 1F4EEC (1F4DDC) - default.dat
- 1F57C4 (1F55AC) - gta3.dat
- 2013D4 (2010B4) - handling.cfg
- 1EE79C - main.scm
- 2033FC (202CC4) - weapon.dat
- 2035BD (202E85) - HEAD RADIO
- 2034F5 (202DBD) - CLASSIC (DOUBLE CLEFF FM) RADIO
- 20350E (202DD6) - KJAH RADIO
- 203527 (202DEF) - RISE FM
- 203540 (202E08) - LIPS 106
- 203559 (202E21) - GAME FM
- 203572 (202E3A) - MSX FM
- 20358B (202E53) - FLASHBACK 95.6
- 2035A4 (202E6C) - CHAT
- 20F49D (20ED5D) - GTA3 USER FILES
Третья категория
Консоль debugger-а GTA CORE
Для тестирования GTA3 разработчиками использовалась консоль. В финальной версии она полностью заблокирована (оставили только кастратную возможность ввода чит-кодов без интерфейса командной строки). Текстуры консоли разработчиками были оставлены в frontend.txd
и menu.txd
.
Классы и структуры
CAutomobile
Таблица виртуальных методов
Таблица Функция Имя 0x600C1C 0x4202A0 CAutomobile::~CAutomobile(void) 0x600C20 0x4951F0 CPhysical::Add(void) 0x600C24 0x4954B0 CPhysical::Remove(void) 0x600C28 0x52D190 CAutomobile::SetModelIndex(uint) 0x600C2C 0x473E90 CEntity::SetModelIndexNoCreate(uint) 0x600C30 0x473EA0 CEntity::CreateRwObject(void) 0x600C34 0x473F90 CEntity::DeleteRwObject(void) 0x600C38 0x495150 CPhysical::GetBoundRect(void) 0x600C3C 0x531470 CAutomobile::ProcessControl(void) 0x600C40 0x4961A0 CPhysical::ProcessCollision(void) 0x600C44 0x496F10 CPhysical::ProcessShift(void) 0x600C48 0x535180 CAutomobile::Teleport(CVector) 0x600C4C 0x535B40 CAutomobile::PreRender(void) 0x600C50 0x539EA0 CAutomobile::Render(void) 0x600C54 0x4A7DD0 CVehicle::SetupLighting(void) 0x600C58 0x4A7E60 CVehicle::RemoveLighting(bool) 0x600C5C 0x53E350 CVehicle::FlagToDestroyWhenNextProcessed(void) 0x600C60 0x53B270 CAutomobile::ProcessEntityCollision(CEntity *,CColPoint *) 0x600C64 0x53B660 CAutomobile::ProcessControlInputs(uchar) 0x600C68 0x52E5F0 CAutomobile::GetComponentWorldPosition(int,CVector &) 0x600C6C 0x52E660 CAutomobile::IsComponentPresent(int) 0x600C70 0x52E680 CAutomobile::SetComponentRotation(int,CVector) 0x600C74 0x52E750 CAutomobile::OpenDoor(int,eDoors,float) 0x600C78 0x52E910 CAutomobile::ProcessOpenDoor(uint,uint,float) 0x600C7C 0x52EF10 CAutomobile::IsDoorReady(eDoors) 0x600C80 0x52EF90 CAutomobile::IsDoorFullyOpen(eDoors) 0x600C84 0x52EFD0 CAutomobile::IsDoorClosed(eDoors) 0x600C88 0x52F000 CAutomobile::IsDoorMissing(eDoors) 0x600C8C 0x53BF40 CAutomobile::RemoveRefsToVehicle(CEntity *) 0x600C90 0x53BC60 CAutomobile::BlowUpCar(CEntity *) 0x600C94 0x53BF70 CAutomobile::SetUpWheelColModel(CColModel *) 0x600C98 0x53C0E0 CAutomobile::BurstTyre(uchar) 0x600C9C 0x53C5B0 CAutomobile::IsRoomForPedToLeaveCar(uint,CVector *) 0x600CA0 0x437690 CAutomobile::GetHeightAboveRoad(void) 0x600CA4 0x53C450 CAutomobile::PlayCarHorn(void)
CVector
0x0000 | float x 0x0004 | float y 0x0008 | float z
CScrollBar
Начало | 0x62F240 |
Кол-во | 11 |
Размер | 0x60 |
0x0000 | DWORD counter 0x0004 | char *text // Указатель на текущую строку 0x0008 | CVector pos // Координаты левого нижнего угла 0x0014 | DWORD textCurrPos 0x0018 | DWORD textStartPos 0x001С | float scaleX // Масштабирование/разворот в 2D-системе координат 0x0020 | float scaleY // Масштабирование/разворот в 2D-системе координат 0x0024 | float height // Высота 0x0028 | float intensity // Интенсивность, зависит от расположения камеры и влияет на значения RGB 0x002C | BYTE renderCharsSets[40] 0x0054 | BYTE textType // Тип определяет комбинацию текстов, которая будет показана на бегущей строке 0x0055 | BYTE isUpdated 0x0056 | BYTE red 0x0057 | BYTE green 0x0058 | BYTE blue 0x0059 | BYTE _pad[3] 0x005C | float depth // Толщина букв
CAntenna
Начало | 0x664680 |
Кол-во | 8 |
Размер | 0x9C |
0x0000 | BYTE isExist 0x0001 | BYTE isUpdated 0x0002 | BYTE _pad[2] 0x0004 | DWORD id 0x0008 | float length // Длина, для RcBandit равна 1.0 0x000С | CVector pointsA[6] 0x0054 | CVector pointsB[6]
CPointlight
Начало | 0x7096D0 |
Кол-во | 32 |
Размер | 0x2C |
0x0000 | CVector pos // Позиция 0x000C | CVector direction // Направление 0x0018 | float radius // Радиус 0x001C | float red // 0.0 - 1.0 0x0020 | float green // 0.0 - 1.0 0x0024 | float blue // 0.0 - 1.0 0x0028 | BYTE type // Тип источника света 0x0029 | BYTE fogType // Эффект с использованием текстуры pointlight 0x002A | BYTE generateExtraShadows // Включить создание дополнительных теней для автомобиля игрока 0x002B | BYTE _pad
CBulletTrace
Начало | 0x72B1B8 |
Кол-во | 16 |
Размер | 0x1C |
0x0000 | CVector origin 0x000C | CVector target 0x0018 | BYTE isExist 0x0019 | BYTE timeCounter 0x001A | BYTE intensity 0x001B | BYTE _pad
CBrightLight
Начало | 0x733A68 |
Кол-во | 32 |
Размер | 0x38 |
0x0000 | CVector corner[4] 0x0030 | float cameraDistance 0x0034 | RwRGBA color
CRegisteredShadow
Начало | 0x779058 |
Кол-во | 48 |
Размер | 0x30 |
0x0000 | CVector position 0x000C | float rotationX1 // Эти параметры определяют разворот и размер 0x0010 | float rotationY1 0x0014 | float rotationX2 0x0018 | float rotationY2 0x001C | float zDistance // Максимальное расстояние между позицией тени и поверхностью, на которую падает тень 0x0020 | float scale // Масштабирование относительно одного из углов 0x0024 | WORD intensity 0x0026 | BYTE type 0x0027 | BYTE red 0x0028 | BYTE green 0x0029 | BYTE blue 0x002A | WORD flags 0x002C | RwTexture *texture
Типы теней (type)
ID Описание Source-Blend Dest-Blend 0 5 6 1 Тень (чёрный цвет) 2 2 2 Свет (цвет RGB) 1 4
CShinyText
Начало | 0x87B2D8 |
Кол-во | 32 |
Размер | 0x58 |
0x0000 | CVector corner[4] 0x0030 | RwTexCoords cornerTexCoords[4] 0x0050 | float distanceToCamera 0x0006 | RwRGBA color
CRegisteredMotionBlurStreak
Начало | 0x880A00 |
Кол-во | 4 |
Размер | 0x54 |
0x0000 | DWORD id 0x0004 | BYTE red 0x0005 | BYTE green 0x0006 | BYTE blue 0x0007 | BYTE _pad1 0x0008 | CVector partPointsA[3] 0x002C | CVector partPointsB[3] 0x0050 | BYTE isPartNeedsToBeRendered[3] 0x0053 | BYTE _pad2
Радар
Функции
0x4A3EF0 CRadar::Initialise(void) 0x4A3F60 CRadar::Shutdown(void) 0x4A4030 CRadar::LoadTextures(void) 0x4A4180 CRadar::GetNewUniqueBlipIndex(int) 0x4A41C0 CRadar::GetActualBlipArrayIndex(int) 0x4A4200 CRadar::DrawMap(void) 0x4A42F0 CRadar::DrawBlips(void) 0x4A4C70 CRadar::Draw3dMarkers(void) 0x4A4F30 CRadar::LimitRadarPoint(CVector2D &) 0x4A4F90 CRadar::CalculateBlipAlpha(float) 0x4A5040 CRadar::TransformRadarPointToScreenSpace(CVector2D &,CVector2D const&) 0x4A50D0 CRadar::TransformRealWorldPointToRadarSpace(CVector2D &,CVector2D const&) 0x4A5300 CRadar::TransformRadarPointToRealWorldSpace(CVector2D &,CVector2D const&) 0x4A5530 CRadar::TransformRealWorldToTexCoordSpace(CVector2D &,CVector2D const&,int,int) 0x4A5590 CRadar::SetCoordBlip((eBlipType,CVector,int,eBlipDisplay)) 0x4A5640 CRadar::SetEntityBlip((eBlipType,int,int,eBlipDisplay)) 0x4A56C0 CRadar::ClearBlipForEntity((eBlipType,int)) 0x4A5720 CRadar::ClearBlip((int)) 0x4A5770 CRadar::ChangeBlipColour((int,int)) 0x4A57A0 CRadar::ChangeBlipBrightness((int,int)) 0x4A57E0 CRadar::ChangeBlipScale((int,int)) 0x4A5810 CRadar::ChangeBlipDisplay((int,eBlipDisplay)) 0x4A5840 CRadar::SetBlipSprite((int,int)) 0x4A5870 CRadar::ShowRadarTrace(float,float,uint,uchar,uchar,uchar,uchar) 0x4A59C0 CRadar::ShowRadarMarker(CVector,uint,float) 0x4A5BB0 CRadar::GetRadarTraceColour(uint,uchar) 0x4A5C60 CRadar::SetRadarMarkerState(int,uchar) 0x4A5D10 CRadar::DrawRotatingRadarSprite(CSprite2d *,float,float,float,uchar) 0x4A5EF0 CRadar::DrawRadarSprite(ushort,float,float,uchar) 0x4A6020 ClipRadarTileCoords(int &,int &) 0x4A6060 RequestMapSection(int,int) 0x4A60A0 RemoveMapSection(int,int) 0x4A60E0 CRadar::RemoveRadarSections(void) 0x4A6100 CRadar::StreamRadarSections(int,int) 0x4A6160 IsPointInsideRadar(CVector2D const&) 0x4A61C0 GetTextureCorners(int,int,CVector2D *) 0x4A6250 LineRadarBoxCollision(CVector2D &,CVector2D const&,CVector2D const&) 0x4A64A0 CRadar::ClipRadarPoly(CVector2D *,CVector2D const*) 0x4A67E0 CRadar::DrawRadarSection(int,int) 0x4A69C0 CRadar::DrawRadarMask(void) 0x4A6B60 CRadar::StreamRadarSections(CVector const&) 0x4A6C20 CRadar::DrawRadarMap(void) 0x4A6E30 CRadar::SaveAllRadarBlips(uchar *,uint *) 0x4A6F30 CRadar::LoadAllRadarBlips(uchar *) 0x4A7000 `global constructor keyed to'Radar.cpp
Переменные
0x5F6EF8 char *gRadarTexNames[64] 0x6299B8 CVector2D vec2DRadarOrigin 0x6299C0 DWORD gRadarTxdIds[100] 0x6ED5E0 CRadarBlip CRadar::ms_RadarTrace[32] 0x885B24 CSprite2d CRadar::CatSprite 0x885B58 CSprite2d CRadar::TonySprite 0x8E2A7C CSprite2d CRadar::RaySprite 0x8F1A2C CSprite2d CRadar::CopcarSprite 0x8F1A3C CSprite2d CRadar::LuigiSprite 0x8F1A40 CSprite2d CRadar::AsukaSprite 0x8F1B80 CSprite2d CRadar::ElSprite 0x8F29EC CSprite2d CRadar::SalSprite 0x8F2BCC CSprite2d CRadar::EightSprite 0x8F2BE0 CSprite2d CRadar::DonSprite 0x8F2C00 CSprite2d CRadar::JoeySprite 0x8F2C68 CSprite2d CRadar::KenjiSprite 0x8F5830 CSprite2d CRadar::LizSprite 0x8F5F74 CSprite2d CRadar::SaveSprite 0x8F5FB4 CSprite2d CRadar::BombSprite 0x8F6268 CSprite2d CRadar::CentreSprite 0x8F6274 CSprite2d CRadar::NorthSprite 0x941534 CSprite2d CRadar::WeaponSprite 0x9415FC CSprite2d CRadar::IceSprite 0x94307C CSprite2d CRadar::SpraySprite
Константы
0x5F714C float 94.0 - Ширина радара 0x5F7154 float 40.0 - Смещение радара по X-оси 0x5F715C float 76.0 - Высота радара 0x5F7160 float 123.0 - Смещение радара по Y-оси
Структуры
Название | Метка радара |
Начало | 0x6ED5E0 |
Кол-во | 32 |
Размер | 0x30 |
0x0000 | DWORD m_dwBlipColour 0x0004 | DWORD m_dwBlipType 0x0008 | DWORD m_dwEntityHandle 0x000C | CVector2D m_v2dPosn 0x0014 | CVector m_v3dPosn 0x0020 | WORD m_wIndex 0x0022 | BYTE m_bBlipBrightness 0x0023 | BYTE m_bActive 0x0024 | float m_f3dMarkerAnimState 0x0028 | WORD m_wBlipScale 0x002A | WORD m_wBlipDisplay 0x002C | WORD m_wBlipSprite
Классы моделей
CBaseModelInfo // Отдельно не существует | | +---CSimpleModelInfo // Обьект карты? 5000 обьектов | | | | | +---CTimeModelInfo // Ночной обьект? 30 обьектов | | +---CClumpModelInfo // Обьект с иерархией - сцществует отдельно, 5 обьектов (головы в катсценах) | | +---CVehicleModelInfo // Транспорт, 120 обьектов | | +---CPedModelInfo // Педы, 90 обьектов | | +---CMloModelInfo // 1 обьект, создается секцией sta | | +---CXtraCompsModelInfo // Части педа? 2 обьекта
CBaseModelInfo
struct CBaseModelInfo { void *__vmt; char m_cName[24]; CColModel *m_pColModel; C2dEffect *m_p2dEffect; WORD m_wObjectDataId; WORD m_wRefCount; WORD m_wTxdId; BYTE m_bType; BYTE m_bNum2dEffects; BYTE __field_2C; BYTE __padding0[3]; };
CSimpleModelInfo
struct CSimpleModelInfo : public CBaseModelInfo { RpAtomic *m_pAtomic[3]; float m_fLodDistance[3]; BYTE m_bNumAtomics; BYTE m_bAlpha; WORD m_wLodFlags; };
CTimeModelInfo
struct CTimeModelInfo : public CSimpleModelInfo { DWORD m_dwTimeOn; DWORD m_dwTimeOff; DWORD m_dwOtherTimeModelId; };
CClumpModelInfo
struct CClumpModelInfo : public CBaseModelInfo { RpClump *m_pClump; };
CVehicleModelInfo
struct CVehicleModelInfo : public CClumpModelInfo { BYTE m_bLastCarColorId[2]; char m_cGameName[32]; BYTE __padding0[2]; DWORD m_dwVehicleType; DWORD m_dwWheelModelIndex; float m_fWheelScale; DWORD m_dwNumDoors; DWORD m_dwHandlingId; DWORD m_dwClass; DWORD m_dwLvl; CVector m_vDummyPos[10]; DWORD m_dwComprules; float m_fBikeSteerAngle; RpMaterial *m_pMaterialPrimary[26]; RpMaterial *m_pMaterialSecondary[26]; BYTE m_bPrimaryColorId[8]; BYTE m_bSecondaryColorId[8]; BYTE m_bNumColorVariations; BYTE m_bLastColorVariation; BYTE m_bCurrentColorId[2]; RwTexture *m_pEnvironmentTex; RpAtomic *m_pExtra[6]; DWORD m_dwNumExtras; };
CPedModelInfo
struct CPedModelInfo { DWORD m_dwAnimGroupId; DWORD m_dwPedtype; DWORD m_dwStatPedtype; DWORD m_dwCarsCanDriveMask; CColModel *m_pHitColModel; };
CMloModelInfo
struct CMloModelInfo : public CClumpModelInfo { DWORD __field_34; DWORD __field_38; DWORD __field_3C; };
CXtraCompsModelInfo
struct CXtraCompsModelInfo : public CClumpModelInfo { DWORD __field_34; };
Классы коллизии
CColModel
В оригинальных исходниках R*, класс CColModel выглядел примерно так:
class CColModel { public: CColSphere m_BoundSphere; CColBox m_BoundBox; unsigned short m_wNumOfSpheres; unsigned short m_wNumOfLines; unsigned short m_wNumOfBoxes; unsigned short m_wNumOfTriangles; eLevelName m_ColLevel; unsigned char m_nFlags; CColSphere *m_pSpheres; CColLine *m_pLines; CColBox *m_pBoxes; CompressedVector *m_pVertices; CColTriangle *m_pTriangles; CColTrianglePlane *m_pTrianglePlanes; CColModel(); ~CColModel(); void operator=(CColModel const &right); void GetTrianglePoint(CVector &out, int vertex); void CalculateTrianglePlanes(); void RemoveTrianglePlanes(); void SetLinkPtr(CLink<CColModel *> *link); CLink<CColModel *> *GetLinkPtr(); void RemoveCollisionVolumes(); };