> For the complete documentation index, see [llms.txt](https://wiki.aegis-mine.ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wiki.aegis-mine.ru/modifications/sozdanie-kontenta/crafttweaker/minecraft-1.19.2/sekvenciya.md).

# Секвенция

Находится он в <mark style="color:blue;">**level$sequence**</mark>. Приведём пример на основе <mark style="color:blue;">**crafttweaker.api.event.entity.player.ItemPickupEvent**</mark>.

## Пример секвенции

```java
import crafttweaker.api.event.entity.player.ItemPickupEvent;
import crafttweaker.api.events.CTEventManager;
CTEventManager.register<crafttweaker.api.event.entity.player.ItemPickupEvent>((event) => {
    var player = event.player;
    if (player.level.isClientSide) return;
    var level = player.level;
    var item = event.getStack();
    if (item.registryName == <item:minecraft:dirt>.registryName) level.sequence();
});
```

Сиквенцер создаётся просто, вдобавок в него можно поместить <mark style="color:blue;">**MapData**</mark>, которая будет хранить какие-либо параметры.

```java
level.sequence({version: "1.0.0"});
```

Но писать <mark style="color:blue;">**MapData**</mark> необязательно, она может иметь пустое значение.

```java
level.sequence();
```

Создадим такой код, который будет выдавать игроку через <mark style="color:blue;">**100 ticks**</mark> алмаз, если он подберёт землю.

```java
level.sequence().addTask(new SleepTask(100)).run((player, context) => player.inventory.add(<item:minecraft:diamond>));
```

Для удобства объяснения я буду объяснять всё на уровне кода, а точнее по нижнему примеру. Давайте разбираться.

```java
level.sequence().addTask(ISequenceTask<T,U>).run(BiConsumer<T,SequenceContext<T,U>>);
```

В методе <mark style="color:blue;">**addTask**</mark> у нас во входных параметрах выступает <mark style="color:blue;">**ISequenceTask**</mark>, в конструкторе которого есть <mark style="color:blue;">**T**</mark> и <mark style="color:blue;">**U**</mark>, они являются <mark style="color:blue;">**Objects**</mark>, то есть любой объект, будь то <mark style="color:blue;">**int**</mark> или передача собственного класса.

В самом <mark style="color:blue;">**craftTweaker**</mark> есть самобытное задание - это <mark style="color:blue;">**SleepTask**</mark>. У него есть метод <mark style="color:blue;">**tick**</mark>, который имеет входные параметры <mark style="color:blue;">**T**</mark> и <mark style="color:blue;">**SequenceContext\<T,U>**</mark>.

Вы можете вызывать sequence по завершении иного <mark style="color:blue;">**sequence**</mark>. Для этого в метод <mark style="color:blue;">**tick**</mark> мы должны передать <mark style="color:blue;">**level**</mark> и <mark style="color:blue;">**SequenceContext**</mark> и в него же передать наш <mark style="color:blue;">**sequnce**</mark> по окончании которого запустится другой <mark style="color:blue;">**sequence**</mark> и <mark style="color:blue;">**MapData**</mark>, в которую будет записана информация для выполнения.

{% code lineNumbers="true" %}

```java
import crafttweaker.api.util.sequence.SequenceContext;
import crafttweaker.api.sequence.task.ISequenceTask;
import crafttweaker.api.data.MapData;

var sequence1 = level.sequence().addTask(new SleepTask(100)).run((player, context) => player.inventory.add(<item:minecraft:diamond>));
var task = new SleepTask(20).tick(level, new SequenceContext(sequence1, new MapData()));
if (task.isComplete()) {
    var sequence2=leve.sequence().addTask(new SleepTask(60)).run((player,context)=>player.sendMessage("Во работает"));
}
```

{% endcode %}

Секвенция невероятно сложная тема без внятной документации. Всё написанное здесь базируется на личном опыте журналиста.

В методе <mark style="color:blue;">**run**</mark> во входных данных используется <mark style="color:blue;">**BiConsumer\<T,U>**</mark>: вместо <mark style="color:blue;">**U**</mark> у нас <mark style="color:blue;">**SequenceContext\<T,U>**</mark>.

В <mark style="color:blue;">**T**</mark> мы пишем любой <mark style="color:blue;">**Object**</mark>, который хотим использовать. В нашем случае это <mark style="color:blue;">**player**</mark>. Заместо <mark style="color:blue;">**SequenceContext\<T,U>**</mark> Вы можете написать какой-либо другой <mark style="color:blue;">**Object**</mark>, но это не рекомендуется.

Т.е., Вы можете написать `run((player, level) => {})`, и оно будет работать. Но, если Вам понадобится <mark style="color:blue;">**SequenceContext**</mark>, уже его получить не удастся.

***

## <mark style="color:blue;">InstantTask</mark>

Поговорим теперь про все <mark style="color:blue;">**Task**</mark>, которые у нас существуют. Он выполняется немедленно, в отличие от <mark style="color:blue;">**SleepTask**</mark> и <mark style="color:blue;">**SleepUntilTask**</mark>.

```java
import import crafttweaker.api.sequence.task.type.InstantTask;
level.sequence().addTask(new InstantTask((player, context) => player.sendMessage("Я выполняюсь мгновенно!")));
```

***

## <mark style="color:blue;">SleepUntilTask</mark>

В отличие от <mark style="color:blue;">**SleepTask**</mark>, секвенция будет остановлена, пока условие не будет выполнено.

```java
import crafttweaker.api.sequence.task.type.SleepUntilTask;
level.sequence().addTask(new SleepUntilTask((player, context) => player.inventory.contains(<item:minecraft:diamond>))).run((player, context) => player.sendMessage("Вау, у тебя есть алмаз !"));
```
