# 00077. Динамические адреса памяти. ( Часть 3 - структура объекта )

Динамические адреса памяти. ( Часть 3 - структура объекта )|Всем привет! Как вы уже догадались по названию урока речь пойдёт о структуре объекта.|wmysterio|wmysterio||||Эта структура не очень большая, в отличии от актёра и автомобиля. Разнообразности тоже немного. Сегодня мы сделаем простой пример - сделаем "эффект бьющегося сердца". Для начала, создадим объект. Серце имеет ID 1240, поэтому на всякий случай загрузим модель и создадим объект на Гроув стрит:

```
{$CLEO}
0000:

:objStruct
thread 'objStruct'
wait 0
model.Load(1240)
038B: load_requested_models

:objStruct1
wait 0
if
model.Available(1240)
jf @objStruct1
0@ = object.Create(1240, 2493.6321, -1670.4906, 13.3359)

0A93: end_custom_thread
```

Дальше получаем адрес структуры объекта опкодом:

```
0A98: 1@ = object 0@ struct
```

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

Сморим в базе данных [Структуру объекта](https://github.com/wmysterio/scm-scripting-lessons/blob/main/dir/gta_sa/dinamicheskie_adresa_pamjati_struktura_obekta/1-1-0-29/README.md) и узнаём адрес, отвечающий за размер объекта:

```
0A8E: 2@ = 1@ + 0x15C
```

Дальше нам понадобится 2 цикла FOR, что бы увеличивать и уменьшать объект:

```
for 3@ = 1.5 to 5.0 step 0.5
 0A8C: write_memory 2@ size 4 value 3@ virtual_protect 0
 wait 50
end

for 3@ = 4.5 downto 1.0 step 0.5
 0A8C: write_memory 2@ size 4 value 3@ virtual_protect 0
 wait 50
end
```

Цикл будет задавать размер объекту. Каждые 50 миллисекунд размер объекта будет увеличиваться на 0.5 в первом цикле и увеличиваться на 0.5 во втором цикле. Чтобы создать "эффект бьющегося сердца" нам понадобится ещё один цикл, который будет выполнятся, пока объект существует. Естественно for-ы будут вложены в этот цикл. Общий скрипт таков:

```
{$CLEO}
0000:

:objStruct
thread 'objStruct'
wait 0
model.Load(1240)
038B: load_requested_models

:objStruct1
wait 0
if
model.Available(1240)
jf @objStruct1
0@ = object.Create(1240, 2493.6321, -1670.4906, 13.3359)
0A98: 1@ = object 0@ struct
0A8E: 2@ = 1@ + 0x15C

while 03CA: object 0@ exists

 for 3@ = 1.5 to 5.0 step 0.5
 0A8C: write_memory 2@ size 4 value 3@ virtual_protect 0
 wait 50
 end
 
 for 3@ = 4.5 downto 1.0 step 0.5
 0A8C: write_memory 2@ size 4 value 3@ virtual_protect 0
 wait 50
 end

wait 0
end

0A93: end_custom_thread
```

Запускаем игру, и видим, что на Гроув сердце и в правду бьющееся:

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

Увы, анимацию я не смог вклеить, сложил две картинки, но вы можете скомпилировать этот код и посмотреть на результат.|956|1|0|37493127`png`500`599`400\`479\`\`||dinamicheskie\_adresa\_pamjati\_chast\_3\_struktura\_obekta|1499752920


---

# 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/00077.-dinamicheskie-adresa-pamyati.-chast-3-struktura-obekta.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.
