> For the complete documentation index, see [llms.txt](https://docs.nursultan.fun/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.nursultan.fun/scripting-api-ru/nachalo/kak-ustroen-skript.md).

# Как устроен скрипт

Скрипт — это одна включаемая штука, ровно как встроенный модуль клиента. У него свой бинд, свои настройки и свой переключатель во вкладке Scripts. Отдельный «модуль» объявлять не нужно: скрипт **и есть** модуль.

## Загружен и включён — это разное

| Состояние    | Что значит                                                                  |
| ------------ | --------------------------------------------------------------------------- |
| **Загружен** | файл скомпилирован, верхний уровень выполнен, настройки и команды объявлены |
| **Включён**  | обработчики подписаны, команды отвечают, скрипт работает                    |

Загрузка происходит при старте клиента или когда ты кидаешь файл в папку. Включение — это переключатель в меню или бинд.

Пока скрипт **выключен**, не работает ничего: обработчики событий отписаны, команды не отвечают. Включение возвращает их обратно, но файл заново **не** выполняется — переменные верхнего уровня сохраняют свои значения.

Отсюда простое правило: то, что должно обнуляться при каждом включении, обнуляй в `onEnable`.

```kotlin
var ticks = 0
var target: Entity? = null

onEnable {
    ticks = 0
    target = null
}

onDisable {
    chat.print("выключился")
}
```

## Имя, описание, бинд

```kotlin
name("AutoJump")
description("Прыгает за тебя")
key(Key.G)
```

`key` ставит бинд **по умолчанию** — только если клавиша ещё не назначена. Переназначил игрок вручную, перезагрузил скрипт — его бинд останется.

Читать и менять бинд можно и из кода:

```kotlin
bind.key()          // какая клавиша
bind.bound()        // назначена ли вообще
bind.displayName()  // как подписана в меню
bind.type()         // BindType.TOGGLE или BindType.HOLD

bind.set(Key.R, BindType.HOLD)
bind.clear()
```

## Включить и выключить из кода

`enabled` — обычное свойство:

```kotlin
enabled = false           // выключить себя
toggle()                  // переключить

hotkey("Паника", Key.RIGHT_SHIFT) { enabled = false }
```

## Перезагрузка и выгрузка

Сохранил файл — клиент перекомпилирует скрипт и запустит новый экземпляр. Включённость, бинд и значения настроек при этом восстановятся.

`onUnload` вызывается при выгрузке: перед перезагрузкой, при удалении скрипта и при выходе из игры. Это место для того, чтобы дописать что-то на диск:

```kotlin
onUnload {
    storage.put("runs", runs)
    storage.save()
}
```

Несохранённые [конфиги](/scripting-api-ru/nastroiki/sokhranenie-dannykh.md) скрипт сбрасывает на диск сам, отдельно об этом заботиться не нужно.

## Требования к версии API

Если скрипт использует что-то новое, попроси минимальную версию API — на старом клиенте он не загрузится с понятной ошибкой вместо непонятной:

```kotlin
requireApi(1)
```
