# Классы

**Класс** - это группа команд, относящихся к какой-либо сущности в игре: игрокам, актерам, машинам и т.д. Например, класс `Player` объединяет опкоды, которые выполняются над игровым персонажем.

## Общий синтаксис

Синтаксис:\
`<имя класса>.<член класса>(параметры)`

`Имя класса` - название группы опкодов, которая определена в файле `classes.db` для текущего [режима редактирования](https://docs.sannybuilder.com/ru/edit-modes)\
`Член класса` - одна из команд, входящих в класс\
`Параметры` - 0 и более [параметров](https://docs.sannybuilder.com/ru/coding/data-types), разделенных запятой

```
Player.SetMinWantedLevel($PLAYER_CHAR, 2)
```

`Player` - имя класса\
`SetMinWantedLevel` - член класса \
`$PLAYER_CHAR, 2` - два параметра для команды `SetMinWantedLevel`

Существует 3 вида членов класса:

* условия
* методы
* свойства

### Условия&#x20;

Условные команды в списке, вызываемом нажатием `Ctrl+пробел`, обозначаются словом `Check`. Они используются в [условных выражениях](https://docs.sannybuilder.com/ru/coding/conditions):

```
if
    Player.Defined($PLAYER_CHAR)
jf @anywhere
```

### Методы

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

```
Object.PutAt($crate, 10.0, -25.5, 12.2)
Car.Destroy($car)
```

В списке членов класса они обозначаются словом `proc`.&#x20;

Особый вид методов - это конструктор. Конструктор создает новый экземпляр класса и сохраняет указатель на него в переменную.

Sanny Builder допускает два эквивалентных друг другу варианта написать конструктор:

```
Player.Create($PLAYER_CHAR, #NULL, 2488.5601, -1666.84, 13.38)
```

```
$PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
```

### Свойства

Свойства служат для чтения или изменения отдельных атрибутов экземпляра класса.

Например, свойство `.Money` класса `Player` позволяет работать с количеством денег у игрока:

```
Player($PLAYER_CHAR).Money += 1000000 // добавить деньги
Player($PLAYER_CHAR).Money > 461@ // проверить счет игрока
4@ = Player($PLAYER_CHAR).Money // записать текущую сумму денег в переменную
```

{% hint style="warning" %}
В текущей версии существует ограничение на использование пробелов в [строковых литералах](https://docs.sannybuilder.com/ru/data-types#strokovye-literaly) в параметрах свойств. Компилятор игнорирует такие пробелы:

```
0@ = File.Open("file name","wb")
```

будет скомпилировано как:

```
0@ = File.Open("filename","wb")
```

{% endhint %}

## Экземпляры класса

Большинство классов в качестве первого параметра принимают переменную, которая хранит указатель на экземпляр класса - ту сущность в игре, над которой выполняется эта команда:

```
Player.Build($PLAYER_CHAR)
```

`$PLAYER_CHAR` - экземпляр класса.&#x20;

При этом некоторые внутриигровые элементы существуют в единственном экземпляре. Например, камера, которая определяет поле зрения игрока. Члены классов для таких сущностей не требуют экземпляра класса:

```
Camera.SetBehindPlayer()
```

### Объявление экземпляров класса

Переменные можно [объявлять](https://docs.sannybuilder.com/ru/variables#konstrukciya-var-end) с типом - именем класса:

```
var
    $PLAYER_CHAR: Player
end
```

Это указывает компилятору на то, что переменная `$PLAYER_CHAR` является экземпляром класса `Player`. Такую переменную можно использовать вместо имени класса:

```
if
    $PLAYER_CHAR.Defined
jf @anywhere
```

{% hint style="warning" %}
Если переменная используется вместо имени класса, она также компилируется как первый параметр, поэтому дублировать её в списке параметров не нужно:

```
$PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
```

эквивалентно:

```
Player.SetClothes($PLAYER_CHAR, "PLAYER_FACE", "HEAD", Head)
```

{% endhint %}

Переменные - экземпляры класса могут быть переобъявлены с другим типом.

### Класс `Model`&#x20;

[Имена моделей](https://docs.sannybuilder.com/ru/data-types#imena-modelei) являются экземплярами класса `Model`:

```
#AK47.Load
  
:loop
wait 0
if
  #AK47.Available
jf @loop
```

эквивалентно:

```
Model.Load(#AK47)

:loop
wait 0
if
    Model.Available(#AK47)
jf @loop
```

## Константы класса <a href="#class-constants" id="class-constants"></a>

Некоторые параметры в членах классов могут задаваться в виде [перечисляемого типа](https://docs.sannybuilder.com/ru/edit-modes/enums.txt) (или перечисления). Это делает код более читаемым:

```
Player.SetClothes($PLAYER_CHAR, "VEST", "VEST", BodyPart.Torso)
```

Последний параметр (`BodyPart.Torso`) - это значение перечисления `BodyPart`, которое будет заменено на `0` при компиляции. Перечисления и их значения определены в [файле](https://docs.sannybuilder.com/ru/edit-modes/enums.txt) `enums.txt`.

#### Константы класса (устаревшее)

Sanny Builder до версии 3.6 определял специальные константы для классов в файле `classes.db` . Такие параметры назывались `Extended`. Один член класса не мог иметь более одного параметра такого типа.&#x20;

Начиная с версии 3.6 классы могут использовать [перечисления](https://docs.sannybuilder.com/ru/edit-modes/enums.txt) в качестве типов параметров, при этом допускается использование разных перечислений для разных параметров.&#x20;

Определенные ранее в файле `classes.db` параметры типа `Extended`  были заменены на перечисления и перемещены в раздел `DEPRECATED_ENUMS` для поддержания обратной совместимости  с существующими скриптами.
