Пример:
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 <---> чат компоненты.