Четверг, 12.12.2024, 02:39
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Траффик автомобилей в GTA SA [DOC]
Den_spbДата: Понедельник, 16.04.2012, 08:24 | Сообщение # 1
Создатель сайта
Группа: Администраторы
Сообщений: 1600
Статус: Offline
Тема предназначена для публикации и обсуждения документации, связанной с автомобильным траффиком в GTA SA, с целью нахождения простого и эффективного способа улучшения движения автомобилей ботов в игре.

1.Функции

Code
.text:006B4800     CAutomobile__m108 proc near ; Корневые функции, управляющие перемещением по путям
.text:006BC930     CBike__m108     proc near
.text:006C1470     CBmx__m108      proc near

.text:00436540     MovingCarsAndBikesByRoutes_cdecl proc near ; Функция перемещения по путям, вызываемая из "корневых" функций
                        ; При занопивании вызова данной функции из CAutomobile__m108 автомобили ботов стоят на месте, не реагируя даже на выстрелы.
                        ; Главная ветвь алгоритма данной функции, выполняющаяся в большинстве случаев - 0x0436580. Копать в первую очередь надо тут

.text:00422590     VehicleIsNotOnPath_cdecl proc near ; Проверка, находится ли автомобиль на пути

.text:0041B980     CTrafficBehaviour_method proc near ; Какой-то метод структуры CCarCtrl (об этой структуре см. ниже).

.text:00430050     ?SpawnAutomobiles proc near ; вроде отвечает за создание автомобилей ботов на путях

.text:0049D420     TypeOfVehiclePathPointIs4 ; проверка, равен ли тип (?) текущей точки пути четырём (проверяется смещение +12 в структуре точки)

.text:0041C050     WriteCurrentTimeToVehStruct3ACh proc near ; записывает текущее время в CVehicle+3ACh                 

.text:0049D610     CTrafficLights_ShouldCarStopForTrafficLight proc near ; проверка, должен ли автомобиль остановиться перед светофором

2.Смещения структур

Формат: 1.Смещение от CVehicle (cмещение от CCarCtrl - часть структуры CVehicle, отвечающая за поведение машины) 2.Размер 3.Описание

Code
+0x390  (+ 0)    CCarCtrl
+0x3A4 (+0x14) [word] ID текущей точки пути
+0x3A6 (+0x16) [word] ID следующей точки пути
+0x3A8 (+0x18) [word] ID предыдущей точки пути
+0x3AC (+0x1C) [dword] TimeOfLastMoving (последний момент времени, когда автомобиль перемещался)
+0x3B7 (+0x27) [byte] текущая полоса движения
                    0 - единственная полоса на обычных дорогах / левая полоса на шоссе
                    1 - правая полоса на шоссе
+0x3B8 (+0x28) [byte] будущая полоса движения?     
+0x3B9 (+0x29) [byte] trafficBehaviour (опкод 00AE)                 
+0x3BA (+0x2A) [byte] driverBehaviour (опкод 00AF)                 
+0x3BB (+0x2B) [byte] ID анимации автомобиля или мотоцикла (опкод 0477)
                    0 - просто едет
                    1 - стоит на месте
                    3 - едет задом
                    5 - поворачивает колёса вправо
                    6 - едет по кругу против часовой стрелки
                    8 - едет по кругу по часовой стрелке
                    9 - едет прямо
                    12 - автомобиль стоит на месте (едет, если выстрелить). Мотоцикл едет всегда
                    13 - автомобиль едет назад, одновременно поворачивая
                    24 - автомобиль или мотоцикл в данный момент соприкасается с препятствием
+0x3BC (+0x2C) [dword] момент времени, к которому анимация должна окончиться                          
+0x3D0 (+0x40) [byte] максимальная скорость, м/с (опкод 00AD)
+0x3DC (+0x4C) [byte] VehicleIsNotOnPath
                    0 - автомобиль на пути
                    1 - автомобиль не на пути
 
DK22PacДата: Понедельник, 16.04.2012, 11:09 | Сообщение # 2
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Code
+0x3BB = [byte] ID анимации для проигрывания  
+0x3BC = [dword] Время анимации для проигрывания
 
Den_spbДата: Понедельник, 16.04.2012, 16:21 | Сообщение # 3
Создатель сайта
Группа: Администраторы
Сообщений: 1600
Статус: Offline
Спасибо, поправил.
 
DK22PacДата: Понедельник, 16.04.2012, 18:45 | Сообщение # 4
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Кстати, я что-то запутался с этими точками. В скрипте "поворотников" считываются первые 6 байт в структуре, я же находил процедуру, которая читает 6 байт от оффсета +8.

Добавлено (16.04.2012, 18:45)
---------------------------------------------
0x420A10 RwV3D *__thiscall CPathNode__GetNodeCoors(CPathNode *pathNode, RwV3D *pPosition)

Code
{
   RwV3D *result; // eax@1

   pPosition->x = (long double)pathNode->x * 0.125;
   pPosition->y = (long double)pathNode->y * 0.125;
   pPosition->z = (long double)pathNode->z * 0.125;
   result = pPosition;
   return result;
}

Code
00000000 CPathNode       struc ; (sizeof=0xE)
00000000 field_0         dw ?
00000002 field_2         dw ?
00000004 field_4         dw ?
00000006 field_6         dw ?
00000008 x               dw ?
0000000A y               dw ?
0000000C z               dw ?
0000000E CPathNode       ends
 
Den_spbДата: Суббота, 21.04.2012, 03:14 | Сообщение # 5
Создатель сайта
Группа: Администраторы
Сообщений: 1600
Статус: Offline
С этим методом я знаком, но почему он читает другие смещения - для меня тоже загадка.
Алгоритм вычисления начала структуры в функциях, вызывающих данный метод, отличается от алгоритма, применяемого в 0x49D610 (и, соответственно, в "поворотниках"). По смещениям +8, +10, +12 структуры точки, адрес которой вычисляется алгоритмом "поворотников", хранятся не координаты точек.

Добавлено:

В таблицу смещений добавлены смещения 0x3B7, 0x3B8.


Сообщение отредактировал Den_spb - Суббота, 21.04.2012, 03:15
 
MumiyTrollДата: Суббота, 21.04.2012, 22:08 | Сообщение # 6
Группа: Проверенные
Сообщений: 92
Статус: Offline
Привет.Ден,скинь исходник версии 0.2.В архиве его нет.Хочу подредактировать скрипт, чтоб на миссиях работал.
 
Den_spbДата: Суббота, 21.04.2012, 22:57 | Сообщение # 7
Создатель сайта
Группа: Администраторы
Сообщений: 1600
Статус: Offline
Привет. Перезагрузил архив - добавил исходник и отключил в скрипте перестроения машин спецслужб (теперь их тоже можно безбоязненно обгонять).
 
MumiyTrollДата: Суббота, 21.04.2012, 23:22 | Сообщение # 8
Группа: Проверенные
Сообщений: 92
Статус: Offline
При компиляции скрипта-поменялся размер(вес 18627 kb). Это нормально?
 
Den_spbДата: Суббота, 21.04.2012, 23:41 | Сообщение # 9
Создатель сайта
Группа: Администраторы
Сообщений: 1600
Статус: Offline
Очевидно у тебя в SB включена функция добавления дополнительной служебной информации в скрипт (Сервис - Настройки - Общие - флажок Добавлять доп. информацию в SCM). Дополнительная информация не влияет на работу скрипта в игре - поэтому можно компилировать код как с включённой опцией, так и без неё.
 
MumiyTrollДата: Суббота, 21.04.2012, 23:53 | Сообщение # 10
Группа: Проверенные
Сообщений: 92
Статус: Offline
Понял,спасибо
 
DK22PacДата: Суббота, 04.01.2014, 06:29 | Сообщение # 11
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Закинул в вики смещения, +кинул туда находки из-за бугра (гтафорумс)
http://gtamodding.ru/wiki/Адреса_Памяти_ (SA)#CVehicle_.28.D0.A2.D1.80.D0.B0.D0.BD.D1.81.D0.BF.D0.BE.D1.80.D1.82.29

Добавлено (04.01.2014, 06:17)
---------------------------------------------
Сверил все функции из первого поста с оригинальными названиями:
0x6B4800 CAutomobile::ProcessAI(unsigned int &outFlags)
0x6BC930 CBike::ProcessAI(unsigned int &outFlags)
0x6C1470 CBmx::ProcessAI(unsigned int &outFlags)
0x436540 CCarCtrl::UpdateCarOnRails(CVehicle *car)
0x422590 CCarCtrl::StopCarIfNodesAreInvalid(CVehicle *car)
0x41B980 CAutoPilot::ModifySpeed(float speed) // (структура внутри CVehicle называется CAutoPilot, а CCarCtrl только содержит статические функции)
0x430050 CCarCtrl::GenerateOneRandomCar()
0x49D420 CTrafficLights::ShouldCarStopForBridge(CVehicle *car) // проверка
0x41C050 CCarAI::CarHasReasonToStop(CVehicle *car) // заставляет авто остановиться?
0x49D610 CTrafficLights::ShouldCarStopForLight(CVehicle *car, bool arg2) // проверка

Вот ещё что нашёл:
0x421FE0 CCarCtrl::ThisVehicleShouldTryNotToTurn(CVehicle *car) // проверка, что авто не должно разворачиваться на дороге?
0x422090 CCarCtrl::FindPathDirection(CNodeAddress node1, CNodeAddress node2, CNodeAddress node3, bool *resultDir) // получить направление пути (вперёд/назад)?
0x423FC0 CCarCtrl::SwitchVehicleToRealPhysics(CVehicle *car) // "включает" "правдивый" расчёт физики движения?
0x425B30 CCarCtrl::TestCollisionBetween2MovingRects(CVehicle *car1, CVehicle *car2, float angle1, float angle2, CVector *vec1, CVector *vec2) // проверка на наличие преград?
0x427740 CCarCtrl::PickNextNodeToFollowPath(CVehicle *car) // просчитать маршрут для авто, которое едет в точку назначения (GOTO_COORDS)
0x42C250 CCarCtrl::IsAnyoneParking() // проверка, есть ли авто, которых "паркуют"?
0x42CD10 CCarCtrl::RemoveDistantCars() // удалить авто, которые слишком далеко
0x42DE80 CCarCtrl::PickNextNodeRandomly(CVehicle *car) // рассчитать случайную точку маршрута
0x42EC90 CCarCtrl::DragCarToPoint(CVehicle *car, CVector *point) // перетаскиваем авто в точку
0x432B10 CCarCtrl::PickNextNodeAccordingStrategy(CVehicle *car) // получить маршрут для авто
0x4341C0 CCarCtrl::GenerateRandomCars() // генерация рандомных авто
0x434400 CCarCtrl::FindMaximumSpeedForThisCarInTraffic(CVehicle *car) // найти макс. скорость для авто на этой дороге?
0x426EF0 CCarCtrl::PickNextNodeToChaseCar(CVehicle *car, float targetX, float targetY, float targetZ, CVehicle *targetCar) // получить маршрут для авто, которое преследует другое авто
0x434790 CCarCtrl::SlowCarOnRailsDownForTrafficAndLights(CVehicle *car) // "тормознуть" авто в условиях трафика и светофоров?
0x44DB00 CCarPathLink::OneWayLaneOffset() // Получить ширину дороги?


Следующие функции названы, но мне сложно сказать, за что именно они отвечают, т.к. особо не смотрел в них:
0x425F70 CCarCtrl::TestCollisionBetween2MovingRects_OnlyFrontBumper(CVehicle *, CVehicle *, float, float, CVector *, CVector *)
0x428990 CCarCtrl::SteerAICarWithPhysicsTryingToBlockTarget_Stop(CVehicle *, float, float, float, float, float *, float *, float *, bool *)
0x428DE0 CCarCtrl::SteerAIBoatWithPhysicsAttackingPlayer(CVehicle *, float *, float *, float *, bool *)
0x42DAB0 CCarCtrl::IsThisAnAppropriateNode(CVehicle *, CNodeAddress, CNodeAddress, CNodeAddress, bool, bool)
0x42D0E0 CCarCtrl::SlowCarDownForOtherCar(CEntity *, CVehicle *, float *, float)
0x432420 CCarCtrl::SlowCarDownForCarsSectorList(CPtrList &, CVehicle *, float, float, float, float, float *, float)
0x42D4F0 CCarCtrl::SlowCarDownForObjectsSectorList(CPtrList &, CVehicle *, float, float, float, float, float *, float)
0x425440 CCarCtrl::SlowCarDownForPedsSectorList(CPtrList &, CVehicle *, float, float, float, float, float *, float)
0x436A90 CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle *, float *, float *, float *, bool *)
0x437C20 CCarCtrl::SteerAICarWithPhysics(CVehicle *)
0x41B950 CAutoPilot::RemoveOnePathNode()

Добавлено (04.01.2014, 06:29)
---------------------------------------------
Некоторые ID стратегий движения (смещение 0x2A в CAutoPilot):

Код
; enum eCarMission
MISSION_NONE     = 0
MISSION_CRUISE   = 1
MISSION_RAMPLAYER_FARAWAY  = 2
MISSION_RAMPLAYER_CLOSE  = 3
MISSION_BLOCKPLAYER_FARAWAY  = 4
MISSION_BLOCKPLAYER_CLOSE  = 5
MISSION_BLOCKPLAYER_HANDBRAKESTOP  = 6
MISSION_WAITFORDELETION  = 7
MISSION_GOTOCOORDS  = 8
MISSION_GOTOCOORDS_STRAIGHT  = 9
MISSION_EMERGENCYVEHICLE_STOP  = 10
MISSION_STOP_FOREVER  = 11
MISSION_GOTOCOORDS_ACCURATE  = 12
MISSION_GOTOCOORDS_STRAIGHT_ACCURATE  = 13
MISSION_GOTOCOORDS_ASTHECROWSWIMS  = 14
MISSION_RAMCAR_FARAWAY  = 15
MISSION_RAMCAR_CLOSE  = 16
MISSION_BLOCKCAR_FARAWAY  = 17
MISSION_BLOCKCAR_CLOSE  = 18
MISSION_BLOCKCAR_HANDBRAKESTOP  = 19
MISSION_HELI_FLYTOCOORS  = 20
MISSION_ATTACKPLAYER  = 21
MISSION_PLANE_FLYTOCOORS  = 22
MISSION_HELI_LAND  = 23
MISSION_SLOWLY_DRIVE_TOWARDS_PLAYER_1  = 24
MISSION_SLOWLY_DRIVE_TOWARDS_PLAYER_2  = 25
MISSION_BLOCKPLAYER_FORWARDANDBACK  = 26
MISSION_PARKING_2D  = 45
MISSION_PARKING_2E  = 46
MISSION_PARKING_31  = 49
MISSION_PARKING_32  = 50
 
  • Страница 1 из 1
  • 1
Поиск: