# Feature Control

Канал: **`liteapi:feature-control`**

Общий протокол (формат пакетов, коды ошибок, rate limiting): [api](/api/protocol.md)

***

## `checkFeatures`

**Rate limit:** 1 запрос в 10 секунд на игрока.

### Запрос

```json
{
  "id":     "ffffffff-ffff-ffff-ffff-ffffffffffff",
  "method": "checkFeatures",
  "payload": {
    "client":   "my-mod-id",
    "features": ["xray", "fly", "speed", "zoom", "fullbright"]
  }
}
```

| Поле       | Тип        | Обязательно | Описание                                                                                                      |
| ---------- | ---------- | ----------- | ------------------------------------------------------------------------------------------------------------- |
| `client`   | `string`   | да          | Стабильный идентификатор вашего мода, например `"myclient"`. Используется для поиска персональных блокировок. |
| `features` | `string[]` | да          | Список активных функций мода, которые нужно проверить.                                                        |

Если одно из этих полей отсутствует — сервер ответит `BAD_REQUEST`.

### Ответ (успех)

Сервер возвращает **только те функции из вашего списка**, которые заблокированы. Если ничего не заблокировано — `blocklist` будет пустым массивом `[]`.

> **Важно:** заблокированная функция должна быть полностью скрыта от игрока — убрана из меню, настроек, подсказок и любых других UI-элементов. Недостаточно просто запретить её включение. Игрок не должен видеть даже упоминания функции, пока она в блок-листе.

```json
{
  "id":  "ffffffff-ffff-ffff-ffff-ffffffffffff",
  "ok":  true,
  "payload": {
    "blocklist": ["xray", "fly"]
  }
}
```

### Ответы при ошибках

```json
{ "id": "ffffffff-ffff-ffff-ffff-ffffffffffff", "ok": false, "error": "BAD_REQUEST",  "message": "'client' and 'features' are required" }
{ "id": "ffffffff-ffff-ffff-ffff-ffffffffffff", "ok": false, "error": "RATE_LIMITED", "message": "Too many requests" }
```

***

## Как работает блокировка

Функция считается заблокированной, если она находится:

* в **глобальном** блок-листе — применяется ко всем клиентам без исключения, или
* в **персональном** блок-листе для вашего `client` — применяется только к модам с этим идентификатором.

***

## Рекомендации

* **Когда вызывать:** сразу после подключения к серверу (`ClientPlayConnectionEvents.JOIN`), а также при включении новой функции, если вы хотите проверить её до активации.
* **`client`** — фиксированная строка, не UUID и не ник игрока. По ней сервер хранит персональные блокировки в базе данных, поэтому она не должна меняться между версиями мода.
* **Лимит запросов** — 1 в 10 секунд. Не опрашивайте сервер в цикле.


---

# 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.holyworld.me/api/feature.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.
