diff options
Diffstat (limited to 'src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java')
-rw-r--r-- | src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java new file mode 100644 index 00000000..2e163f2f --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java @@ -0,0 +1,118 @@ +package org.bukkit.craftbukkit.util; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import net.minecraft.server.ChatComponentText; +import net.minecraft.server.ChatModifier; +import net.minecraft.server.EnumChatFormat; +import net.minecraft.server.IChatBaseComponent; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; + +public final class CraftChatMessage { + private static class FromString { + private static final Map<Character, EnumChatFormat> formatMap; + + static { + Builder<Character, EnumChatFormat> builder = ImmutableMap.builder(); + for (EnumChatFormat format : EnumChatFormat.values()) { + builder.put(format.getChar(), format); + } + formatMap = builder.build(); + } + + private final List<IChatBaseComponent> list = new ArrayList<IChatBaseComponent>(); + private IChatBaseComponent currentChatComponent = new ChatComponentText(""); + private ChatModifier modifier = new ChatModifier(); + private StringBuilder builder = new StringBuilder(); + private final IChatBaseComponent[] output; + + private FromString(String message) { + if (message == null) { + output = new IChatBaseComponent[] { new ChatComponentText("") }; + return; + } + + EnumChatFormat format = null; + + for (int i = 0; i < message.length(); i++) { + char currentChar = message.charAt(i); + if (currentChar == '\u00A7' && (i < (message.length() - 1)) && (format = formatMap.get(message.charAt(i + 1))) != null) { + if (builder.length() > 0) { + appendNewComponent(); + } + + if (format == EnumChatFormat.RESET) { + modifier = new ChatModifier(); + } else if (format.isFormat()) { + switch (format) { + case BOLD: + modifier.setBold(Boolean.TRUE); + break; + case ITALIC: + modifier.setItalic(Boolean.TRUE); + break; + case STRIKETHROUGH: + modifier.setStrikethrough(Boolean.TRUE); + break; + case UNDERLINE: + modifier.setUnderline(Boolean.TRUE); + break; + case RANDOM: + modifier.setRandom(Boolean.TRUE); + break; + default: + throw new AssertionError("Unexpected message format"); + } + } else { // Color resets formatting + modifier = new ChatModifier().setColor(format); + } + i++; + } else if (currentChar == '\n') { + if (builder.length() > 0) { + finishComponent(); + } + } else { + builder.append(currentChar); + } + } + + if (builder.length() > 0) { + finishComponent(); + } + + if (list.isEmpty()) { + list.add(new ChatComponentText("")); + } + + output = list.toArray(new IChatBaseComponent[0]); + } + + private void appendNewComponent() { + IChatBaseComponent addition = new ChatComponentText(builder.toString()).setChatModifier(modifier); + builder = new StringBuilder(); + modifier = modifier.clone(); + currentChatComponent = currentChatComponent.a(addition); + } + + private void finishComponent() { + appendNewComponent(); + list.add(currentChatComponent); + currentChatComponent = new ChatComponentText(""); + } + + private IChatBaseComponent[] getOutput() { + return output; + } + } + + public static IChatBaseComponent[] fromString(String message) { + return new FromString(message).getOutput(); + } + + private CraftChatMessage() { + } +} |