> 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/00067.-ispolzovanie-turelei.md).

# 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
