> 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/deistviya/predskazanie.md).

# Предсказание

Предсказание отвечает на вопрос «что будет, если ничего не менять»: где я окажусь через несколько тиков и куда упадёт снаряд.

## Где я буду

```kotlin
val soon = prediction.after(10)      // через 10 тиков

soon.position()
soon.velocity()
soon.box()
soon.onGround()
soon.inWater()
soon.sneaking()
soon.sprinting()
soon.jumping()
soon.fallDistanceBlocks()
```

Считается по текущей скорости, вводу и физике мира. Ввод игрока в будущем неизвестен, так что чем дальше в тики, тем менее точно. Практический потолок — десяток-другой тиков.

Пример: не прыгать, если через пять тиков всё равно окажешься в воде.

```kotlin
if (prediction.after(5).inWater()) return@on
```

## Куда полетит снаряд

```kotlin
val path = prediction.projectile(ProjectileKind.ARROW)

path.points()             // траектория точками
path.lands()              // долетит ли вообще
path.landingPosition()    // куда упадёт
path.hitEntity()          // в кого попадёт, или null
path.hitsBlock()
path.flightTicks()        // сколько тиков лететь
```

Виды снарядов: `ARROW`, `TRIDENT`, `ENDER_PEARL`, `SPLASH_POTION`, `SNOWBALL`, `WIND_CHARGE`.

По умолчанию считается для текущего угла и полного заряда. Можно задать своё:

```kotlin
prediction.projectile(ProjectileKind.ARROW, aim)
prediction.projectile(ProjectileKind.ARROW, aim, 0.7f)
```

## Стрелять только по цели

Самое частое применение — не тратить снаряд впустую:

```kotlin
fun willHitEnemy(kind: ProjectileKind): Boolean {
    val victim = prediction.projectile(kind).hitEntity() ?: return false
    return victim.alive() && !victim.isSelf() && !victim.isAlly()
}

on<ClientTickEvent> {
    if (!player.usingItem()) return@on
    if (!inventory.held().isA("trident")) return@on
    if (player.itemUseTicks() < 10) return@on
    if (!willHitEnemy(ProjectileKind.TRIDENT)) return@on
    interaction.stopUsingItem()
}
```

## Нарисовать траекторию

`points()` — готовый список точек, его можно скормить [рендеру 3D](/scripting-api-ru/interfeis/render-3d.md):

```kotlin
on<Render3DEvent> { e ->
    val path = prediction.projectile(ProjectileKind.ENDER_PEARL)
    val points = path.points()
    for (i in 0 until points.size - 1) {
        e.render().line(points[i], points[i + 1], Colors.CYAN, true)
    }
    path.landingPosition()?.let {
        e.render().box(Box.around(it, 0.2), Colors.RED, true)
    }
}
```

## Про стоимость

Каждый запрос — это симуляция, а не чтение поля. Один-два раза за тик нормально, в цикле по всем сущностям — нет. Если нужен результат несколько раз за тик, посчитай один раз и положи в переменную.
