> 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/00200/00083.-zapusk-drugogo-potoka-s-cleo-skripta.md).

# 00083. Запуск другого потока с Cleo-скрипта

Запуск другого потока с Cleo-скрипта|Сегодня мы научимся запускать Cleo-скрипты с других скриптов. Хотя точнее было бы сказать - запуск других потоков с Cleo-срипта.|wmysterio|wmysterio||||Всем привет! Начнём очередной урок по скриптингу. Наверное, Вы видели в файловом архиве мой скрипт "[Универсальная стрелка](https://github.com/wmysterio/scm-scripting-lessons/blob/main/load/gta_sa/cleo_i_asi_skripty/universalnaja_strelka_v1_0/68-1-0-528/README.md)", суть которого было облегчить жизнь скриптерам с удалением маркеров. Сегодня мы напишем похожий скрипт.

Начнём с того, что нам потребуется написать скрипт-запуск. Для примера, мы напишем скрипт "Бомба". Когда СЖ садится в машину и нажимает клавишу J`, то автомобиль будет заминирован. Когда игрок нажмёт клавишу <kbd>K` - произойдёт взрыв! Начнём с простенького - проверим находится ли игрок в машине и т.п.

```
{$CLEO}
0000:

while true
 if AND
 actor.Driving($PLAYER_ACTOR)
 0AB0: key_pressed 74 // J
 then
 // ... &#92;&#92;
 wait 2500
 end 
wait 0
end
```

Скрипт готов на 99%! Нам осталось написать только сам скрипт бомбы. Это значит нам нужно написать ещё один Cleo-скрипт, который будет имитировать взрыв, поэтому напишем его:

```
{$CLEO .s}
0000:

:BOMB
thread 'BOMB'
wait 0
1@ = 0

while car.Defined(0@)
 if
 0AB0: key_pressed 75 // K
 then
 1@ = 1
 break
 end 
wait 0
end

if
1@ == 1
then
car.StorePos(0@, 2@, 3@, 4@)
0565: create_soundless_explosion_at 2@ 3@ 4@ type 0 
0948: create_explosion_at 2@ 3@ 4@ type 0 camera_shake 1.0 
end

0A93: end_custom_thread
```

Обратите внимание на выражение:

```
{$CLEO .s}
```

В этом случае санник скомпилирует скрипт с расширением "\*.s" и загружатся скрипт вместе с игрой не будет. Назовём его "BOMB", что бы файл соответствовал названию файла ( для удобства ).

Суть скрипта проста: когда нажимаем кнопку K\` - переменной "1@" задаётся значение 1 и будет осуществлён выход с цикла командой "break". После этого обязательно ставим проверку на то, что переменная действительно равна единице, что бы выполнить блок со взрывом. Если это условие не выполняется, значит машина не существует и переменная "1@" никак не сможет изменить своё первоначальное значение.

От сюда и главный вопрос: как скрипт будет знать, что эта машина существует, если в скрипте нигде не создавалась она? Ответ кроется в запуске нашего скрипта бомбы. Чтобы запустить его, нужно воспользоваться опкодом.

```
0A92: create_custom_thread "BOMB.s"
```

Здесь:\
BOMB.s" - имя файла, что мы скомпилировали. Этот файл обязательно должен находится в папке "CLEO", иначе игра вылетит при попытке запуска

Так как же наш скрипт бомбы узнает о машине? Всё очень просто! К опкоду "0A92" нужно добавить параметр с переменной нашей машины. Для этого мы должны в скрипте-стартере получить машину игрока и передать эту переменную в опкод "0A92":

```
{$CLEO}
0000:
 
while true
 if AND
 actor.Driving($PLAYER_ACTOR)
 0AB0: key_pressed 74 // J
 then
 03C0: $CAR = actor $PLAYER_ACTOR car // получили хэндл тачки
 0A92: create_custom_thread "BOMB.s" $CAR // передаём её в другой поток
 0ACE: show_formatted_text_box "BOMB DETECTED!"
 wait 2500
 end 
wait 0
end
```

Из этого можно сделать вывод, что запуск нового потока осуществляется за принципом с scm-функциями. Передать можно до 34 параметров. Впрочем, эта возможность доступна и обычному "create\_thread" из "main.scm", но есть главная проблема...

Самое интересное то, что вызывать один и тот же поток можно очень много раз. В нашем скрипте-стартере доступна такая возможность. Мы можем сесть в машину и нажать кнопку J`, затем сесть в другую машину и снова нажать кнопку <kbd>J`. Обе машины будут "заминированы". После этого нужно нажать всего 1 раз кнопку K\`, как все машины, которые заминированы, будут взорваны! Но не всё так будет в мейне. Это и есть проблема. С запуском всё получится, но если сохраниться с активными двумя и больше потоками приведёт к вылету игры при загрузке, так как в мейне можно сохранять только 1 активный поток с тем же именем.

Вот вам небольшое задание: написать скрипт-стартер, который будет узнавать текущую машину игрока и написать скрипт, который будет осуществлять перекраску автомобиля. В качестве параметров должно быть машина и два параметра цвета, в который машина будет окрашена. Тоесть, нужно будет реализовать такой код запуска:

```
0A92: create_custom_thread "CARCOLOR.s" $CAR $CAR_CLOR1 $CAR_COLOR_2
```

|2059|1|0||zapusk\_drugogo\_potoka\_s\_cleo\_skripta|1499844974


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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/00200/00083.-zapusk-drugogo-potoka-s-cleo-skripta.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.
