Щоразу, коли Minecraft промальовує текст у грі, він, ймовірно, визначається за допомогою об’єкта Component. Цей настроюваний тип використовується замість String, щоб уможливити розширене форматування, включаючи кольори, жирність, обфускацію та події натискання. Вони також забезпечують легкий доступ до системи перекладу, що полегшує переклад будь-якого елемента інтерфейсу різними мовами.
Якщо ви раніше працювали з пакетами даних або функціями, ви можете побачити паралелі з текстовим форматом json, який використовується серед іншого для показуваних імен, книг і табличок. Як ви, мабуть, здогадалися, це лише json-представлення об’єкта Component, і його можна перетворити в і з нього за допомогою Component.Serializer.
Коли створюєте мод, зазвичай краще створювати об’єкти Component безпосередньо у коді, використовуючи переклади, коли це можливо.
Буквені текстові компоненти
Найпростіший спосіб створити об’єкт Component — створити літерал. Це просто рядок, який промальовуватиметься як є, усталено без жодного форматування.
Вони створюються за допомогою методів Component.nullToEmpty або Component.literal, які обидва діють трохи по різному. Component.nullToEmptyприймає нульові значення як вхідні дані та повертає екземплярComponent. На відміну від цього, Component.literalне повинен мати нульовий вхід, але повертаєMutableComponent, це підклас Component`, який можна легко стилізувати та об’єднувати. Про це пізніше.
java
Component literal = Component.nullToEmpty("Hello, world!");
MutableComponent mutable = Component.literal("Hello, world!");
// Keep in mind that a MutableComponent can be used as a Component, making this valid:
Component mutableAsText = mutable;1
2
3
4
2
3
4
Перекладувані текстові компоненти
Якщо ви хочете надати кілька перекладів для одного рядка тексту, ви можете використовувати метод Component.translatable для посилання на ключ перекладу в будь-якому мовному файлі. Якщо ключ не існує, ключ перекладу перетворюється на літерал.
java
Component translatable = Component.translatable("example-mod.text.hello");
// Similarly to literals, translatable text can be easily made mutable.
MutableComponent mutable = Component.translatable("example-mod.text.bye");1
2
3
4
2
3
4
Мовний файл en_us.json, виглядає так:
json
{
"example-mod.text.hello": "Hello!",
"example-mod.text.bye": "Goodbye :("
}1
2
3
4
2
3
4
Якщо ви хочете мати можливість використовувати змінні в перекладі, подібно до того, як повідомлення про смерть дозволяють використовувати залучених гравців і предмети в перекладі, ви можете додати зазначені змінні як параметри. Ви можете додати скільки завгодно параметрів.
java
Component translatable = Component.translatable("example-mod.text.hello", player.getDisplayName());1
Ви можете посилатися на ці змінні в перекладі так:
json
{
"example-mod.text.hello": "%1$s said hello!"
}1
2
3
2
3
У грі %1$s буде замінено іменем гравця, якого ви згадали в коді. Використання player.getDisplayName() зробить так, що додаткова інформація про сутність з’явиться у спливній підказці під час наведення курсора на ім’я в повідомленні чату, на відміну від використання player.getName(), який все одно отримає назву; однак він не показуватиме додаткових деталей. Подібне можна зробити з itemStacks, використовуючи stack.getDisplayName().
Щодо того, що взагалі означає %1$s, все, що вам справді потрібно знати, це те, що число відповідає змінній, яку ви намагаєтеся використати. Припустімо, у вас є три змінні, які ви використовуєте.
java
Component translatable = Component.translatable("example-mod.text.whack.item", victim.getDisplayName(), attacker.getDisplayName(), itemStack.toHoverableText());1
Якщо ви хочете вказати, хто в нашому випадку є зловмисником, ви б використовували %2$s, оскільки це друга змінна, яку ми передали. Так само %3$s посилається на itemStack. Переклад із такою кількістю додаткових параметрів може виглядати так:
json
{
"example-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();
MutableComponent mutable = Component.translatable("example-mod.text.bye");
String json = gson.toJson(ComponentSerialization.CODEC.encodeStart(JsonOps.INSTANCE, mutable).getOrThrow());1
2
3
2
3
Це створює JSON, який можна використовувати в пакетах даних, командах та інших місцях, які приймають формат тексту JSON замість літерального або перекладаного тексту.
Десеріалізація тексту
Крім того, щоб десеріалізувати текстовий об’єкт JSON у справжній клас Component, знову скористайтеся кодеком.
java
String jsonString = "...";
Component deserialized = ComponentSerialization.CODEC
.decode(JsonOps.INSTANCE, gson.fromJson(jsonString, JsonElement.class))
.getOrThrow()
.getFirst();1
2
3
4
5
2
3
4
5
Форматування тексту
Ви можете бути знайомі зі стандартами форматування Minecraft:
Ви можете застосувати ці стилі форматування за допомогою переліку ChatFormatting у класі MutableComponent:
java
MutableComponent result = Component.literal("Hello World!")
.withStyle(ChatFormatting.AQUA, ChatFormatting.BOLD, ChatFormatting.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 |


