# Секвенция

Находится он в <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("Вау, у тебя есть алмаз !"));
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.aegis-mine.ru/modifications/sozdanie-kontenta/crafttweaker/minecraft-1.19.2/sekvenciya.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
