> 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/pervyi-skript.md).

# Первый скрипт

## Пустой файл уже работает

Создай `hello.kts` и напиши одну строку:

```kotlin
chat.print("привет")
```

Кинь файл в папку скриптов, зайди в меню → **Scripts**, включи переключатель — в чат придёт «привет».

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

## Добавим настройки и бинд

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

key(Key.G)

val delay = slider("Задержка", 5, 1, 20)
val sound = checkBox("Звук", true)

var ticks = 0

onEnable { ticks = 0 }

on<ClientTickEvent> {
    if (!inGame) return@on
    if (++ticks < delay.intValue()) return@on
    ticks = 0
    control.jump()
    if (sound.value()) {
        world.playSound("minecraft:entity.experience_orb.pickup", 1f, 1f)
    }
}
```

Что тут происходит:

* `name` и `description` — как скрипт подписан в меню. Не задашь — возьмётся имя файла.
* `key(Key.G)` — бинд по умолчанию. Если игрок уже переназначил клавишу, его выбор не затрётся.
* `slider` и `checkBox` — настройки, они появятся под карточкой скрипта.
* `onEnable` — вызывается при включении, удобно сбрасывать счётчики.
* `on<ClientTickEvent>` — обработчик, работает пока скрипт включён.

## Читать настройку можно двумя способами

Если настройка нужна просто как значение — возьми её через `by`:

```kotlin
val delay by slider("Задержка", 5f, 1f, 20f)   // delay это Float

if (ticks >= delay) { ... }
```

Если нужен сам объект — чтобы подписаться на изменение или спрятать по условию — держи его как есть:

```kotlin
val delay = slider("Задержка", 5f, 1f, 20f)

delay.value()                       // прочитать
delay.value(10f)                    // записать
delay.onChange { chat.print("теперь $it") }
```

Подробнее — Виды настроек.

## Куда смотреть, если что-то не так

Всё, что скрипт печатает, и все его ошибки уходят в консоль скриптов вместе с файлом и строкой, где это случилось:

```
[15:03:31] [ERROR] [auto-jump] failed - auto-jump.kts:12: NullPointerException
```

Открывается из меню → **Скрипты** → кнопка с терминалом рядом с поиском; закрепи её булавкой, если нужно, чтобы осталась на экране, когда вернёшься в игру. Подробнее — Сообщения.

Пять падений подряд — и скрипт выключится сам, чтобы не спамить. Подробнее — Песочница и лимиты.
