package net.minecraft.client.renderer.block.model; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.gson.Gson; import com.google.gson.GsonBuilder; 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 java.io.Reader; import java.io.StringReader; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import net.minecraft.util.JsonUtils; import net.minecraft.util.ResourceLocation; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class ModelBlock { private static final Logger LOGGER = LogManager.getLogger(); static final Gson SERIALIZER = (new GsonBuilder()).registerTypeAdapter(ModelBlock.class, new ModelBlock.Deserializer()).registerTypeAdapter(BlockPart.class, new BlockPart.Deserializer()).registerTypeAdapter(BlockPartFace.class, new BlockPartFace.Deserializer()).registerTypeAdapter(BlockFaceUV.class, new BlockFaceUV.Deserializer()).registerTypeAdapter(ItemTransformVec3f.class, new ItemTransformVec3f.Deserializer()).registerTypeAdapter(ItemCameraTransforms.class, new ItemCameraTransforms.Deserializer()).create(); private final List elements; private final boolean ambientOcclusion; private final boolean field_178322_i; private ItemCameraTransforms itemCameraTransforms; public String field_178317_b; protected final Map textures; protected ModelBlock parent; protected ResourceLocation parentLocation; private static final String __OBFID = "CL_00002503"; public static ModelBlock deserialize(Reader p_178307_0_) { return (ModelBlock)SERIALIZER.fromJson(p_178307_0_, ModelBlock.class); } public static ModelBlock deserialize(String p_178294_0_) { return deserialize(new StringReader(p_178294_0_)); } protected ModelBlock(List p_i46225_1_, Map p_i46225_2_, boolean p_i46225_3_, boolean p_i46225_4_, ItemCameraTransforms p_i46225_5_) { this((ResourceLocation)null, p_i46225_1_, p_i46225_2_, p_i46225_3_, p_i46225_4_, p_i46225_5_); } protected ModelBlock(ResourceLocation p_i46226_1_, Map p_i46226_2_, boolean p_i46226_3_, boolean p_i46226_4_, ItemCameraTransforms p_i46226_5_) { this(p_i46226_1_, Collections.emptyList(), p_i46226_2_, p_i46226_3_, p_i46226_4_, p_i46226_5_); } private ModelBlock(ResourceLocation p_i46227_1_, List p_i46227_2_, Map p_i46227_3_, boolean p_i46227_4_, boolean p_i46227_5_, ItemCameraTransforms p_i46227_6_) { this.field_178317_b = ""; this.elements = p_i46227_2_; this.field_178322_i = p_i46227_4_; this.ambientOcclusion = p_i46227_5_; this.textures = p_i46227_3_; this.parentLocation = p_i46227_1_; this.itemCameraTransforms = p_i46227_6_; } public List getElements() { return this.hasParent() ? this.parent.getElements() : this.elements; } private boolean hasParent() { return this.parent != null; } public boolean func_178309_b() { return this.hasParent() ? this.parent.func_178309_b() : this.field_178322_i; } public boolean isAmbientOcclusionEnabled() { return this.ambientOcclusion; } public boolean isResolved() { return this.parentLocation == null || this.parent != null && this.parent.isResolved(); } public void getParentFromMap(Map p_178299_1_) { if (this.parentLocation != null) { this.parent = (ModelBlock)p_178299_1_.get(this.parentLocation); } } public boolean isTexturePresent(String p_178300_1_) { return !"missingno".equals(this.resolveTextureName(p_178300_1_)); } public String resolveTextureName(String p_178308_1_) { if (!this.isTextureName(p_178308_1_)) { p_178308_1_ = '#' + p_178308_1_; } return this.resolveTextureName(p_178308_1_, new ModelBlock.Bookkeep(null)); } private String resolveTextureName(String p_178302_1_, ModelBlock.Bookkeep p_178302_2_) { if (this.isTextureName(p_178302_1_)) { if (this == p_178302_2_.field_178323_b) { LOGGER.warn("Unable to resolve texture due to upward reference: " + p_178302_1_ + " in " + this.field_178317_b); return "missingno"; } else { String var3 = (String)this.textures.get(p_178302_1_.substring(1)); if (var3 == null && this.hasParent()) { var3 = this.parent.resolveTextureName(p_178302_1_, p_178302_2_); } p_178302_2_.field_178323_b = this; if (var3 != null && this.isTextureName(var3)) { var3 = p_178302_2_.model.resolveTextureName(var3, p_178302_2_); } return var3 != null && !this.isTextureName(var3) ? var3 : "missingno"; } } else { return p_178302_1_; } } private boolean isTextureName(String p_178304_1_) { return p_178304_1_.charAt(0) == 35; } public ResourceLocation getParentLocation() { return this.parentLocation; } public ModelBlock getRootModel() { return this.hasParent() ? this.parent.getRootModel() : this; } public ItemTransformVec3f getThirdPersonTransform() { return this.parent != null && this.itemCameraTransforms.field_178355_b == ItemTransformVec3f.field_178366_a ? this.parent.getThirdPersonTransform() : this.itemCameraTransforms.field_178355_b; } public ItemTransformVec3f getFirstPersonTransform() { return this.parent != null && this.itemCameraTransforms.field_178356_c == ItemTransformVec3f.field_178366_a ? this.parent.getFirstPersonTransform() : this.itemCameraTransforms.field_178356_c; } public ItemTransformVec3f getHeadTransform() { return this.parent != null && this.itemCameraTransforms.field_178353_d == ItemTransformVec3f.field_178366_a ? this.parent.getHeadTransform() : this.itemCameraTransforms.field_178353_d; } public ItemTransformVec3f getInGuiTransform() { return this.parent != null && this.itemCameraTransforms.field_178354_e == ItemTransformVec3f.field_178366_a ? this.parent.getInGuiTransform() : this.itemCameraTransforms.field_178354_e; } public static void func_178312_b(Map p_178312_0_) { Iterator var1 = p_178312_0_.values().iterator(); while (var1.hasNext()) { ModelBlock var2 = (ModelBlock)var1.next(); try { ModelBlock var3 = var2.parent; for (ModelBlock var4 = var3.parent; var3 != var4; var4 = var4.parent.parent) { var3 = var3.parent; } throw new ModelBlock.LoopException(); } catch (NullPointerException var5) { ; } } } final class Bookkeep { public final ModelBlock model; public ModelBlock field_178323_b; private static final String __OBFID = "CL_00002501"; private Bookkeep() { this.model = ModelBlock.this; } Bookkeep(Object p_i46224_2_) { this(); } } public static class Deserializer implements JsonDeserializer { private static final String __OBFID = "CL_00002500"; public ModelBlock func_178327_a(JsonElement p_178327_1_, Type p_178327_2_, JsonDeserializationContext p_178327_3_) { JsonObject var4 = p_178327_1_.getAsJsonObject(); List var5 = this.getModelElements(p_178327_3_, var4); String var6 = this.getParent(var4); boolean var7 = StringUtils.isEmpty(var6); boolean var8 = var5.isEmpty(); if (var8 && var7) { throw new JsonParseException("BlockModel requires either elements or parent, found neither"); } else if (!var7 && !var8) { throw new JsonParseException("BlockModel requires either elements or parent, found both"); } else { Map var9 = this.getTextures(var4); boolean var10 = this.getAmbientOcclusionEnabled(var4); ItemCameraTransforms var11 = ItemCameraTransforms.field_178357_a; if (var4.has("display")) { JsonObject var12 = JsonUtils.getJsonObject(var4, "display"); var11 = (ItemCameraTransforms)p_178327_3_.deserialize(var12, ItemCameraTransforms.class); } return var8 ? new ModelBlock(new ResourceLocation(var6), var9, var10, true, var11) : new ModelBlock(var5, var9, var10, true, var11); } } private Map getTextures(JsonObject p_178329_1_) { HashMap var2 = Maps.newHashMap(); if (p_178329_1_.has("textures")) { JsonObject var3 = p_178329_1_.getAsJsonObject("textures"); Iterator var4 = var3.entrySet().iterator(); while (var4.hasNext()) { Entry var5 = (Entry)var4.next(); var2.put(var5.getKey(), ((JsonElement)var5.getValue()).getAsString()); } } return var2; } private String getParent(JsonObject p_178326_1_) { return JsonUtils.getJsonObjectStringFieldValueOrDefault(p_178326_1_, "parent", ""); } protected boolean getAmbientOcclusionEnabled(JsonObject p_178328_1_) { return JsonUtils.getJsonObjectBooleanFieldValueOrDefault(p_178328_1_, "ambientocclusion", true); } protected List getModelElements(JsonDeserializationContext p_178325_1_, JsonObject p_178325_2_) { ArrayList var3 = Lists.newArrayList(); if (p_178325_2_.has("elements")) { Iterator var4 = JsonUtils.getJsonObjectJsonArrayField(p_178325_2_, "elements").iterator(); while (var4.hasNext()) { JsonElement var5 = (JsonElement)var4.next(); var3.add((BlockPart)p_178325_1_.deserialize(var5, BlockPart.class)); } } return var3; } public Object deserialize(JsonElement p_deserialize_1_, Type p_deserialize_2_, JsonDeserializationContext p_deserialize_3_) { return this.func_178327_a(p_deserialize_1_, p_deserialize_2_, p_deserialize_3_); } } public static class LoopException extends RuntimeException { private static final String __OBFID = "CL_00002499"; } }