# 000153. Пример полноценной миссии \&quot;Ограбление\&quot;

Пример полноценной миссии "Ограбление"||wmysterio|wmysterio|<wmysterio@yandex.ru>|||Всем привет! Мы продолжаем писать полноценные миссии, и сегодня будем писать скрипт ограбления. Заодно и познакомимся с магнитами поближе, так как ограбления будут на вертолёте! Допустим, что Торино понадобилась помощь CJ в одной операции. Согласно ней, CJ должен украсть 3 патриота, которые стоят в троих разных посёлках.\
\
Начнём, конечно, со стартера, который поменяет только координаты названия миссии с предыдущего примера полноценной миссии:

| <p>{$CLEO}<br>thread 'STARTER'<br><br>while true<br>wait 0<br>    if<br>    $ONMISSION == 0<br>    then<br>    03A1: show\_sphere\_at 401.501 2539.6433 16.5452 radius 2.0<br>        if<br>        00EC:   actor $PLAYER\_ACTOR sphere 0 near\_point 401.501 2539.6433 radius 2.0 2.0<br>        then<br>        Player.CanMove(0, 0)<br>        Actor.SetImmunities($PLAYER\_ACTOR, 1, 1, 1, 1, 1)<br>        01F0: set\_max\_wanted\_level\_to 0<br>        0ACF: show\_formatted\_styled\_text "HEIST" time 4000 style 2<br>        fade 0 1000<br>        0A94: start\_custom\_mission "HEIST"<br>        wait 1000<br>        end<br>    end<br>end<br></p> |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

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

| <p>goto @LOAD\_MODEL\_END<br>:LOAD\_MODEL<br>Model.Load(0@)<br>038B: load\_requested\_models<br>0AB2: ret 0<br>:LOAD\_MODEL\_END // Функция загрузки модели<br><br>goto @PASTE\_CAMERA\_END<br>:PASTE\_CAMERA<br>04E4: refresh\_game\_renderer\_at 0@ 1@<br>015F: set\_camera\_position 0@ 1@ 2@ rotation 0.0 0.0 0.0<br>0160: set\_camera\_point\_at 3@ 4@ 5@ switchstyle 2<br>0AB2: ret 0<br>:PASTE\_CAMERA\_END // Функция установки камеры<br><br>goto @RESTORE\_CAMERA\_END<br>:RESTORE\_CAMERA<br>Camera.Restore\_WithJumpCut<br>Camera.SetBehindPlayer<br>0AB2: ret 0<br>:RESTORE\_CAMERA\_END // Функция, которая возвращает камеру в обычное положение<br></p> |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

В результате мы имеем 3 функции:

| <p>0AB1: call\_scm\_func @LOAD\_MODEL 1 #ADMIRAL<br>0AB1: call\_scm\_func @PASTE\_CAMERA 6 position 401.501 2539.6433 16.5452 point 401.501 2539.6433 16.5452<br>0AB1: call\_scm\_func @RESTORE\_CAMERA 0<br></p> |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

Давайте думать, какие ещё полезные функции можно добавить. К примеру мы можем написать функцию спавна транспорта. Она будет иметь примерно такой вид:

| <p>goto @SPAWN\_CAR\_END<br>:SPAWN\_CAR<br>0AB1: call\_scm\_func @LOAD\_MODEL 1 0@<br>3@ -= 1.0<br>5@ = Car.Create(0@, 1@, 2@, 3@)<br>car.Angle(5@) = 4@<br>Model.Destroy(0@)<br>0AB2: ret 1 5@<br>:SPAWN\_CAR\_END<br></p> |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

Мы воспользовались функцией загрузки внутри функции спавна. На выходе мы получаем хендл транспорта. Сигнатура самой функции будет такой:

| <p>0AB1: call\_scm\_func @SPAWN\_CAR 5 model #ADMIRAL at 401.501 2539.6433 16.5452 angle 31.1548 handle\_as $CAR<br></p> |
| ------------------------------------------------------------------------------------------------------------------------ |

Следует участь, что описание не имеет значения. Краткий пример такой функции естественно будет таким:

\
Также полезно будет написать функцию, которая будет управлять за режимы экрана(для видеоролика или обычная). Следующий код будет таким:

| <p>goto @ENABLE\_SCREEN\_MODE\_END<br>:ENABLE\_SCREEN\_MODE<br>00BE: text\_clear\_all<br>03E6: remove\_text\_box<br>if<br>0@ == 1<br>then<br>0826: enable\_hud 0<br>0581: enable\_radar 0<br>02A3: enable\_widescreen 1<br>else<br>0826: enable\_hud 1<br>0581: enable\_radar 1<br>02A3: enable\_widescreen 0<br>end<br>0AB2: ret 0<br>:ENABLE\_SCREEN\_MODE\_END<br></p> |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

Сигнатура этого прототипа будет такой:

| <p>0AB1: call\_scm\_func @ENABLE\_SCREEN\_MODE 1 as 1<br></p> |
| ------------------------------------------------------------- |

\
Думаю, такое количество функций будет достаточно. Начнём скриптить миссию. Начало будет, как обычно, такое:

| <p><br><br></p> |
| --------------- |

Теперь мы увидим сцену, в которой Торино звонит CJ со своим очередным заданием:

| <p><br></p> |
| ----------- |

\
Идёт разработка...\
\
\
\
\
\
\
\
\
\
\
\
\
\
|19|1|0||primer\_polnocennoj\_missii\_ograblenie|1393619746


---

# 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/00600/000153.-primer-polnocennoi-missii-and-quot-ograblenie-and-quot.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.
