> 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/ui/text.md).

# Оформленный текст

Текст с цветами, стилями и градиентами, а также свои шрифты.

`Text` нужен, чтобы оформить части строки по-разному: например, сделать ник цели с градиентом, а здоровье зелёным. Если стандартных шрифтов не хватает, можно подключить свой.

## Text

`Text` собирается из кусков, и у каждого куска может быть свой цвет, стиль или градиент. Одну и ту же сборку можно и отправить в чат, и нарисовать на экране. Цвет и стили применяются к последнему добавленному куску, поэтому их нужно указывать сразу после `append`.

```java
Text line = Text.of("цель: ").color(0xFF8A8A8A)
        .append(target.name()).gradient(0xFF41C4C8, 0xFF8A5CF6).bold()
        .append(" " + (int) target.health() + " hp").color(0xFF57D977);

chat().print(line);
render.drawText("sf_rounded_semibold", line, 10f, 10f, 7f, 0f);
```

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

* Слово «цель:» серое, ник цели жирный и с градиентом, здоровье зелёное.
* Одна и та же строка печатается в чат и рисуется на экране, собирать её второй раз не нужно.

| Метод                                                      | Тип       | Описание                                                                            |
| ---------------------------------------------------------- | --------- | ----------------------------------------------------------------------------------- |
| `Text.of(value)`                                           | `Text`    | начать сборку с первого куска                                                       |
| `Text.empty()`                                             | `Text`    | пустая сборка                                                                       |
| `append(value)`                                            | `Text`    | добавить кусок                                                                      |
| `append(other)`                                            | `Text`    | дописать куски другой сборки вместе с их оформлением                                |
| `color(argb)`                                              | `Text`    | покрасить последний кусок                                                           |
| `gradient(from, to)`                                       | `Text`    | бегущий градиент на последний кусок                                                 |
| `gradient(from, to, power, speed)`                         | `Text`    | `power` это длина волны в символах, `speed` скорость, при 0 градиент стоит на месте |
| `bold()`, `italic()`, `underline()`, `strike()`, `magic()` | `Text`    | стили последнего куска                                                              |
| `value(value)`                                             | `Text`    | заменить текст последнего куска, оформление сохранится                              |
| `string()`                                                 | `String`  | текст без оформления                                                                |
| `parts()`                                                  | `int`     | количество кусков                                                                   |
| `partText(i)`, `partColor(i)`                              | нет       | доступ к кускам, если они рисуются вручную                                          |
| `animated()`                                               | `boolean` | есть бегущий градиент, значит строку нужно рисовать каждый кадр                     |

Оформленный текст возвращает и сам Quick: `Entity.displayName()`, `Scoreboard.lineText(i)`, `Tab.teamPrefixText(team)`, `ChatEvent.text()`.

## Шрифты

Quick рисует текст MSDF-шрифтами. Встроены `sf_rounded_bold`, `sf_rounded_semibold` и `sf_rounded_medium`. Свой шрифт состоит из двух файлов в `resources/` jar-файла скрипта: `имя.png` (атлас) и `имя.json` (раскладка). Quick скопирует их в пак и перезагрузит ресурсы.

```java
private final FontFace title = fonts().register("title", "fonts/title");

@Override
public void onRender2D(Render2D render) {
    if (!title.ready()) return;
    render.drawText(title.name(), "quick", 8f, 8f, 7f, 0f, 0xFF41C4C8);
}
```

### FontRegistry

| Метод                       | Тип        | Описание                                                                        |
| --------------------------- | ---------- | ------------------------------------------------------------------------------- |
| `names()`                   | `String[]` | встроенные шрифты и уже зарегистрированные свои                                 |
| `of(name)`                  | `FontFace` | хэндл известного шрифта; у незнакомого `ready()` вернёт `false`                 |
| `register(name, assetPath)` | `FontFace` | берёт пару `assetPath.png/.json` из `resources/` и регистрирует под этим именем |
| `error(name)`               | `String`   | причина, по которой шрифт не загрузился, или `null`                             |

### FontFace

| Метод               | Тип       | Описание                                         |
| ------------------- | --------- | ------------------------------------------------ |
| `name()`            | `String`  | имя, которое передаётся в `drawText`             |
| `width(text, size)` | `float`   | ширина строки                                    |
| `height(size)`      | `float`   | высота строки                                    |
| `ready()`           | `boolean` | загрузился ли шрифт; пока `false`, рисовать рано |
| `error()`           | `String`  | текст ошибки или `null`                          |

Шрифт лучше регистрировать в конструкторе или прямо в поле. Если файлы не поменялись, повторно они не перезаписываются, но первый кадр до `ready()` всё равно придётся подождать. Атлас и раскладку можно сделать через `msdf-atlas-gen` с типом `mtsdf` и осью Y снизу.


---

# 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/ui/text.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.
