package net.minecraft.util; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.lang.reflect.Type; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; public interface IChatComponent extends Iterable { IChatComponent setChatStyle(ChatStyle style); ChatStyle getChatStyle(); /** * Appends the given text to the end of this component. */ IChatComponent appendText(String text); /** * Appends the given component to the end of this one. */ IChatComponent appendSibling(IChatComponent component); /** * Gets the text of this component, without any special formatting codes added, for chat. TODO: why is this two * different methods? */ String getUnformattedTextForChat(); /** * Gets the text of this component, without any special formatting codes added. TODO: why is this two different * methods? */ String getUnformattedText(); /** * Gets the text of this component, with formatting codes added for rendering. */ @SideOnly(Side.CLIENT) String getFormattedText(); /** * Gets the sibling components of this one. */ List getSiblings(); /** * Creates a copy of this component. Almost a deep copy, except the style is shallow-copied. */ IChatComponent createCopy(); public static class Serializer implements JsonDeserializer, JsonSerializer { private static final Gson GSON; private static final String __OBFID = "CL_00001263"; public IChatComponent deserialize(JsonElement p_deserialize_1_, Type p_deserialize_2_, JsonDeserializationContext p_deserialize_3_) { if (p_deserialize_1_.isJsonPrimitive()) { return new ChatComponentText(p_deserialize_1_.getAsString()); } else if (!p_deserialize_1_.isJsonObject()) { if (p_deserialize_1_.isJsonArray()) { JsonArray jsonarray1 = p_deserialize_1_.getAsJsonArray(); IChatComponent ichatcomponent = null; Iterator iterator = jsonarray1.iterator(); while (iterator.hasNext()) { JsonElement jsonelement1 = (JsonElement)iterator.next(); IChatComponent ichatcomponent1 = this.deserialize(jsonelement1, jsonelement1.getClass(), p_deserialize_3_); if (ichatcomponent == null) { ichatcomponent = ichatcomponent1; } else { ichatcomponent.appendSibling(ichatcomponent1); } } return ichatcomponent; } else { throw new JsonParseException("Don\'t know how to turn " + p_deserialize_1_.toString() + " into a Component"); } } else { JsonObject jsonobject = p_deserialize_1_.getAsJsonObject(); Object object; if (jsonobject.has("text")) { object = new ChatComponentText(jsonobject.get("text").getAsString()); } else { if (!jsonobject.has("translate")) { throw new JsonParseException("Don\'t know how to turn " + p_deserialize_1_.toString() + " into a Component"); } String s = jsonobject.get("translate").getAsString(); if (jsonobject.has("with")) { JsonArray jsonarray = jsonobject.getAsJsonArray("with"); Object[] aobject = new Object[jsonarray.size()]; for (int i = 0; i < aobject.length; ++i) { aobject[i] = this.deserialize(jsonarray.get(i), p_deserialize_2_, p_deserialize_3_); if (aobject[i] instanceof ChatComponentText) { ChatComponentText chatcomponenttext = (ChatComponentText)aobject[i]; if (chatcomponenttext.getChatStyle().isEmpty() && chatcomponenttext.getSiblings().isEmpty()) { aobject[i] = chatcomponenttext.getChatComponentText_TextValue(); } } } object = new ChatComponentTranslation(s, aobject); } else { object = new ChatComponentTranslation(s, new Object[0]); } } if (jsonobject.has("extra")) { JsonArray jsonarray2 = jsonobject.getAsJsonArray("extra"); if (jsonarray2.size() <= 0) { throw new JsonParseException("Unexpected empty array of components"); } for (int j = 0; j < jsonarray2.size(); ++j) { ((IChatComponent)object).appendSibling(this.deserialize(jsonarray2.get(j), p_deserialize_2_, p_deserialize_3_)); } } ((IChatComponent)object).setChatStyle((ChatStyle)p_deserialize_3_.deserialize(p_deserialize_1_, ChatStyle.class)); return (IChatComponent)object; } } private void serializeChatStyle(ChatStyle style, JsonObject object, JsonSerializationContext ctx) { JsonElement jsonelement = ctx.serialize(style); if (jsonelement.isJsonObject()) { JsonObject jsonobject1 = (JsonObject)jsonelement; Iterator iterator = jsonobject1.entrySet().iterator(); while (iterator.hasNext()) { Entry entry = (Entry)iterator.next(); object.add((String)entry.getKey(), (JsonElement)entry.getValue()); } } } public JsonElement serialize(IChatComponent p_serialize_1_, Type p_serialize_2_, JsonSerializationContext p_serialize_3_) { if (p_serialize_1_ instanceof ChatComponentText && p_serialize_1_.getChatStyle().isEmpty() && p_serialize_1_.getSiblings().isEmpty()) { return new JsonPrimitive(((ChatComponentText)p_serialize_1_).getChatComponentText_TextValue()); } else { JsonObject jsonobject = new JsonObject(); if (!p_serialize_1_.getChatStyle().isEmpty()) { this.serializeChatStyle(p_serialize_1_.getChatStyle(), jsonobject, p_serialize_3_); } if (!p_serialize_1_.getSiblings().isEmpty()) { JsonArray jsonarray = new JsonArray(); Iterator iterator = p_serialize_1_.getSiblings().iterator(); while (iterator.hasNext()) { IChatComponent ichatcomponent1 = (IChatComponent)iterator.next(); jsonarray.add(this.serialize(ichatcomponent1, ichatcomponent1.getClass(), p_serialize_3_)); } jsonobject.add("extra", jsonarray); } if (p_serialize_1_ instanceof ChatComponentText) { jsonobject.addProperty("text", ((ChatComponentText)p_serialize_1_).getChatComponentText_TextValue()); } else { if (!(p_serialize_1_ instanceof ChatComponentTranslation)) { throw new IllegalArgumentException("Don\'t know how to serialize " + p_serialize_1_ + " as a Component"); } ChatComponentTranslation chatcomponenttranslation = (ChatComponentTranslation)p_serialize_1_; jsonobject.addProperty("translate", chatcomponenttranslation.getKey()); if (chatcomponenttranslation.getFormatArgs() != null && chatcomponenttranslation.getFormatArgs().length > 0) { JsonArray jsonarray1 = new JsonArray(); Object[] aobject = chatcomponenttranslation.getFormatArgs(); int i = aobject.length; for (int j = 0; j < i; ++j) { Object object = aobject[j]; if (object instanceof IChatComponent) { jsonarray1.add(this.serialize((IChatComponent)object, object.getClass(), p_serialize_3_)); } else { jsonarray1.add(new JsonPrimitive(String.valueOf(object))); } } jsonobject.add("with", jsonarray1); } } return jsonobject; } } public static String componentToJson(IChatComponent component) { return GSON.toJson(component); } public static IChatComponent jsonToComponent(String json) { return (IChatComponent)GSON.fromJson(json, IChatComponent.class); } public JsonElement serialize(Object p_serialize_1_, Type p_serialize_2_, JsonSerializationContext p_serialize_3_) { return this.serialize((IChatComponent)p_serialize_1_, p_serialize_2_, p_serialize_3_); } static { GsonBuilder var0 = new GsonBuilder(); var0.registerTypeHierarchyAdapter(IChatComponent.class, new IChatComponent.Serializer()); var0.registerTypeHierarchyAdapter(ChatStyle.class, new ChatStyle.Serializer()); var0.registerTypeAdapterFactory(new EnumTypeAdapterFactory()); GSON = var0.create(); } } }