> 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/game/world.md).

# Мир и блоки

Чтение блоков, поиск по области, погода и время.

`world()` нужен для чтения блоков вокруг игрока, а также погоды и времени. Если мир ещё не прогрузился, любой блок читается как воздух.

```java
Block under = world().block(player().x(), player().y() - 1, player().z());
if (under.is("obsidian")) chat("Стою на обсидиане");
```

## Один блок

| Метод                   | Тип       | Описание                                                                   |
| ----------------------- | --------- | -------------------------------------------------------------------------- |
| `block(x, y, z)`        | `Block`   | данные блока по целым координатам                                          |
| `block(double x, y, z)` | `Block`   | по позиции; дробные координаты округляются вниз, как в самой игре          |
| `block(point)`          | `Block`   | по точке                                                                   |
| `air(x, y, z)`          | `boolean` | воздух ли в этой клетке; одно чтение мира без аллокаций                    |
| `solid(x, y, z)`        | `boolean` | твёрдый блок, в него можно упереться                                       |
| `liquid(x, y, z)`       | `boolean` | вода или лава                                                              |
| `replaceable(x, y, z)`  | `boolean` | на это место можно поставить блок                                          |
| `is(x, y, z, id)`       | `boolean` | сравнить id без создания `Block`; строка разбирается один раз и кешируется |
| `height(x, z)`          | `int`     | самый верхний непустой блок в колонке                                      |
| `loaded(x, z)`          | `boolean` | прогружен ли чанк                                                          |

`block(...)` каждый раз создаёт объект и сразу читает все свойства блока. Если нужно только одно свойство, лучше использовать `air`, `solid`, `liquid`, `replaceable` или `is`: они дешевле, особенно в циклах.

### Block

| Метод                                           | Тип       | Описание                                          |
| ----------------------------------------------- | --------- | ------------------------------------------------- |
| `id()`, `key()`                                 | `String`  | `"minecraft:obsidian"` и `"obsidian"`             |
| `is(value)`                                     | `boolean` | сравнить id, префикс `minecraft:` можно не писать |
| `x()`, `y()`, `z()`                             | `int`     | координаты                                        |
| `center()`                                      | `Point`   | центр блока                                       |
| `hardness()`                                    | `float`   | прочность; у неломаемых блоков отрицательная      |
| `air()`, `solid()`, `liquid()`, `replaceable()` | `boolean` | те же свойства, что в таблице выше                |

## Сканирование области

Для проверки большого числа блоков, например целого куба вокруг игрока, не стоит вызывать `block()` в тройном цикле. Для этого есть `scan` и `find`.

`scan` за один проход по секциям чанков возвращает одно свойство для каждого блока в кубе. Он не создаёт `BlockPos` и строк, а пустые секции и непрогруженные чанки пропускает. `find` работает так же, но ищет блоки с заданным id.

```java
int radius = 8;
boolean[] solid = world().scan(px, py, pz, radius, World.SOLID);
if (World.at(solid, radius, 0, -1, 0)) chat("Под ногами твёрдый блок");

int[] chests = world().find(px, py, pz, 32, "chest");
for (int i = 0; i < chests.length; i += 3) {
    waypoints().add("chest", chests[i], chests[i + 1], chests[i + 2], 20 * 30);
}
```

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

* `scan` возвращает плоский массив флагов. Флаг конкретного блока удобно получить через `World.at` со смещением от центра: `0, -1, 0` это блок прямо под игроком.
* `find` возвращает координаты подряд тройками, поэтому цикл идёт с шагом 3. На каждый найденный сундук ставится метка на 30 секунд.

| Метод                                 | Тип         | Описание                                                                       |
| ------------------------------------- | ----------- | ------------------------------------------------------------------------------ |
| `scan(x, y, z, radius, query)`        | `boolean[]` | флаги по всему кубу; `query` это `World.AIR`, `SOLID`, `LIQUID`, `REPLACEABLE` |
| `scan(x, y, z, radius, query, into)`  | `boolean[]` | то же, но в переданный массив; если размер подходит, новый массив не создаётся |
| `find(x, y, z, radius, id)`           | `int[]`     | тройки `x, y, z` найденных блоков, не больше `FIND_DEFAULT` штук               |
| `find(x, y, z, radius, id, limit)`    | `int[]`     | то же с заданным лимитом                                                       |
| `World.side(radius)`                  | `int`       | длина стороны куба, `radius * 2 + 1`                                           |
| `World.volume(radius)`                | `int`       | длина массива флагов                                                           |
| `World.index(radius, dx, dy, dz)`     | `int`       | индекс в массиве по смещению от центра, `-1` за пределами куба                 |
| `World.at(flags, radius, dx, dy, dz)` | `boolean`   | флаг по смещению; за пределами куба всегда `false`                             |

Пределы: `SCAN_RADIUS = 32`, `FIND_RADIUS = 64`, `FIND_LIMIT = 65536`, `FIND_DEFAULT = 4096`. Радиус больше предела без предупреждения урезается до предела.

## Погода и время

| Метод                       | Тип       | Описание                                                                       |
| --------------------------- | --------- | ------------------------------------------------------------------------------ |
| `loaded()`                  | `boolean` | прогружен ли мир                                                               |
| `dimension()`               | `String`  | измерение, например `"minecraft:overworld"`                                    |
| `raining()`, `thundering()` | `boolean` | идёт дождь, идёт гроза                                                         |
| `dayTime()`                 | `long`    | время суток 0..24000; если сервер сдвигает время, значение может быть неточным |
| `time()`                    | `long`    | сколько тиков прошло с создания мира                                           |
| `bottom()`, `top()`         | `int`     | нижняя и верхняя граница мира по высоте                                        |

Лучи от глаз, то есть определение блока, на который смотрит игрок, описаны на отдельной странице [Лучи и прицел](/game/raycast.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/game/world.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.
