# Классы

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

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

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

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

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

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

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

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

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

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

```
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" %}
В текущей версии существует ограничение на использование пробелов в [строковых литералах](/ru/coding/data-types.md#strokovye-literaly) в параметрах свойств. Компилятор игнорирует такие пробелы:

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

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

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

{% endhint %}

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

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

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

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

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

```
Camera.SetBehindPlayer()
```

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

Переменные можно [объявлять](/ru/coding/variables.md#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;

[Имена моделей](/ru/coding/data-types.md#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>

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

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

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

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

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

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

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


---

# 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://docs.sannybuilder.com/ru/coding/classes.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.
