# 00067. Использование турелей

Использование турелей|Мы продолжаем изучать скриптинг, и сегодня речь пойдет о турелях, а точнее о режиме турели.|wmysterio|wmysterio||||Что это значит? Думаю в оригинальной игре вам предоставлялись шансы пострелять как бы с места пассажира: по-центру появляется прицел и можем стрелять. Например: в миссии Зеро нам нужно было сбивать самолётики миниганом. Мы не могли сдвинуться с места, но могли вращать оружие и стрелять. Такой режим принято называть режимом турели ( от слова **turret** ). Вот как выглядит этот режим:

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

Знакомо, правда? Давайте рассмотрим опкоды для работы с турелью:

```
0464: put_actor $PLAYER_ACTOR into_turret_on_car $CAR at_car_offset -0.2 0.5 0.0 position 0 shooting_angle_limit 0.0 with_weapon 0 
06A7: put_actor $PLAYER_ACTOR into_turret_on_car $CAR at_car_offset -0.2 0.5 0.0 position 1 shooting_angle 110.0 70.0 with_weapon 43
```

Данные опкоды позволяют использовать турель на машине.

Здесь:\
$PLAYER\_ACTOR - хэндл актёра\
$CAR - хэндл машины, к которой будет прицеплен режим\
-0.2 0.5 0.0 - определяется позиция, с которой можно будет вести обстрел. Эти координаты берутся относительно автомобиля. Мы поговорим об этом ниже\
position 0 - выбирается позиция. Я точно не знаю что именно имеется ввиду под словом "позиция", поэтому используйте число указанное в опкодах\
shooting\_angle\_limit 0.0 - определяется лимит поворота на определённый угол\
with\_weapon 0 - указывается номер оружия, с которого будет вестись обстрел\
shooting\_angle 110.0 70.0 - Указывается лимит углов поворота. Первое число - поворот по горизонтали. Если поставить 360.0, то можно стрелять вокруг всей тачки. Второе число - поворот по вертикали ( вверх/вниз ). Советую так оставить число 70.0, так как если поставить число больше игра может вылететь. Советую вам использовать опкод 06A7, с ним у меня проблем не возникало, а вот с другим были проблемы с номером оружия

Так же есть возможность прицепить режим турели к объекту:

```
04F4: put_actor $PLAYER_ACTOR into_turret_on_object $OBJECT offset_from_object_origin -0.2 0.5 0.0 orientation 0 both_side_angle_limit 360.0 lock_weapon 38
```

Здесь:\
$PLAYER\_ACTOR - хендл актёра\
$OBJECT - хендл созданного объекта\
-0.2 0.5 0.0 - определяется позиция, с которой можно будет вести обстрел. Эти координаты берутся относительно объекта, на котором будет турель\
360.0 - угловой лимит по горизонтали\
38 - номер оружия, с которого будет обстрел

Что бы выйти с режима турели используется опкод:

```
0465: remove_actor $PLAYER_ACTOR from_turret_mode
```

Увы, я не нашел опкода, который позволит ходить с турелью. Если я что нибудь разнюхаю, выложу сюда. Если игрока поставить в режим турели, то он не будет передвигаться, а будет следовать за автомобилем или объектом.

Давайте рассмотрим координаты относительно объекта ( оффсеты ) "offset\_from\_object 0.0 0.0 0.0". Допустим в нас есть объект-звезда. Так и или иначе в неё есть перед ( место, куда "смотрит" объект ). Назовём это место "перёд объекта". Естественно у объекта есть центр. Это будет точка. На рисунке она обозначена красным цветом.

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

Эта точка имеет координаты 0.0 0.0 0.0. Если мы будем увеличивать только первое число, то оффсет переместится в сторону "перёд объекта":

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

Если мы будем уменьшать значение и уйдем в минус, то оффсет передвинется в противоположную сторону, то есть, как бы это интересно не звучало, в з"ад объекта" )))

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

Редактирование первого числа позволяет сдвигать оффсет по желтой линии на рисунке. По зелёной линии мы сможем смещать оффсет влево ( второе число положительное ) или вправо ( второе число отрицательное ) от объекта:

| влево ( второе число положительное ) 0.0 2.0 0.0                                         | вправо ( второе число отрицательное ) 0.0 -2.0 0.0                                       |
| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| ![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/0/69616219.png) | ![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/0/25373552.png) |

Третье число указывает высоту смещения от объекта. Если оно положительное, то оффсет сместится вверх. Если отрицательное - сместится вниз. Для примера, оффсет "5.0 -5.0 0.0" будет в этой точке:

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

Самое главное, что координаты ведутся относительно объекта, то есть нам ничего другого вычислять не надо. Объект может быть где угодно и под любыми углами - за нас всё уже сделано! :)

Что касается оффсета автомобиля, то там есть отличия:

* Первое число - движение влево ( отрицательное число ) / вправо( положительное число );
* Второе число - движение назад ( отрицательное число ) / вперед ( положительное число );
* Третье число - движение вниз ( отрицательное число ) / вверх ( положительное число );

Как по мне, то такой вариант намного лучше, чем с объектами. Почему разработчики сделали для каждого класса свои оффсеты - не берусь предположить :) С оффсетами вроде разобрались. Переходим к скриптингу. Давайте напишем скрипт, что бы нажатии кнопки T\`, СЖ помещался в режим турели и он мог стрелять с минигана. Для разнообразия сделаем, что бы СЖ оказался возле какого то транспорта:

```
{$CLEO}
0000:

:NAME
thread 'NAME'
wait 0
model.Load(#MINIGUN)
038B: load_requested_models

:NAME_1
wait 0
if
model.Available(#MINIGUN)
jf @NAME_1

:NAME_2
wait 0
0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 0@ closest_ped_to 1@
if AND
0AB0: key_pressed 84 // T
car.Defined(0@)
then
 if AND
 83C9: not car 0@ damaged
 82BF: not car 0@ sunk
 then
 06A7: put_actor $PLAYER_ACTOR into_turret_on_car 0@ at_car_offset 1.0 0.2 0.3 position 1 shooting_angle 360.0 70.0 with_weapon 38
 wait 250
 jump @NAME_3
 end
end
jump @NAME_2

:NAME_3
wait 0
if OR
actor.Dead($PLAYER_ACTOR)
0AB0: key_pressed 84 // T
03C9: car 0@ damaged
02BF: car 0@ sunk
then
0465: remove_actor $PLAYER_ACTOR from_turret_mode
wait 250
jump @NAME_2
end
jump @NAME_3
```

Вот скрин:

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

Выбираем нужную тачку и нажимаем T`, помещаемся в неё и начинаем палить во всё подряд! Нажимаем ещё раз <kbd>T`, и выходим с режима турели. Интересный вышел скриптик, который можно и в миссию запихнуть ;)

Что касается других актёров, то их тоже можно ставить в режим турели. Они просто будут стоять на месте и стрелять ( нужно заставить их убить кого то опкодом "05E2" ).

Одно я точно не знаю - нужна ли загрузка нужной модели или нет, но на всякий случаи загружайте ;)|1868|1|0|92582055`png`600`375`400`250``\|15433893`png`473`486`399`410``\|63004922`png`473`486`399`410``|44693461`png`473`486`399`410``\|69616219`png`473`486`399`410``\|25373552`png`473`486`399`410``|19110219`png`473`486`399`410``\|50413679`png`600`375`400`250\`\`||ispolzovanie\_turelej|1499697357


---

# 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/00200/00067.-ispolzovanie-turelei.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.
