Щоразу, коли Minecraft промальовує текст у грі, він, ймовірно, визначається за допомогою об’єкта Text. Цей настроюваний тип використовується замість String, щоб уможливити розширене форматування, включаючи кольори, жирність, обфускацію та події натискання. Вони також забезпечують легкий доступ до системи перекладу, що полегшує переклад будь-якого елемента інтерфейсу різними мовами.
Якщо ви раніше працювали з пакетами даних або функціями, ви можете побачити паралелі з текстовим форматом json, який використовується серед іншого для показуваних імен, книг і табличок. Як ви, мабуть, здогадалися, це лише json-представлення об’єкта Text, і його можна перетворити в і з нього за допомогою Text.Serializer.
Коли створюєте мод, зазвичай краще створювати об’єкти Текст безпосередньо у коді, використовуючи переклади, коли це можливо.
Текстові літерали
Найпростіший спосіб створити об’єкт Text — створити літерал. Це просто рядок, який промальовуватиметься як є, за замовчуванням без жодного форматування.
Вони створюються за допомогою методів Text.of або Text.literal, які обидва діють трохи по різному. Text.of приймає нульові значення як вхідні дані та повертає екземпляр Text. На відміну від цього, Text.literal не повинен мати нульовий вхід, але повертає MutableText, це підклас Text, який можна легко стилізувати та об’єднувати. Про це пізніше.
java
Text literal = Text.of("Hello, world!");
MutableText mutable = Text.literal("Hello, world!");
// Keep in mind that a MutableText can be used as a Text, making this valid:
Text mutableAsText = mutable;1
2
3
4
2
3
4
Текст, який можна перекласти
Якщо ви хочете надати кілька перекладів для одного рядка тексту, ви можете використовувати метод Text.translatable для посилання на ключ перекладу в будь-якому мовному файлі. Якщо ключ не існує, ключ перекладу перетворюється на літерал.
java
Text translatable = Text.translatable("my_mod.text.hello");
// Similarly to literals, translatable text can be easily made mutable.
MutableText mutable = Text.translatable("my_mod.text.bye");1
2
3
4
2
3
4
Мовний файл en_us.json, виглядає так:
json
{
"my_mod.text.hello": "Hello!",
"my_mod.text.bye": "Goodbye :("
}1
2
3
4
2
3
4
Якщо ви хочете мати можливість використовувати змінні в перекладі, подібно до того, як повідомлення про смерть дозволяють використовувати залучених гравців і предмети в перекладі, ви можете додати зазначені змінні як параметри. Ви можете додати скільки завгодно параметрів.
java
Text translatable = Text.translatable("my_mod.text.hello", player.getDisplayName());1
Ви можете посилатися на ці змінні в перекладі так:
json
{
"my_mod.text.hello": "%1$s said hello!"
}1
2
3
2
3
У грі %1$s буде замінено іменем гравця, якого ви згадали в коді. Використання player.getDisplayName() зробить так, що додаткова інформація про сутність з’явиться у спливній підказці під час наведення курсора на ім’я в повідомленні чату, на відміну від використання player.getName(), який все одно отримає назву; однак він не показуватиме додаткових деталей. Подібне можна зробити з itemStacks, використовуючи stack.toHoverableText().
Щодо того, що взагалі означає %1$s, все, що вам справді потрібно знати, це те, що число відповідає змінній, яку ви намагаєтеся використати. Припустімо, у вас є три змінні, які ви використовуєте.
java
Text translatable = Text.translatable("my_mod.text.whack.item", victim.getDisplayName(), attacker.getDisplayName(), itemStack.toHoverableText());1
Якщо ви хочете вказати, хто в нашому випадку є зловмисником, ви б використовували %2$s, оскільки це друга змінна, яку ми передали. Так само %3$s посилається на itemStack. Переклад із такою кількістю додаткових параметрів може виглядати так:
json
{
"my_mod.text.whack.item": "%1$s was whacked by %2$s using %3$s"
}1
2
3
2
3
Серіалізація тексту
Як згадувалося раніше, ви можете серіалізувати текст у JSON за допомогою текстового кодека. Додаткову інформацію про кодеки див. на сторінці Кодек.
java
Gson gson = new Gson();
MutableText mutable = Text.translatable("my_mod.text.bye");
String json = gson.toJson(TextCodecs.CODEC.encodeStart(JsonOps.INSTANCE, mutable).getOrThrow());1
2
3
2
3
Це створює JSON, який можна використовувати в пакетах даних, командах та інших місцях, які приймають формат тексту JSON замість літерального або перекладаного тексту.
Десеріалізація тексту
Крім того, щоб десеріалізувати текстовий об’єкт JSON у справжній клас Text, знову скористайтеся кодеком.
java
String jsonString = "...";
Text deserialized = TextCodecs.CODEC
.decode(JsonOps.INSTANCE, gson.fromJson(jsonString, JsonElement.class))
.getOrThrow()
.getFirst();1
2
3
4
5
2
3
4
5
Форматування тексту
Ви можете бути знайомі зі стандартами форматування Minecraft:
Ви можете застосувати ці стилі форматування за допомогою переліку Formatting класу MutableText:
java
MutableText result = Text.literal("Hello World!")
.formatted(Formatting.AQUA, Formatting.BOLD, Formatting.UNDERLINE);1
2
2
| Колір | Назва | Код чату | MOTD-код | Hex-код |
|---|---|---|---|---|
Чорний<0/>black | §0 | \u00A70 | #000000 | |
Темно-синій<0/>dark_blue | §1 | \u00A71 | #0000AA | |
Темно-зеленийdark_green | §2 | \u00A72 | #00AA00 | |
| Темно-водянистий | §3 | \u00A73 | #00AAAA | |
Темно-червонийdark_red | §4 | \u00A74 | #AA0000 | |
Темно-dark_purple | §5 | \u00A75 | #AA00AA | |
Золотийgold | §6 | \u00A76 | #FFAA00 | |
Сірийgray | §7 | \u00A77 | #AAAAAA | |
Темно-сірийdark_gray | §8 | \u00A78 | #555555 | |
Синійblue | §9 | \u00A79 | #5555FF | |
Зеленийgreen | §a | \u00A7a | #55FF55 | |
Водянистийaqua | §b | \u00A7b | #55FFFF | |
Червонийred | §c | \u00A7c | #FF5555 | |
Світло-фіолетовийlight_purple | §d | \u00A7d | #FF55FF | |
Жовтийyellow | §e | \u00A7e | #FFFF55 | |
Білийwhite | §f | \u00A7f | #FFFFFF | |
| Скидання форматування | §r | |||
| Жирний | §l | |||
§m | ||||
| Підкреслений | §n | |||
| Курсив | §o | |||
| Зашифрований | §k |


