> 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/igrovye-dannye/inventar-i-predmety.md).

# Инвентарь и предметы

## Слоты

Слот — это адрес ячейки, а не сам предмет. Собрать его можно так:

```kotlin
Slot.hotbar(0)                  // первая ячейка хотбара, 0..8
Slot.inventory(20)              // ячейка основного инвентаря, 0..35
Slot.armor(ArmorSlot.HELMET)
Slot.offhand()
Slot.NONE                       // «не нашлось»
```

Всё, что ищет предмет, возвращает слот — и он может оказаться пустым:

```kotlin
val slot = inventory.find("minecraft:golden_apple")
if (!slot.found()) return

slot.inHotbar()
slot.hotbarIndex()
slot.isArmor()
slot.armorSlot()
```

## Что лежит

```kotlin
inventory.held()                        // в руке
inventory.offhand()
inventory.item(Slot.hotbar(3))
inventory.armor(ArmorSlot.CHESTPLATE)
inventory.items()                       // весь инвентарь списком
inventory.selected()                    // выбранный слот хотбара

inventory.count("minecraft:arrow")
inventory.wearing("minecraft:elytra")
inventory.full()
inventory.empty()
```

## Поиск

```kotlin
inventory.find("minecraft:mace")                 // по всему инвентарю
inventory.findInHotbar("minecraft:mace")         // только хотбар
inventory.findByTag("swords")                    // по тегу предметов
inventory.find { it.enchantmentLevel("sharpness") >= 4 }
inventory.findInHotbar { it.disablesBlocking() }
inventory.findUsable { it.food() }               // то, что можно применить прямо сейчас
inventory.findAll { it.damageable() }            // все подходящие
```

Идентификатор можно писать и без `minecraft:` — `"mace"` работает так же.

## Предмет

```kotlin
item.empty()                    // пустая ячейка
item.id()                       // "minecraft:diamond_sword"
item.name()                     // как называется в игре
item.count()  item.maxCount()
item.isA("diamond_sword")
item.hasTag("swords")

item.damage()  item.maxDamage()
item.damageable()
item.unbreakable()
item.stackable()

item.enchanted()
item.enchantments()             // все чары
item.enchantmentLevel("sharpness")

item.food()
item.nutrition()
item.saturation()

item.rarity()
item.onCooldown()               // предмет в откате
item.disablesBlocking()         // топором можно сбить щит
```

Проверять пустоту нужно всегда: `inventory.item(...)` не возвращает `null`, он возвращает пустой предмет.

```kotlin
val held = inventory.held()
if (held.empty()) return
```

## Перекладывание

```kotlin
inventory.click(slot, false)               // false — левая кнопка
inventory.shiftClick(slot)
inventory.swap(slot, Slot.hotbar(8))
inventory.drop(slot, true)                 // true — весь стак
inventory.dropHeld(false)
```

Если действий несколько, объединяй их в один пакет — так меньше шансов, что сервер увидит рассинхрон:

```kotlin
val hotbar = Slot.hotbar(8)

inventory.batch {
    it.swap(slot, hotbar)
    it.swap(Slot.armor(ArmorSlot.CHESTPLATE), hotbar)
    it.swap(slot, hotbar)
}
```

## Не наступай сам себе на ногу

`inventory.busy()` показывает, что клиент прямо сейчас двигает предметы — свои или чужие. Пока он `true`, лучше не лезть:

```kotlin
on<PrePlayerTickEvent> {
    if (inventory.busy()) return@on
    // теперь можно перекладывать
}
```

Смена слота в руке и подбор лучшей брони — это отдельная тема, смотри [Слоты и броня](/scripting-api-ru/deistviya/sloty-i-bronya.md).
