> 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/nastroiki/entry-so-svoei-logikoi.md).

# Entry со своей логикой

Варианты у `selectable` и `combo` — это не строки, а объекты **entry**. Строки тоже работают, но entry позволяет привязать к варианту его собственное поведение и не сравнивать текст.

## Строки — когда логики нет

Если варианты просто помечают режим, пиши строками:

```kotlin
val mode by selectable("Режим", "Fast", "Smooth", selected = "Fast")

if (mode == "Fast") { ... }
```

Entry для них создадутся сами.

## Entry — когда логика есть

`entry("Имя")` создаёт вариант, к которому можно прицепить обработчики:

```kotlin
val fast = entry("Fast", true) {
    onSelect { chat.print("быстрый режим") }
    onDeselect { chat.print("больше не быстрый") }
    onTick { control.jump() }
}

val smooth = entry("Smooth") {
    onTick {
        if (player.onGround()) {
            control.jump()
        }
    }
}

val mode = selectable("Режим", fast, smooth)
```

| Обработчик   | Когда вызывается                                                            |
| ------------ | --------------------------------------------------------------------------- |
| `onSelect`   | вариант выбрали                                                             |
| `onDeselect` | выбрали другой (для `combo` — сняли галочку)                                |
| `onTick`     | каждый игровой тик, но **только пока этот вариант выбран и скрипт включён** |

Второй аргумент `entry("Fast", true)` — выбран ли вариант по умолчанию. У `selectable` ровно один вариант должен быть выбран; не пометишь ни одного — выберется первый. У `combo` можно сколько угодно, в том числе ни одного.

Так режим со своей логикой пишется целиком в одном месте, а обработчик события не превращается в лестницу из `if`.

## Работа с выбором

```kotlin
mode.value()              // выбранный Entry
mode.value() == fast      // сравнение по объекту, без строк
mode.selected(smooth)     // то же самое, но короче
mode.select(fast)         // выбрать
mode.entries()            // все варианты
mode.options()            // их имена строками
```

У `combo` то же самое, только про множество:

```kotlin
val items = combo("Предметы", trident, crossbow)

items.value()             // список выбранных Entry
items.has(trident)
items.set(crossbow, false)
items.value(listOf(trident))
```

## Найти entry по имени

Если объекта под рукой нет — например, работаешь с [модулем клиента](/scripting-api-ru/eshyo/moduli-klienta.md) — вариант можно достать по ссылке:

```kotlin
val targets = client.modules().get("AttackAura").combo("targets")

targets.set(targets.entry("entry.players"), true)
targets.set("players", true)          // то же самое короче
```

Ищется по полному ключу (`entry.players`), по имени и по последнему сегменту; регистр, точки, дефисы и подчёркивания не важны.

## Что нельзя

К entry встроенного модуля клиента прицепить `onSelect`/`onTick` нельзя — это чужая настройка, скрипт может её только читать и переключать.
