> For the complete documentation index, see [llms.txt](https://lessons.sannybuilder.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lessons.sannybuilder.com/00100/00500/00075.-dinamicheskie-adresa-pamyati.-chast-2-struktura-avtomobilya.md).

# 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
