#101 18-11-2007 17:52

user1
Registered: 02-05-2007
Posts: 19

Re: Адреса и функции gta_sa.exe 1.0

надеюсь в той теме пишу:

пытался разобраться как делается программа - Car Spawner, так не вышло.
Может кто знает ?
Обьясните плиз мне.

Offline

#102 18-11-2007 18:22

Seemann
Registered: 07-08-2006
Posts: 2,071

Re: Адреса и функции gta_sa.exe 1.0

Программа встраивается в процесс игры, устанавливает хук на нажатие определенной клавиши и по мере необходимости вызывает функцию

.text:0043A0B6 ; int __cdecl SpawnCheatCar(int ModelID)

эта же функция использована в игре при вызове некоторых чит-кодов, типа спауна танка, ромеро и т.п.

Насчет встраивания в процесс точно сказать не могу, в разных программах по-разному. Может быть сделано в виде dll, которая подгружается игрой при запуске (как CLEO3), или через CreateRemoteThread (ну или что-то в этом духе).

Offline

#103 18-11-2007 19:07

user1
Registered: 02-05-2007
Posts: 19

Re: Адреса и функции gta_sa.exe 1.0

я так понял что я должен по адресу 0х43A0B6 внешнего процесса игры записывать ID той машины,
которую хочу спанить ?
не работает.
я что-то недопонимаю ?

Offline

#104 18-11-2007 19:28

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Адреса и функции gta_sa.exe 1.0

Это функция, а не переменная.
С помощью CLEO:

0AA5: call 0x43A0B6 num_params 1 pop 1 541

541 - ID машины

Offline

#105 19-11-2007 19:35

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

Re: Адреса и функции gta_sa.exe 1.0

2007-11-19: свежая база, свежий набор исходников.
изменений мало. Практически полностью разобрана структура моделей в памяти и инициализация.
После разбора моделей, мне стало понятнее многое из 3D-части, так что, к следующему разу, будет большая чистка как по именам, так и по структурам.

Что касается исходников. Прямо сейчас, их слишком мало, чтобы от них была какая-то практическая польза.
С другой стороны, если хочется разобраться, откуда изначально берутся модели, как читается .ide и прочие подобные мелочи - копаться даже в такой несортированной куче - сильно проще, чем в ассемблере. На текущий момент, все, что подключется вместо оригинального кода, работает нормально, за исключением TransFender (предположительно, пропущена обработка какого-то флага в CModelCars::preprocessHierarchy).

Если, вдруг, кому-нибудь захочется собрать что-то из этих исходников, проект там под 9-й MSVC (VS2008). Чтобы скомпилировать в восьмом MSVC (и младше), нужно создать проект типа Windows DLL и тупо добавить туда все .cpp и .h файлы. Возможно, понадобится несколько хэдеров из DirectX SDK (я использую D3DVECTOR вместо RwV3D).
Еще, в ogText.cpp сейчас жестко прописана переменная gamePath - ее нужно поправить или заменить на обращение к соответствующей функции. Остальное, вроде бы, должно быть в порядке.

Буду очень благодарен за ссылочку на расшифровку флагов компонентов (в структуре по адресу 0x8A6468 и ей подобных).


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#106 19-11-2007 19:47

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

Re: Адреса и функции gta_sa.exe 1.0

И, вдогонку, несколько иллюстраций к этому клятому preprocessHierarchy.
При разборе был потерян один флаг: что из этого получилось

http://pics.livejournal.com/the__listener/pic/00002607/
http://pics.livejournal.com/the__listener/pic/00003dx4/
http://pics.livejournal.com/the__listener/pic/00004cex/


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#107 20-11-2007 09:35

Seemann
Registered: 07-08-2006
Posts: 2,071

Re: Адреса и функции gta_sa.exe 1.0

Буду очень благодарен за ссылочку на расшифровку флагов компонентов (в структуре по адресу 0x8A6468 и ей подобных).

это надо уже у моделлеров спрашивать wink мне на ум приходит только этот топик.

Offline

#108 29-11-2007 17:18

user1
Registered: 02-05-2007
Posts: 19

Re: Адреса и функции gta_sa.exe 1.0

может кто знает:
есть адрес угла поворота по оси Z для педа:
CPed +0x558 = Z angle [float]

но я не нахожу аналогичного адреса для Т.С.

а спрошлим вопросом, к сожалению, не разобрался.
С функцией CreateRemoteThread никогда не работал.
При попытке создания дистанционного потока в игре происходит вылет самой игры. sad
Может Seemann или кто еще дадут пример ?
Можно Delphi или C++.
Или даже на Visual Basic.

Offline

#109 30-11-2007 17:34

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

Re: Адреса и функции gta_sa.exe 1.0

2user1:
Идея с CreateRemoteThread - достаточно плоха: GTA использует только два потока (один - сама игра, и второй - чтение стримов).
Если добавить свой поток - есть большой шанс получить что-то нехорошее.

Идеальный вариант - ASI и вставка своей функции в CGame::Update (0x53BEE0, в старом списке - processGame). Там есть неиспользуемые вызовы, например по адресу 0x53BFA9, вместо которых можно подсунуть свою функцию. Еще можно сделать хук вместо любой другой функции update (например, вставить свой cheat-processor).

Что касается Zangle - а того, что в XYZ (CEntity +0x14) - не достаточно?


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#110 30-11-2007 20:18

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Адреса и функции gta_sa.exe 1.0

Я прекрасно делал через CreateRemoteThread , вставлял дополнительный асмемблированный код , в котором был call процедуры спавна тачки )

2listner : как тебе такое предложение - до конца разобраться с меню в игре ?
Cаму структуру таблицы меню(8CE008h) , откуда берутся все данные о положении строк итп .. , я разобрал давно , у Seemann'a в базе оно есть .
У строки меню есть такое свойство , как функция , сам список номеров функций я составил , но вот разобратся с тем , где идет присванивание этим условным номерам реальных функций в ехе - я не нашел , а это достаточно важно )

Last edited by Alexander (30-11-2007 20:30)

Offline

#111 01-12-2007 12:28

Seemann
Registered: 07-08-2006
Posts: 2,071

Re: Адреса и функции gta_sa.exe 1.0

listener wrote:

Там есть неиспользуемые вызовы, например по адресу 0x53BFA9, вместо которых можно подсунуть свою функцию.

Зачем менять код, когда можно поставить хук на нажатие клавишы ( SetWindowsHookEx(WH_KEYBOARD...) )?
Зачем вообще нужен ASI, когда можно написать такой же CLEO-скрипт (быстрее и менее затратно)?

Ну и кстати говоря, scm-based CarSpawner был написан уже давно
http://www.gtaforums.com/index.php?showtopic=258016

Offline

#112 01-12-2007 16:20

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Адреса и функции gta_sa.exe 1.0

Не в спавнере дело , я просто привел к примеру , что я делал через CreateRemoteThread .

Offline

#113 03-12-2007 00:34

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

Re: Адреса и функции gta_sa.exe 1.0

2Alexander:
Я и не говорил, что оно не будет работать. Я говорил, что можно огрести с этого дела кучу мелких гадостей. (Например, если машина будет спавниться в момент, когда добавляется или удаляется какая-то другая машина в игре, vehicle pool рассыпется). Учитывая частоту использования спавнера, этим можно пренебречь, но, вообще-то, лучше использовать другие методы.

А меню - займусь. (Как раз, немного рабочие задачки разгреб)


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#114 03-12-2007 14:51

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Адреса и функции gta_sa.exe 1.0

А меню - займусь. (Как раз, немного рабочие задачки разгреб)

Спасибо.

Если что , то вот структура таблицы меню :

Начиная от 8CE008h 44 таблицы по 226 байт каждая .

Одна таблица :

Head (1 сигнатура)
 -Gxt ключ имени ; 8 байт
 -Unknown ; 1 байт
 -Unknown ; 1 байт
Строка меню (12 подярд идущих сигнатур)
 -Фунция ; 1 байт
 -GXT ключ имени ; 8 байт
 -Unknown ; 1 байт
 -Ведет в меню ; 1 байт ; номер 
 -Константа = $00 ; 1 байт 
 -X ; int 2 байта ; смещение на экране по X .
 -Y ; int 2 байта ; смещение на экране по Y .
 -PosType ; int 2 байта ; центрирование строки (центр,лево,право)

Offline

#115 08-12-2007 16:56

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

Re: Адреса и функции gta_sa.exe 1.0

Обновленная иерархия 3D-объектов:

CPlaceable (vmt=0x863C40, size=0x18):
    CCamera (vmt=0x8630E8)
    CEntity (vmt=0x863928, size=0x38):
        CBuilding (vmt=0x8585C8, size=0x38)
            CTreadable (vmt=0x8639B0, size=0x38)
        CDummy (vmt=0x8638C0, size=0x38)
            CDummyObject (size=0x38)
            CDummy_86C198 (unused)
        CPhysical (vmt=0x863BA0, size=0x138)
            CObject (vmt=0x866F60, size=0x17C)
                CHand (vmt=0x866EE0, size=0x18C)
                CProjectile (vmt=0x867030, size=0x17C)
                CCutsceneObject (vmt=0x868A60, size=0x19C)
            CPed (vmt=0x86C358)
                CCivilianPed (vmt=0x86C0A8, size=0x79C)
                CCopPed (vmt=0x86C120, size=0x7C4)
                CEmergencyPed (vmt=0x86C200, size=0x79C)
                CPlayerPed (vmt=0x86D168, size=0x7A4)
            CVehicle (vmt=0x871E80)
                CAutomobile (vmt=0x871120, size=0x988)
                    CHeli (vmt=0x871680, size=0xA18)
                    CMtruck (vmt=0x8717D8, size=0x99C)
                    CPlane (vmt=0x871948, size=0xA04)
                    CQuad (vmt=0x871AE8, size=0x9BC)
                    CTrailer (vmt=0x871C28, size=0x9F4)
                CBike (vmt=0x871360, size=0x814)
                    CBmx (vmt=0x871528, size=0x838)
                CBoat (size=0x8721A0, size=0x7E8)
                CTrain (vmt=0x872370, size=0x6AC)

Немного пояснений:

CPlaceable - объект, у которого есть только позиция в пространстве и ничего больше. Размер нулевой, сам ничего не умеет
CEntity - базовый объект. Не подчиняется физическим законам. У него есть форма, но сам он либо нематериален (не имеет массы, не оказывает влияния на остальные объекты, неразрушаем), либо, наоборот, имеет бесконенечную массу, непреодолим для "нормальных" объектов и, по прежнему, неразрушаем.
CPhysical - объект, на который действует игровая физика. Для него обрабатываются коллизии, упругие соударения и т.д. Имеет массу и инерцию. Разрушаем.

CBuilding - типичный пример неизменяемого объекта wink
CTreadable - пока не разобрался. Так он называется в GTA3. Точно будет понятно, после окончания разборок с IPL.

CHand - объект с ID в диапазоне 394..397
CCutsceneObject - объект с ID в диапазоне 300..319
CProjectile - ракеты, запускаемые SAM-site. (По крайней мере, других мест, где он создается, я пока не нашел).

Остальное должно быть очевидно.

Last edited by listener (08-12-2007 17:42)


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#116 08-12-2007 18:26

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

Re: Адреса и функции gta_sa.exe 1.0

диапазоны VMT и некоторые методы (все числа - шестнадцатиричные, смещения - от начала VMT)

CPlaceable: (0..3) // 0..3 -  т.е., первые четыре байта VMT CPlacement и любого его потомка.
    +0 - destructor

CEntity: (4..57)
    +0C - remove
    +14 - setModelIndex
    +18 - setModelIndexNoCreate
    +1C - createRwObject
    +20 - deleteRwObject
    +24 - getBoundRect
    +28 - processControl
    +38 - teleport
    +44 - preRender (не уверен точно, но очень похоже)
    +48 - render

CPhysical: (58..5B)

CPed: (5C..67)

CVehicle: (5C..107)
    +60 - processControlInput
    +64 - getComponentWorldPosition
    +68 - isComponentPresent
    +A4 - blowUp

CAutomobile: (108..11B)

CBike: (108..10B)

Пример:
0x871360: __vt__CBike
0x871360+0xA4: указатель на CBike::blowUp
0x6BEA10: CBike::blowUp (CEntity * who, int);

Last edited by listener (09-12-2007 07:45)


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#117 01-01-2008 12:28

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Адреса и функции gta_sa.exe 1.0

Адреса Motion Blur

0x8D5104 - главный коэфициент блура (1 byte) .

0x8D5190 - Стпень блура №1
0x8D51A0 - Стпень блура №2
0x8D51B0 - Стпень блура №3
0x8D51C0 - Стпень блура №4
0x8D51D0 - Стпень блура №5
0x8D51E0 - Стпень блура №6

Структура `степени` :
Размер 16 bytes (0x10h) .
PlayerSpeed - (float, 4 bytes), скорость , которую должень достчиь игрок , чтобы параметры `степени` вступили в силу.
  Stage Params:
   Warp - (int, 4 bytes), искажение изображения
   ObjectLoop - (int, 4 bytes), шлейф игровых объектов
   CamShake - (int, 4 bytes), встряска камеры

Недоступность блура на самолетах , вертолетах , катерах итп

(player car struct+594h = car type)
:00704DD1 8B8694050000            mov eax, dword ptr [esi+00000594]
:00704DD7 83F804                  cmp eax, 00000004
:00704DDA 0F8417010000            je 00704EF7
:00704DE0 83F803                  cmp eax, 00000003
:00704DE3 0F840E010000            je 00704EF7
:00704DE9 83F805                  cmp eax, 00000005
:00704DEC 0F8405010000            je 00704EF7
:00704DF2 83F806                  cmp eax, 00000006
:00704DF5 0F84FC000000            je 00704EF7

San Andreas Motion Blur Advanced Tool : 
топик на гтафорумс
http://www.gtaforums.com/index.php?showtopic=305432

Offline

#118 13-01-2008 06:58

AleX AciD
From: RU-VLG
Registered: 27-02-2007
Posts: 36
Website

Re: Адреса и функции gta_sa.exe 1.0

Пара функций:

sub_56E580 - set_player_wasted
sub_56E5D0 - set_player_busted

Устанавливают состояние переменной wasted_busted в структуре игрока (wasted = 1, busted = 2).

edit:
Функция

sub_52CD90 -> init_game_time

устанавливает текущее игровое время/дату как Четверг, 01 Января 12:00:00

несколько переменных:

byte_B70144 -> _isTimeSaved
byte_B7014D -> _savedMonth
byte_B7014C -> _savedMonthDay
word_B70148 -> _savedSeconds
byte_B7014E -> _currentWeekDay

edit2:
Функция

sub_55C0C0 -> init_stats

инициализирует статистику (задает начальные значения, читает AR_STATS.DAT , STATDISP.DAT)

8-байтовый буфер

dword_B78A00 -> _gxtLastMissionPassed
dword_B78A04 -> _gxtLastMissionPassed_2nd_part

хранит gxt-ключ имени последней пройденной миссии

Last edited by AleX AciD (23-01-2008 09:34)


[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]

Offline

#119 23-01-2008 14:31

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Адреса и функции gta_sa.exe 1.0

Кто-нибудь может подсказать , где при создании машины идет привязка к ней хандлинга ? Я пишу на замену своему глючному Handling Adder'у новый Car Handling Hook ))
Хук ставил тут : 6B0BA2h, 6F2A2Bh, 6BF524h , не вышло , видимо есть еще какие-то адреса .

Offline

#120 23-01-2008 14:44

Seemann
Registered: 07-08-2006
Posts: 2,071

Re: Адреса и функции gta_sa.exe 1.0

AleX AciD wrote:

устанавливает текущее игровое время/дату как Четверг, 01 Января 12:00:00

.text:0052CDCA                     mov ds:Weekday, 4

вообще-то 4 - это среда wink 1 января 1992 года было средой (время начала игры). Кстати, внутриигровой год тоже високосный (в феврале 29 дней, см. 008CCF24 MonthsDays).

Offline

#121 24-01-2008 11:17

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

Re: Адреса и функции gta_sa.exe 1.0

Alexander wrote:

Кто-нибудь может подсказать , где при создании машины идет привязка к ней хандлинга ? Я пишу на замену своему глючному Handling Adder'у новый Car Handling Hook ))
Хук ставил тут : 6B0BA2h, 6F2A2Bh, 6BF524h , не вышло , видимо есть еще какие-то адреса .

0x6B0A90: CAutomobile::CAutomobile(short modelIndex, BYTE _a4, BYTE _a8);

получаем индекс в handlingData по индексу модели:

.text:006B0B22 0C8                 mov     ebp, _modelPtrs[eax*4]
.text:006B0B29 0C8                 movsx   ecx, [ebp+CModelCars.handlingIndex]
.text:006B0B2D 0C8                 mov     [esp+0C8h+id], ecx

и, дальше ...

.text:006B0B97 0D0                 movzx   eax, byte ptr [esp+0D0h+id]
.text:006B0B9C 0D0                 imul    eax, 0E0h
.text:006B0BA2 0D0                 lea     eax, handlingData.vehicleHandling.index[eax]
;; Устанавливаем ссылку на handling ...
.text:006B0BA8 0D0                 mov     [esi+384h], eax
.text:006B0BAE 0D0                 mov     eax, [eax+CHandlingVehicle.handlingFlags]
.text:006B0BB4 0D0                 add     esp, 8
.text:006B0BB7 0C8                 test    eax, 10000h
;; ... флаги из handling ...
.text:006B0BBC 0C8                 mov     [esi+38Ch], eax
;; ... проверяем, есть ли у машины гидравлика (сама проверка: .text:006B0BB7) ...
.text:006B0BC2 0C8                 jz      short loc_6B0BDC
.text:006B0BC4 0C8                 call    _rand
.text:006B0BC9 0C8                 test    al, 3
.text:006B0BCB 0C8                 jnz     short loc_6B0BDC
.text:006B0BCD 0C8                 movzx   ecx, _miHydralics
.text:006B0BD4 0C8                 push    ecx
.text:006B0BD5 0CC                 mov     ecx, esi
.text:006B0BD7 0CC                 call    sub_6E3290
.text:006B0BDC     loc_6B0BDC:                             ; CODE XREF: CAutomobile__constructor+132j
.text:006B0BDC                                             ; CAutomobile__constructor+13Bj
;; ... Пытаемся установить блок handling для летательного аппарата
;; (если этот кролик не предназначен для полетов, CHandlingData::getFlyingHandling просто вернет NULL)
.text:006B0BDC 0C8                 mov     edx, [esp+0C8h+id]
.text:006B0BE0 0C8                 push    edx             ; id
.text:006B0BE1 0CC                 mov     ecx, offset handlingData
.text:006B0BE6 0CC                 call    CHandlingData__getFlyingHandling
.text:006B0BEB 0C8                 push    1
.text:006B0BED 0CC                 mov     [esi+388h], eax

Аналогичные конструкции есть, в конструкторах CBike, CBoat и CPlane.
Искать по ссылкам на: .data:00C2B9C8     handlingData    CHandlingData <?>

плюс, есть несколько (3..10) отдельных проверок для "гибридов" типа skimmer, которые обращаются напрямую в handlingData

Last edited by listener (24-01-2008 11:18)


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#122 25-01-2008 23:33

AleX AciD
From: RU-VLG
Registered: 27-02-2007
Posts: 36
Website

Re: Адреса и функции gta_sa.exe 1.0

Seemann wrote:

вообще-то 4 - это среда wink 1 января 1992 года было средой (время начала игры). Кстати, внутриигровой год тоже високосный (в феврале 29 дней, см. 008CCF24 MonthsDays).

Точно, у них же неделя начинается с воскресенья crazy

Несколько функций:

sub_50BD40 -> camera_set_behind_player      // поставить камеру за игроком
sub_50BD70 -> camera_set_before_player      // поставить камеру перед игроком
sub_4414C0 -> time_increase_by_minutes      // добавить X минут к текущему времени

PS:
Мне кажется, или это жестко запрограммированый "вылет" из игры?

.text:00484BD6                  xor     eax, eax
.text:00484BD8                  or      byte ptr [eax+1Eh], 4

[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]

Offline

#123 26-01-2008 00:44

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

Re: Адреса и функции gta_sa.exe 1.0

2AleX AciD:
Кажется. Вернее, почти кажется.
Если посмотреть на конструкцию в целом, видим следующее:

.text:00484BC0 168                 test    eax, eax
.text:00484BC2 168                 jz      short loc_484BD6
.text:00484BC4 168                 mov     eax, [eax]
.text:00484BC6 168                 or      byte ptr [eax+1Eh], 4
.text:00484BCA 168                 call    sub_566C10
.text:00484BCF 168                 xor     al, al
.text:00484BD1 168                 jmp     loc_48569B
.text:00484BD6     ; ---------------------------------------------------------------------------
.text:00484BD6
.text:00484BD6     loc_484BD6:                             ; CODE XREF: _opcode_handler_09+FF2j
.text:00484BD6 168                 xor     eax, eax
.text:00484BD8 168                 or      byte ptr [eax+1Eh], 4
.text:00484BDC 168                 call    sub_566C10
.text:00484BE1 168                 xor     al, al
.text:00484BE3 168                 jmp     loc_48569B

Т.е., две идентичные конструкции, в одной из которых eax принудительно обнуляется.
Что же произойдет, если мы войдем в начало всей этой конструкции, имея eax равный нулю?
Посмотрим на начало функции:

text:00483BD0 000                 push    0FFFFFFFFh
.text:00483BD2 004                 mov     eax, large fs:0
.text:00483BD8 004                 push    offset _eh_handler_483bd0
.text:00483BDD 008                 push    eax
.text:00483BDE 00C                 mov     eax, [esp+0Ch+arg_0]
.text:00483BE2 00C                 mov     large fs:0, esp

вполне предсказуемо, что в начале функции устанавливается обработчик исключения. Опуская все EHINFO, которые в нем описаны, при выполнении команды в 0x484BD8 выполнится что-то вроде (я не смотрел, какой именно хэндлер соответствует указанному адресу, а их там восемь штук)

.text:008383DC 000                 mov     eax, [ebp-144h]
.text:008383E2 000                 push    eax
.text:008383E3 004                 call    VehiclePool__release
.text:008383E8 004                 pop     ecx

после чего управление перейдет ка обработчику исключения в функции уровнем выше. В какой-то момент, скорее всего, мы вернемся обратно в игру (в конкретном случае - остановив thread, в котором произошла ошибка).

Т.е., подводя итог, так в коде выглядит __throw.

Last edited by listener (26-01-2008 00:46)


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#124 26-01-2008 06:16

Seemann
Registered: 07-08-2006
Posts: 2,071

Re: Адреса и функции gta_sa.exe 1.0

Мои 2 цента:

0x514970 - метода класса СViewport (0xB6F028), который записывает в буфер координаты площади прицеливания.

.text:00514970 ; int __cdecl CViewport__gettargetarea(float targetrange,float x,float y,float z,int* ll_corner,int* ur_corner)

1 параметр - максимальное расстояние до точки прицеливания (см. weapon.dat).
2, 3, 4 - координаты точки отуда ведется прицеливание (позиция актера/игрока)
5 - указатель на буфер, в который будут записаны координаты нижнего левого угла площади прицеливания
6 - указатель на буфер, в который будут записаны координаты верхнего правого угла площади прицеливания

Грубо говоря, линия между этими двумя углами - это траектория полета пули. Длина траектории равна 1 параметру. Координаты в первом буфере - место вылета пули. Координаты во втором буфере - это примерная точка, куда она попадет (туда же направлен и прицел).

Буфер должен быть размером в 12 байтов, чтобы хранить 3 переменные XYZ.

Вот как можно применить это в коде:

029B: 28@ = init_object 1224 at 2480.562 -1666.865 12.8757 // создаем ящик

while true
    wait 0

    00A0: store_actor $PLAYER_ACTOR position_to 0@ 1@ 2@  // записываем начальные координаты 
    //                                                            {$13-$15} {$16-$18} {z} {y} {x} {target range}
    0AA6: call_method 0x514970 struct 0xB6F028 num_params 6 pop 0 0xA49994  0xA499A0  2@  1@  0@  20.0 // вызываем метод. буфер - это группы глоб. переменных
    01BC: put_object 28@ at $13 $14 $15  // перемещаем ящик в точку прицеливания
end

Есть еще другая, не менее интересная процедура

0056BA00

Она среди параметров принимает указанные выше 2 буфера и проверяет, есть ли на линии прицеливания прохожий. Если да, то результат функции = True, а первый параметр содержит указатель на этого прохожего (над ним рисуется зеленый треугольник).
Сама функция имеет кучу параметров, и я подозреваю, что проверять на прицеливание можно не только актеров, но и другие виды объектов.

Offline

#125 28-01-2008 14:05

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Адреса и функции gta_sa.exe 1.0

listner написал :

0x6B0A90: CAutomobile::CAutomobile(short modelIndex, BYTE _a4, BYTE _a8);

получаем индекс в handlingData по индексу модели:

Код:
.text:006B0B22 0C8                 mov     ebp, _modelPtrs[eax*4]
.text:006B0B29 0C8                 movsx   ecx, [ebp+CModelCars.handlingIndex]
.text:006B0B2D 0C8                 mov     [esp+0C8h+id], ecx
и, дальше ...
Код:
.text:006B0B97 0D0                 movzx   eax, byte ptr [esp+0D0h+id]
.text:006B0B9C 0D0                 imul    eax, 0E0h
.text:006B0BA2 0D0                 lea     eax, handlingData.vehicleHandling.index[eax]
;; Устанавливаем ссылку на handling ...
.text:006B0BA8 0D0                 mov     [esi+384h], eax
.text:006B0BAE 0D0                 mov     eax, [eax+CHandlingVehicle.handlingFlags]
.text:006B0BB4 0D0                 add     esp, 8
.text:006B0BB7 0C8                 test    eax, 10000h
;; ... флаги из handling ...
.text:006B0BBC 0C8                 mov     [esi+38Ch], eax
;; ... проверяем, есть ли у машины гидравлика (сама проверка: .text:006B0BB7) ...
.text:006B0BC2 0C8                 jz      short loc_6B0BDC
.text:006B0BC4 0C8                 call    _rand
.text:006B0BC9 0C8                 test    al, 3
.text:006B0BCB 0C8                 jnz     short loc_6B0BDC
.text:006B0BCD 0C8                 movzx   ecx, _miHydralics
.text:006B0BD4 0C8                 push    ecx
.text:006B0BD5 0CC                 mov     ecx, esi
.text:006B0BD7 0CC                 call    sub_6E3290
.text:006B0BDC     loc_6B0BDC:                             ; CODE XREF: CAutomobile__constructor+132j
.text:006B0BDC                                             ; CAutomobile__constructor+13Bj
;; ... Пытаемся установить блок handling для летательного аппарата
;; (если этот кролик не предназначен для полетов, CHandlingData::getFlyingHandling просто вернет NULL)
.text:006B0BDC 0C8                 mov     edx, [esp+0C8h+id]
.text:006B0BE0 0C8                 push    edx             ; id
.text:006B0BE1 0CC                 mov     ecx, offset handlingData
.text:006B0BE6 0CC                 call    CHandlingData__getFlyingHandling
.text:006B0BEB 0C8                 push    1
.text:006B0BED 0CC                 mov     [esi+388h], eax
Аналогичные конструкции есть, в конструкторах CBike, CBoat и CPlane.
Искать по ссылкам на: .data:00C2B9C8     handlingData    CHandlingData <?>

плюс, есть несколько (3..10) отдельных проверок для "гибридов" типа skimmer, которые обращаются напрямую в handlingData

Тоесть получается , что для изменения хандлинга автомобиля на свой достаточно в

.text:006B0BA8 0D0                 mov     [esi+384h], eax

вместо eax подать указатель на свою структуру хандлинга ?

Last edited by Alexander (28-01-2008 14:09)

Offline

Board footer

Powered by FluxBB