Цветной текст в чате

Версия Minecraft
1.16.3
API
Forge
96
2
6
Всем привет! Я хочу сделать мод, на разные команды, как Essentials и нужно отправлять фидбек в чат.
И как в Essentials, я хочу, что-бы фидбек был цветным, например У игрока Player001 починен предмет Stick.
У меня сейчас это сделано так source.sendFeedback(new TranslationTextComponent("commands.time.night", source.getDisplayName()), true);
А мне нужен цветной текст. Как его сделать?
 
Решение
Например, требуется вывести У игрока Player001 починен предмет Stick
В лэнг файл пихаем че-то вроде
"repair_message" : "У игрока %s починен предмет %s"
В коде делаем че-то вроде:
Java:
new TranslationTextComponent("modid.repair_message",
                             TextFormatting.RED + player.getDisplayName() + TextFormatting.GOLD,
                             TextFormatting.RED + itemStack.getDisplayName())
        .mergeStyle(TextFormatting.GOLD, TextFormatting.BOLD)

Чтобы код в говно не превращался можно сделать хелпер-методы, по типу:
Java:
public static TextComponent translation(String translationKey, TextFormatting[] generalFormat, String... chunks){
    String gf =...
7,099
324
1,510
У меня маппинги mappings channel: 'snapshot', version: '20201028-1.16.3'
Видимо, у тебя другие. Поищи внутри IFormattableTextComponent метод, принимающий несколько TextFormatting1608746579567.png
 

sk9zist :l

Исправился
981
18
157
Java:
source.sendFeedback(new StringTextComponent(new TranslationTextComponent(TextFormatting.RED + "commands.time.night", source.getDisplayName())).mergeStyle(TextFormatting.GOLD + TextFormatting.BOLD), true);
 
7,099
324
1,510

sk9zist :l

Исправился
981
18
157
Зачем ты тогда юзаешь метод .func_240701_a_ если всё равно пихаешь туда только один аргумент 🤦‍♀️

С таким же успехом можно сделать так:
Java:
source.sendFeedback(new TranslationTextComponent("commands.times.night", source.getDisplayName())
                    .mergeStyle(TextFormatting.BLUE), true);

С двумя аргументами:
Java:
source.sendFeedback(new TranslationTextComponent("commands.times.night", source.getDisplayName())
                    .mergeStyle(TextFormatting.GOLD + TextFormatting.BOLD), true);
 
96
2
6
Зачем ты тогда юзаешь метод .func_240101_a_ если всё равно пихаешь туда только один аргумент 🤦‍♀️

С таким же успехом можно сделать так:
Java:
source.sendFeedback(new TranslationTextComponent("commands.times.night", source.getDisplayName())
.mergeStyle(TextFormatting.BLUE), true);
С двумя аргументами:
Java:
source.sendFeedback(new TranslationTextComponent("commands.times.night", source.getDisplayName())
.mergeStyle(TextFormatting.GOLD + TextFormatting.BOLD), true);
Ок, буду юзать .func_240699_a_
 

sk9zist :l

Исправился
981
18
157
Java:
new TranslationTextComponent("commands.times.night", source.getDisplayName()) + new TranslationTextComponent("commands.yous.night2", source.getDisplayName())
 
170
2
53
Может лучше сделать AdvancedTranslationTextComponent где в конечном итоге String#replaceAll("&", "§"), тогда можно будет все упростить, ставив & и код из цветовой палитры, тем самым приблизить всё к стандартам Bukkit, где сообщество больше?
 
7,099
324
1,510
С двумя аргументами:
Java:
source.sendFeedback(new TranslationTextComponent("commands.times.night", source.getDisplayName())
.mergeStyle(TextFormatting.GOLD + TextFormatting.BOLD), true);
Это работает? mergeStyle принимает в качестве аргумента TextFormatting, а в коде выше в него пихается строка
 
7,099
324
1,510
Например, требуется вывести У игрока Player001 починен предмет Stick
В лэнг файл пихаем че-то вроде
"repair_message" : "У игрока %s починен предмет %s"
В коде делаем че-то вроде:
Java:
new TranslationTextComponent("modid.repair_message",
                             TextFormatting.RED + player.getDisplayName() + TextFormatting.GOLD,
                             TextFormatting.RED + itemStack.getDisplayName())
        .mergeStyle(TextFormatting.GOLD, TextFormatting.BOLD)

Чтобы код в говно не превращался можно сделать хелпер-методы, по типу:
Java:
public static TextComponent translation(String translationKey, TextFormatting[] generalFormat, String... chunks){
    String gf = StringUtils.join(generalFormat);
    return new TranslationTextComponent(translationKey,
                                        Arrays.stream(chunks).map(i -> i + gf).toArray(String[]::new))
        .mergeStyle(generalFormat)
}

public static TextFormatting[] format(TextFormatting... formats){
    return formats;
}

//юз
import net.minecraft.util.text.TextFormatting.*
translation("modid.repair_message", format(RED, BOLD), RED+player.getDisplayName().getString(), RED+itemStack.getDisplayName())

Как конкатенировать 2 TranslationComponent?
new TranslationTextComponent("key1").append(new TranslationTextComponent("key2"));

append - мутабельная операция, она изменяет объект, от которого вызывается
 
Последнее редактирование:
Сверху