ChatColor mod forge 1.7.10

Версия Minecraft
1.7.10
Такая ситуцаия: Мод выводит цветное сообщение в чат только 1 строчки, 2 строчка идет уже без цвета(белая). Как сделать, чтобы все строчки были в одинаковом цвете?
Java:
ChatColor.RED + "Тестовый вывод сообщение из мода"
 
236
4
22
entityPlayer.addChatMessage(new ChatComponentText("Тестовый вывод сообщение из мода").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); //Весь текст красным будет
Дело в том, что forge при переходе на некст строку в чате берёт формат. чата от предка. А когда ты используешь § вместо ChatStyle - формат предка как раз будет дефолтный белый текст. Вот от сюда твоя беда. Решается использованием стилей, вместо параграфов. Если тебе надо разноцветную строчку - используй append метод для соединения нескольких "кусков" текста с разными чатСтайлами в 1 чат компонент.
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,454
598
2,890
Я вот не помню, либо это баг, либо можно было через нормальное формирование IChatComponent, как и задумывалось.
То есть создаёшь ChatComponent, у него достаешь Style и там задаёшь цвет.
 
entityPlayer.addChatMessage(new ChatComponentText("Тестовый вывод сообщение из мода").setChatStyle(new Chatstyle().setColor(EnumChatFormatting.RED))); //Весь текст красным будет
Дело в том, что forge при переходе на некст строку в чате берёт формат. чата от предка. А когда ты используешь § вместо ChatStyle - формат предка как раз будет дефолтный белый текст. Вот от сюда твоя беда. Решается использованием стилей, вместо параграфов. Если тебе надо разноцветную строчку - используй append метод для соединения нескольких "кусков" текста с разными чатСтайлами в 1 чат компонент.
Все понятно объяснили, но вот проблема с регистрацией класса.
Java:
import net.minecraft.util.ChatStyle;
 
Последнее редактирование:
7,099
324
1,509
Сорян, немного опечатался в названии класса. Правильно: ChatStyle (исправил)
Благодарю, все работает как надо. Можно где-то ознакомиться с методом append, чтобы собрать 1 сообщение с разными стилями из разных "кусков" ?
Java:
entityPlayer.addChatMessage(new ChatComponentText("Тестовый вывод сообщение из мода1").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED)).apppend(new ChatComponentText("Тестовый вывод сообщение из мода2").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GREEN))));
 
Последнее редактирование:
7,099
324
1,509
Java:
new ChatComponentText(
    colored("it's \n red \n text", EnumChatFormatting.RED) +
    colored("it's \n green \n text", EnumChatFormatting.GREEN)
);

public String colored(String text, EnumChatFormatting color){
    return color+text.replace("\n","\n"+color);
}
 
236
4
22
Благодарю, все работает как надо. Можно где-то ознакомиться с методом append, чтобы собрать 1 сообщение с разными стилями из разных "кусков" ?
Java:
entityPlayer.addChatMessage(new ChatComponentText("Тестовый вывод сообщение из мода1").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED)).apppend(new ChatComponentText("Тестовый вывод сообщение из мода2").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GREEN))));
Пример:


Сцепление компонентов чата:
IChatComponent cmp = new ChatComponentText("Привет, ");
cmp.getChatStyle().setColor(EnumChatFormatting.RED);
IChatComponent cmp2 = new ChatComponentText("мир!");
cmp2.getChatStyle().setColor(EnumChatFormatting.GREEN);
cmp.appendSibling(cmp2); //Вот тут мы как раз добавляем за первым компонентом второй компонет. Если бы добавили его без задания зелёного цвета - он тоже был бы красным (стиль наследуется), но мы его переопределили
entityPlayer.addChatMessage(cmp); //Отсылаем самый "первый" компонент, к которому уже прицепили дочерние
Вообще, всё сообщение чата является обычным Json, состоящим из элементов с разными чат стилями, и (если заданы) ховер и(или)клик ивентами. К добавляемым элементам наследуются свойства от родительского элемента. Если в добавляемом что-то изменено (например цвет, или выключили к примеру италик шрифт), то будет переопределён стиль. Можно в Sponge в принципе посмотреть конфиги плагинов - там как раз будет виден тот самый Json чат-сообщений. (Его кстати можно и в forge использовать, в IChatComponent интерфейсе где-то есть метод для сериализации и десериализации Json <---> чат компоненты.
 
Последнее редактирование:
236
4
22
Java:
new ChatComponentText(
    colored("it's \n red \n text", EnumChatFormatting.RED) +
    colored("it's \n green \n text", EnumChatFormatting.GREEN)
);

public String colored(String text, EnumChatFormatting color){
    return color+text.replace("\n","\n"+color);
}
Твой пример как раз приведёт к ошибке, по которой тема. Если 1 из String, передаваемых в colored будет слишком длинной и перенесётся на другую строку - она станет белой, т.к. ты тоже используешь § (в EnumChatFormatting toString() переопределён и из-за этого там просто подставляется параграф и цветовой код). Также ты допустил ещё 1 ошибку - использование \n. Майнкрафт не переваривает перенос строки через \n в чате, он просто заменит его на какой-то непонятный квадратик, вместо переноса строки. Хочешь на другую строку перейти - отправь несколько отдельных чат компонентов игроку подряд.
 
7,099
324
1,509
перенесётся на другую строку
А как она пренесется, если символ \n - пренос строки - определяется самое строкой и в коде задано, что каждому \n последует код форматирования?
Хочешь на другую строку перейти - отправь несколько отдельных чат компонентов игроку подряд.
Ок, а как тогда ТС добился переноса на другую строку и одновременной очистки форматирования, если у него несколько чат-компонентов?
FontRenderer#split чтоли делает разрезание со сбросом форматирования?
 
236
4
22
А как она пренесется, если символ \n - пренос строки - определяется самое строкой и в коде задано, что каждому \n последует код форматирования?
Ну прогони свой код в игре, передав длинные строки - увидишь. Да, у тебя перед \n подставится снова параграф, но в теме идёт речь об автоматическом переносе строк самим чатом, а не вручную. К тому же, как я и сказал, у тебя вместо переноса \n заменятся ка квадратики с иероглифом, говорю это, т.к. сам натыкался на такое.
 
236
4
22
Ок, а как тогда ТС добился переноса на другую строку и одновременной очистки форматирования, если у него несколько чат-компонентов?
FontRenderer#split чтоли делает разрезание со сбросом форматирования?
Текст чата рисуется через drawString в гуи. А drawString устроен так, что если встречает § с цвет. кодом - то он сам заменяет цвет идущего за ним текста. Если покопаться в коде рендера чата - то найдём там сплит полученных компонентов. Там идёт рисование макс. возможной длины текста в зависимости от ширины чата, а остальной "кусок" текста идёт на новую строку. Тут то майнкрафт и подставляет в начале новой строки (куда перешлёт текст с предыдущей) § в соответствии с текущем стилем компонента, который вычисляется через рекурсивный перебор стилей (от конечного к родительскому) с проверкой включен ли жирный и т.п. формат, на основе этого майн и пихает в начале некст строчки §)) А в ТС получается так, что стиля так такового нет - вот майнкрафт ничего и не подставляет - получаем белый дефолтный текст при автоматическом переносе из-за того, что строка длиннее ширины чата.
 
Пример:


Сцепление компонентов чата:
IChatComponent cmp = new ChatComponentText("Привет, ");
cmp.getChatStyle().setColor(EnumChatFormatting.RED);
IChatComponent cmp2 = new ChatComponentText("мир!");
cmp2.getChatStyle().setColor(EnumChatFormatting.GREEN);
cmp.appendComponent(cmp2); //Вот тут мы как раз добавляем за первым компонентом второй компонет. Если бы добавили его без задания зелёного цвета - он тоже был бы красным (стиль наследуется), но мы его переопределили
entityPlayer.addChatMessage(cmp); //Отсылаем самый "первый" компонент, к которому уже прицепили дочерние
Вообще, всё сообщение чата является обычным Json, состоящим из элементов с разными чат стилями, и (если заданы) ховер и(или)клик ивентами. К добавляемым элементам наследуются свойства от родительского элемента. Если в добавляемом что-то изменено (например цвет, или выключили к примеру италик шрифт), то будет переопределён стиль. Можно в Sponge в принципе посмотреть конфиги плагинов - там как раз будет виден тот самый Json чат-сообщений. (Его кстати можно и в forge использовать, в IChatComponent интерфейсе где-то есть метод для сериализации и десериализации Json <---> чат компоненты.
Теперь вот такая проблема: Не может найти символ "."
 
Последнее редактирование:
342
24
97
Пример:


Сцепление компонентов чата:
IChatComponent cmp = new ChatComponentText("Привет, ");
cmp.getChatStyle().setColor(EnumChatFormatting.RED);
IChatComponent cmp2 = new ChatComponentText("мир!");
cmp2.getChatStyle().setColor(EnumChatFormatting.GREEN);
cmp.appendComponent(cmp2); //Вот тут мы как раз добавляем за первым компонентом второй компонет. Если бы добавили его без задания зелёного цвета - он тоже был бы красным (стиль наследуется), но мы его переопределили
entityPlayer.addChatMessage(cmp); //Отсылаем самый "первый" компонент, к которому уже прицепили дочерние
Вообще, всё сообщение чата является обычным Json, состоящим из элементов с разными чат стилями, и (если заданы) ховер и(или)клик ивентами. К добавляемым элементам наследуются свойства от родительского элемента. Если в добавляемом что-то изменено (например цвет, или выключили к примеру италик шрифт), то будет переопределён стиль. Можно в Sponge в принципе посмотреть конфиги плагинов - там как раз будет виден тот самый Json чат-сообщений. (Его кстати можно и в forge использовать, в IChatComponent интерфейсе где-то есть метод для сериализации и десериализации Json <---> чат компоненты.
Java:
player.addChatMessage(new ChatComponentText("Привет, ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GREEN)).appendSibling(new ChatComponentText("мир").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))));
Вот так это проще делается, главное не запутаться.
 
Последнее редактирование:
342
24
97
Вот так:
Java:
sender.addChatMessage(new ChatComponentText("TEXT TEST 1 - RED, ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED)).appendSibling(new ChatComponentText("TEXT TEST 2 - AQUA,").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.AQUA))));
Ты второй setChatStyle применяешь на appendSibling, а нужно на ChatComponentText("TEXT TEST 2 - AQUA,")
 
236
4
22
Java:
player.addChatMessage(new ChatComponentText("Привет, ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GREEN)).appendSibling(new ChatComponentText("мир").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))));
Вот так это проще делается, главное не запутаться.
Ну писать код цепочкой никто не запрещал, просто тут как раз таки очень даже можно запутаться, особенно когда без IDE человек пишет... Если есть и IDE и плагин реинбоу брекетс - то ещё можно так.
 
Сверху