> For the complete documentation index, see [llms.txt](https://docs.quickclient.cc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.quickclient.cc/actions/packets.md).

# Пакеты

Чтение и отмена пакетов в событиях и отправка своих пакетов.

Этот раздел нужен, чтобы видеть обмен пакетами с сервером, отменять лишние пакеты и отправлять свои. Пакеты читаются в событиях `packetSend` и `packetReceive`, которые передают `PacketInfo` с данными пакета. Для сборки и отправки пакетов, которые неудобно создавать вручную, есть `packets()`.

```java
on("packetReceive", event -> {
    PacketInfo packet = (PacketInfo) event.payload();
    if (packet.is("SetHeldSlot")) event.cancel();
});

packets().send(packets().swing(false));
packets().send(packets().look(yaw, pitch, true, false));
```

## Как это работает

* Обработчик отменяет пакет, которым сервер переключает слот в руке игрока.
* Ниже отправляются взмах основной рукой и поворот.

## PacketInfo

`PacketInfo` доступен только внутри обработчика. Quick переиспользует эти объекты, поэтому нужные значения сохраняйте сразу. Если тип пакета неизвестен, у него есть только `type()`, полей нет.

| Метод                       | Тип        | Описание                                                                                            |
| --------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
| `type()`                    | `String`   | простое имя класса пакета, например `ClientboundSetHeldSlotPacket`; у вложенных классов через точку |
| `is(name)`                  | `boolean`  | содержит ли тип эту строку без учёта регистра: подойдёт `"SetHeldSlot"`                             |
| `incoming()`, `outgoing()`  | `boolean`  | пришёл от сервера или уходит на сервер                                                              |
| `has(key)`                  | `boolean`  | разобрано ли поле                                                                                   |
| `keys()`                    | `String[]` | имена разобранных полей                                                                             |
| `getInt(key, fallback)`     | `int`      | целое поле                                                                                          |
| `getDouble(key, fallback)`  | `double`   | дробное поле                                                                                        |
| `getBoolean(key, fallback)` | `boolean`  | флаг; число считается `true`, если оно не ноль                                                      |
| `getString(key, fallback)`  | `String`   | строка; число возвращается в виде текста                                                            |

Чтобы узнать, какие поля есть у пакета, выведите его через `log().info(packet.toString())`: в лог попадут тип и все ключи.

## Сборка и отправка

Пакет, отправленный скриптом, тоже проходит через `packetSend`, как и любой другой.

| Метод                                            | Тип       | Описание                                     |
| ------------------------------------------------ | --------- | -------------------------------------------- |
| `send(packet)`                                   | `boolean` | отправить; `false`, если нет соединения      |
| `name(packet)`                                   | `String`  | имя класса пакета                            |
| `is(packet, name)`                               | `boolean` | проверить по имени                           |
| `position(x, y, z, onGround, collision)`         | `Object`  | пакет позиции                                |
| `look(yaw, pitch, onGround, collision)`          | `Object`  | пакет поворота                               |
| `onGround(onGround, collision)`                  | `Object`  | только флаги, без координат                  |
| `attack(entity)`                                 | `Object`  | удар                                         |
| `interact(entity, offhand, sneaking)`            | `Object`  | взаимодействие с сущностью                   |
| `interactAt(entity, x, y, z, offhand, sneaking)` | `Object`  | взаимодействие в точке относительно сущности |
| `slot(hotbar)`                                   | `Object`  | смена слота хотбара                          |
| `swing(offhand)`                                 | `Object`  | взмах рукой                                  |
| `blockAction(action, x, y, z, side)`             | `Object`  | действие с блоком или предметом              |
| `playerCommand(action)`                          | `Object`  | команда состояния игрока                     |
| `closeContainer(containerId)`                    | `Object`  | закрыть контейнер                            |
| `respawn()`                                      | `Object`  | возродиться                                  |
| `useItem(offhand, sequence, yaw, pitch)`         | `Object`  | использовать предмет в руке                  |

Константы из `Packets`:

| Группа          | Значения                                                                                     |
| --------------- | -------------------------------------------------------------------------------------------- |
| `blockAction`   | `START_DIG`, `ABORT_DIG`, `STOP_DIG`, `DROP_STACK`, `DROP_ITEM`, `RELEASE_USE`, `SWAP_HANDS` |
| стороны         | `DOWN`, `UP`, `NORTH`, `SOUTH`, `WEST`, `EAST`                                               |
| `playerCommand` | `SPRINT_START`, `SPRINT_STOP`, `ELYTRA`, `STOP_SLEEPING`, `OPEN_INVENTORY`                   |

Приседания в `playerCommand` нет: начиная с 26.2 оно передаётся во входном пакете. Для приседа используйте `control().sneaking(boolean)`.

Если нужного пакета здесь нет, отправьте его через миксин, см. [Миксины и хуки](/extras/mixins.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.quickclient.cc/actions/packets.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
