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 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 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 var11 = p_deserialize_1_.getAsJsonArray(); IChatComponent var12 = null; Iterator var15 = var11.iterator(); while (var15.hasNext()) { JsonElement var17 = (JsonElement)var15.next(); IChatComponent var18 = this.deserialize(var17, var17.getClass(), p_deserialize_3_); if (var12 == null) { var12 = var18; } else { var12.appendSibling(var18); } } return var12; } else { throw new JsonParseException("Don\'t know how to turn " + p_deserialize_1_.toString() + " into a Component"); } } else { JsonObject var4 = p_deserialize_1_.getAsJsonObject(); Object var5; if (var4.has("text")) { var5 = new ChatComponentText(var4.get("text").getAsString()); } else if (var4.has("translate")) { String var6 = var4.get("translate").getAsString(); if (var4.has("with")) { JsonArray var7 = var4.getAsJsonArray("with"); Object[] var8 = new Object[var7.size()]; for (int var9 = 0; var9 < var8.length; ++var9) { var8[var9] = this.deserialize(var7.get(var9), p_deserialize_2_, p_deserialize_3_); if (var8[var9] instanceof ChatComponentText) { ChatComponentText var10 = (ChatComponentText)var8[var9]; if (var10.getChatStyle().isEmpty() && var10.getSiblings().isEmpty()) { var8[var9] = var10.getChatComponentText_TextValue(); } } } var5 = new ChatComponentTranslation(var6, var8); } else { var5 = new ChatComponentTranslation(var6, new Object[0]); } } else if (var4.has("score")) { JsonObject var13 = var4.getAsJsonObject("score"); if (!var13.has("name") || !var13.has("objective")) { throw new JsonParseException("A score component needs a least a name and an objective"); } var5 = new ChatComponentScore(JsonUtils.getJsonObjectStringFieldValue(var13, "name"), JsonUtils.getJsonObjectStringFieldValue(var13, "objective")); if (var13.has("value")) { ((ChatComponentScore)var5).func_179997_b(JsonUtils.getJsonObjectStringFieldValue(var13, "value")); } } else { if (!var4.has("selector")) { throw new JsonParseException("Don\'t know how to turn " + p_deserialize_1_.toString() + " into a Component"); } var5 = new ChatComponentSelector(JsonUtils.getJsonObjectStringFieldValue(var4, "selector")); } if (var4.has("extra")) { JsonArray var14 = var4.getAsJsonArray("extra"); if (var14.size() <= 0) { throw new JsonParseException("Unexpected empty array of components"); } for (int var16 = 0; var16 < var14.size(); ++var16) { ((IChatComponent)var5).appendSibling(this.deserialize(var14.get(var16), p_deserialize_2_, p_deserialize_3_)); } } ((IChatComponent)var5).setChatStyle((ChatStyle)p_deserialize_3_.deserialize(p_deserialize_1_, ChatStyle.class)); return (IChatComponent)var5; } } private void serializeChatStyle(ChatStyle style, JsonObject object, JsonSerializationContext ctx) { JsonElement var4 = ctx.serialize(style); if (var4.isJsonObject()) { JsonObject var5 = (JsonObject)var4; Iterator var6 = var5.entrySet().iterator(); while (var6.hasNext()) { Entry var7 = (Entry)var6.next(); object.add((String)var7.getKey(), (JsonElement)var7.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 var4 = new JsonObject(); if (!p_serialize_1_.getChatStyle().isEmpty()) { this.serializeChatStyle(p_serialize_1_.getChatStyle(), var4, p_serialize_3_); } if (!p_serialize_1_.getSiblings().isEmpty()) { JsonArray var5 = new JsonArray(); Iterator var6 = p_serialize_1_.getSiblings().iterator(); while (var6.hasNext()) { IChatComponent var7 = (IChatComponent)var6.next(); var5.add(this.serialize(var7, var7.getClass(), p_serialize_3_)); } var4.add("extra", var5); } if (p_serialize_1_ instanceof ChatComponentText) { var4.addProperty("text", ((ChatComponentText)p_serialize_1_).getChatComponentText_TextValue()); } else if (p_serialize_1_ instanceof ChatComponentTranslation) { ChatComponentTranslation var11 = (ChatComponentTranslation)p_serialize_1_; var4.addProperty("translate", var11.getKey()); if (var11.getFormatArgs() != null && var11.getFormatArgs().length > 0) { JsonArray var14 = new JsonArray(); Object[] var16 = var11.getFormatArgs(); int var8 = var16.length; for (int var9 = 0; var9 < var8; ++var9) { Object var10 = var16[var9]; if (var10 instanceof IChatComponent) { var14.add(this.serialize((IChatComponent)var10, var10.getClass(), p_serialize_3_)); } else { var14.add(new JsonPrimitive(String.valueOf(var10))); } } var4.add("with", var14); } } else if (p_serialize_1_ instanceof ChatComponentScore) { ChatComponentScore var12 = (ChatComponentScore)p_serialize_1_; JsonObject var15 = new JsonObject(); var15.addProperty("name", var12.func_179995_g()); var15.addProperty("objective", var12.func_179994_h()); var15.addProperty("value", var12.getUnformattedTextForChat()); var4.add("score", var15); } else { if (!(p_serialize_1_ instanceof ChatComponentSelector)) { throw new IllegalArgumentException("Don\'t know how to serialize " + p_serialize_1_ + " as a Component"); } ChatComponentSelector var13 = (ChatComponentSelector)p_serialize_1_; var4.addProperty("selector", var13.func_179992_g()); } return var4; } } 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(); } } }