# 00075. Динамические адреса памяти. ( Часть 2 - структура автомобиля )

Динамические адреса памяти. ( Часть 2 - структура автомобиля )|Привет всем! Сегодня мы рассмотрим структуру автомобиля а так же примеры с игровой памятью.|wmysterio|wmysterio||||Прежде всего, создадим автомобиль на гроув, с которым мы будем работать:

```
var
0@: car
#ADMIRAL: model
end

:CARSTRUCT
thread 'CARSTRUCT'
wait 0
#ADMIRAL.Load
038B: load_requested_models

:CARSTRUCT_1
wait 0
if
#ADMIRAL.Available
jf @CARSTRUCT_1
0@.Create(#ADMIRAL, 2493.6321, -1670.4906, 12.3359)
#ADMIRAL.Destroy

0A93: end_custom_thread
```

После этого, узнаём адрес его структуры:

```
0A97: 1@ = car 0@ struct
```

Здесь:\
1@ - переменная, в которую будет занесен адрес\
0@ - хендл автомобиля

Дальше открываем [базу данных](https://github.com/wmysterio/scm-scripting-lessons/blob/main/dir/gta_sa/dinamicheskie_adresa_pamjati_struktura_avtomobilja/1-1-0-27/README.md) и ищем нужное смещение. Ну вот, я выбрал размер колёс. После этого прибавляем к переменной 1@ смещение, указанное в БД.

```
0A8E: 2@ = 1@ + 0x458 // размер колёс
```

Как видите размер будет 4 байта ( float ) и значения будут дробные. Давайте напишем скрипт, что бы при нажатии кнопки 1\`, колёса становились в трое больше.

```
{$CLEO}
0000:

var
0@: car
#ADMIRAL: model
end

:CARSTRUCT
thread 'CARSTRUCT'
wait 0
#ADMIRAL.Load
038B: load_requested_models

:CARSTRUCT_1
wait 0
if
#ADMIRAL.Available
jf @CARSTRUCT_1
0@.Create(#ADMIRAL, 2493.6321, -1670.4906, 12.3359)
#ADMIRAL.Destroy

:CARSTRUCT_2
wait 0
if
0AB0: key_pressed 49 // 1
jf @CARSTRUCT_2
0A97: 1@ = car 0@ struct
0A8E: 2@ = 1@ + 0x458

0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 // получаем текущий размер колёс
3@ *= 3.0 // умножаем значение по этому адресу на 3.0
0A8C: write_memory 2@ size 4 value 3@ virtual_protect 0 // и запишем в этот же адрес значение, который мы умножили

0A93: end_custom_thread
```

Обращаю Ваше внимание, что нужно умножать значение адреса, а не сам адрес. Если значение адреса дробное, то и умножать, делить, сложить или вычитать нужно дробное число, то есть вот такой вариант будет не верным:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/59237279.png)

Теперь запускаем игру и проверяем правильность нашего скрипта:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/91926612.png)

Неплохо, правда? :) В следующем уроке мы рассмотрим структуру объекта.|1247|1|0|91926612`png`500`300`400`240``\|59237279`png`446`56`400`50\`\`||dinamicheskie\_adresa\_pamjati\_chast\_2\_struktura\_avtomobilja|1499750565


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00100/00500/00075.-dinamicheskie-adresa-pamyati.-chast-2-struktura-avtomobilya.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
