package net.minecraft.client.resources.model; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import com.google.common.base.Charsets; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import net.lax1dude.eaglercraft.v1_8.IOUtils; import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite; import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.BlockVertexIDs; import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.VertexMarkerState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockModelShapes; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BlockPart; import net.minecraft.client.renderer.block.model.BlockPartFace; import net.minecraft.client.renderer.block.model.FaceBakery; import net.minecraft.client.renderer.block.model.ItemModelGenerator; import net.minecraft.client.renderer.block.model.ModelBlock; import net.minecraft.client.renderer.block.model.ModelBlockDefinition; import net.minecraft.client.renderer.texture.IIconCreator; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.resources.IResource; import net.minecraft.client.resources.IResourceManager; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.util.EnumFacing; import net.minecraft.util.IRegistry; import net.minecraft.util.RegistrySimple; import net.minecraft.util.ResourceLocation; import net.minecraft.block.BlockSlab; import net.hoosiertransfer.EaglerItems; import net.hoosiertransfer.EaglerCustomBlock; /** * + * This portion of EaglercraftX contains deobfuscated Minecraft 1.8 source code. * * Minecraft 1.8.8 bytecode is (c) 2015 Mojang AB. "Do not distribute!" * Mod Coder Pack v9.18 deobfuscation configs are (c) Copyright by the MCP Team * * EaglercraftX 1.8 patch files (c) 2022-2024 lax1dude, hoosiertransfer, * ayunami2000. All Rights * Reserved. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ public class ModelBakery { private static final Set LOCATIONS_BUILTIN_TEXTURES = Sets.newHashSet(new ResourceLocation[] { new ResourceLocation("blocks/water_flow"), new ResourceLocation("blocks/water_still"), new ResourceLocation("blocks/lava_flow"), new ResourceLocation("blocks/lava_still"), new ResourceLocation("blocks/destroy_stage_0"), new ResourceLocation("blocks/destroy_stage_1"), new ResourceLocation("blocks/destroy_stage_2"), new ResourceLocation("blocks/destroy_stage_3"), new ResourceLocation("blocks/destroy_stage_4"), new ResourceLocation("blocks/destroy_stage_5"), new ResourceLocation("blocks/destroy_stage_6"), new ResourceLocation("blocks/destroy_stage_7"), new ResourceLocation("blocks/destroy_stage_8"), new ResourceLocation("blocks/destroy_stage_9"), new ResourceLocation("items/empty_armor_slot_helmet"), new ResourceLocation("items/empty_armor_slot_chestplate"), new ResourceLocation("items/empty_armor_slot_leggings"), new ResourceLocation("items/empty_armor_slot_boots") }); private static final Logger LOGGER = LogManager.getLogger(); protected static final ModelResourceLocation MODEL_MISSING = new ModelResourceLocation("builtin/missing", "missing"); private static final Map BUILT_IN_MODELS = Maps.newHashMap(); private static final Joiner JOINER = Joiner.on(" -> "); private final IResourceManager resourceManager; private final Map sprites = Maps.newHashMap(); private final Map models = Maps.newLinkedHashMap(); private final Map variants = Maps.newLinkedHashMap(); private final TextureMap textureMap; private final BlockModelShapes blockModelShapes; private final FaceBakery faceBakery = new FaceBakery(); private final ItemModelGenerator itemModelGenerator = new ItemModelGenerator(); private RegistrySimple bakedRegistry = new RegistrySimple(); private static final ModelBlock MODEL_GENERATED = ModelBlock.deserialize( "{\"elements\":[{ \"from\": [0, 0, 0], \"to\": [16, 16, 16], \"faces\": { \"down\": {\"uv\": [0, 0, 16, 16], \"texture\":\"\"} }}]}"); private static final ModelBlock MODEL_COMPASS = ModelBlock.deserialize( "{\"elements\":[{ \"from\": [0, 0, 0], \"to\": [16, 16, 16], \"faces\": { \"down\": {\"uv\": [0, 0, 16, 16], \"texture\":\"\"} }}]}"); private static final ModelBlock MODEL_CLOCK = ModelBlock.deserialize( "{\"elements\":[{ \"from\": [0, 0, 0], \"to\": [16, 16, 16], \"faces\": { \"down\": {\"uv\": [0, 0, 16, 16], \"texture\":\"\"} }}]}"); private static final ModelBlock MODEL_ENTITY = ModelBlock.deserialize( "{\"elements\":[{ \"from\": [0, 0, 0], \"to\": [16, 16, 16], \"faces\": { \"down\": {\"uv\": [0, 0, 16, 16], \"texture\":\"\"} }}]}"); private Map itemLocations = Maps.newLinkedHashMap(); private final Map blockDefinitions = Maps.newHashMap(); private Map> variantNames = Maps.newIdentityHashMap(); public ModelBakery(IResourceManager parIResourceManager, TextureMap parTextureMap, BlockModelShapes parBlockModelShapes) { this.resourceManager = parIResourceManager; this.textureMap = parTextureMap; this.blockModelShapes = parBlockModelShapes; } public IRegistry setupModelRegistry() { this.loadVariantItemModels(); this.loadModelsCheck(); this.loadSprites(); this.bakeItemModels(); this.bakeBlockModels(); return this.bakedRegistry; } private void loadVariantItemModels() { this.loadVariants(this.blockModelShapes.getBlockStateMapper().putAllStateModelLocations().values()); this.variants.put(MODEL_MISSING, new ModelBlockDefinition.Variants(MODEL_MISSING.getVariant(), Lists.newArrayList(new ModelBlockDefinition.Variant[] { new ModelBlockDefinition.Variant(new ResourceLocation(MODEL_MISSING.getResourcePath()), ModelRotation.X0_Y0, false, 1) }))); ResourceLocation resourcelocation = new ResourceLocation("item_frame"); ModelBlockDefinition modelblockdefinition = this.getModelBlockDefinition(resourcelocation); this.registerVariant(modelblockdefinition, new ModelResourceLocation(resourcelocation, "normal")); this.registerVariant(modelblockdefinition, new ModelResourceLocation(resourcelocation, "map")); this.loadVariantModels(); this.loadItemModels(); } private void loadVariants(Collection parCollection) { for (ModelResourceLocation modelresourcelocation : parCollection) { try { ModelBlockDefinition modelblockdefinition = this.getModelBlockDefinition(modelresourcelocation); try { this.registerVariant(modelblockdefinition, modelresourcelocation); } catch (Exception var6) { LOGGER.warn("Unable to load variant: " + modelresourcelocation.getVariant() + " from " + modelresourcelocation); LOGGER.warn(var6); } } catch (Exception exception) { LOGGER.warn("Unable to load definition " + modelresourcelocation); LOGGER.warn(exception); } } } private void registerVariant(ModelBlockDefinition parModelBlockDefinition, ModelResourceLocation parModelResourceLocation) { this.variants.put(parModelResourceLocation, parModelBlockDefinition.getVariants(parModelResourceLocation.getVariant())); } private ModelBlockDefinition getModelBlockDefinition(ResourceLocation parResourceLocation) { ResourceLocation resourcelocation = this.getBlockStateLocation(parResourceLocation); ModelBlockDefinition modelblockdefinition = (ModelBlockDefinition) this.blockDefinitions.get(resourcelocation); if (modelblockdefinition == null) { ArrayList arraylist = Lists.newArrayList(); try { for (IResource iresource : this.resourceManager.getAllResources(resourcelocation)) { InputStream inputstream = null; try { inputstream = iresource.getInputStream(); ModelBlockDefinition modelblockdefinition1 = ModelBlockDefinition .parseFromReader(new InputStreamReader(inputstream, Charsets.UTF_8)); arraylist.add(modelblockdefinition1); } catch (Exception exception) { throw new RuntimeException("Encountered an exception when loading model definition of \'" + parResourceLocation + "\' from: \'" + iresource.getResourceLocation() + "\' in resourcepack: \'" + iresource.getResourcePackName() + "\'", exception); } finally { IOUtils.closeQuietly(inputstream); } } } catch (IOException ioexception) { throw new RuntimeException("Encountered an exception when loading model definition of model " + resourcelocation.toString(), ioexception); } modelblockdefinition = new ModelBlockDefinition((ArrayList) arraylist); this.blockDefinitions.put(resourcelocation, modelblockdefinition); } return modelblockdefinition; } private ResourceLocation getBlockStateLocation(ResourceLocation parResourceLocation) { return new ResourceLocation(parResourceLocation.getResourceDomain(), "blockstates/" + parResourceLocation.getResourcePath() + ".json"); } private void loadVariantModels() { for (ModelResourceLocation modelresourcelocation : this.variants.keySet()) { for (ModelBlockDefinition.Variant modelblockdefinition$variant : ((ModelBlockDefinition.Variants) this.variants .get(modelresourcelocation)).getVariants()) { ResourceLocation resourcelocation = modelblockdefinition$variant.getModelLocation(); if (this.models.get(resourcelocation) == null) { try { ModelBlock modelblock = this.loadModel(resourcelocation); this.models.put(resourcelocation, modelblock); } catch (Exception exception) { LOGGER.warn("Unable to load block model: \'" + resourcelocation + "\' for variant: \'" + modelresourcelocation + "\'"); LOGGER.warn(exception); } } } } } private ModelBlock loadModel(ResourceLocation parResourceLocation) throws IOException { String s = parResourceLocation.getResourcePath(); if ("builtin/generated".equals(s)) { return MODEL_GENERATED; } else if ("builtin/compass".equals(s)) { return MODEL_COMPASS; } else if ("builtin/clock".equals(s)) { return MODEL_CLOCK; } else if ("builtin/entity".equals(s)) { return MODEL_ENTITY; } else { String str; if (s.startsWith("builtin/")) { String s1 = s.substring("builtin/".length()); str = (String) BUILT_IN_MODELS.get(s1); if (str == null) { throw new FileNotFoundException(parResourceLocation.toString()); } } else { IResource iresource = this.resourceManager.getResource(this.getModelLocation(parResourceLocation)); try (InputStream is = iresource.getInputStream()) { str = IOUtils.inputStreamToString(is, StandardCharsets.UTF_8); } } ModelBlock modelblock = ModelBlock.deserialize(str); modelblock.name = parResourceLocation.toString(); return modelblock; } } private ResourceLocation getModelLocation(ResourceLocation parResourceLocation) { return new ResourceLocation(parResourceLocation.getResourceDomain(), "models/" + parResourceLocation.getResourcePath() + ".json"); } private void loadItemModels() { this.registerVariantNames(); for (Item item : Item.itemRegistry) { for (String s : this.getVariantNames(item)) { ResourceLocation resourcelocation = this.getItemLocation(s); ResourceLocation resourcelocation1 = (ResourceLocation) Item.itemRegistry.getNameForObject(item); this.loadItemModel(s, resourcelocation, resourcelocation1); if (item.hasCustomProperties()) { ModelBlock modelblock = (ModelBlock) this.models.get(resourcelocation); if (modelblock != null) { for (ResourceLocation resourcelocation2 : modelblock.getOverrideLocations()) { this.loadItemModel(resourcelocation2.toString(), resourcelocation2, resourcelocation1); } } } } } } private void loadItemModel(String p_188634_1_, ResourceLocation p_188634_2_, ResourceLocation p_188634_3_) { this.itemLocations.put(p_188634_1_, p_188634_2_); if (this.models.get(p_188634_2_) == null) { try { ModelBlock modelblock = this.loadModel(p_188634_2_); this.models.put(p_188634_2_, modelblock); } catch (Exception exception) { LOGGER.warn((String) ("Unable to load item model: \'" + p_188634_2_ + "\' for item: \'" + p_188634_3_ + "\'"), (Throwable) exception); } } } private void registerVariantNames() { this.variantNames.put(Item.getItemFromBlock(Blocks.stone), Lists.newArrayList(new String[] { "stone", "granite", "granite_smooth", "diorite", "diorite_smooth", "andesite", "andesite_smooth" })); this.variantNames.put(Item.getItemFromBlock(Blocks.dirt), Lists.newArrayList(new String[] { "dirt", "coarse_dirt", "podzol" })); this.variantNames.put(Item.getItemFromBlock(Blocks.planks), Lists.newArrayList(new String[] { "oak_planks", "spruce_planks", "birch_planks", "jungle_planks", "acacia_planks", "dark_oak_planks" })); this.variantNames.put(Item.getItemFromBlock(Blocks.sapling), Lists.newArrayList(new String[] { "oak_sapling", "spruce_sapling", "birch_sapling", "jungle_sapling", "acacia_sapling", "dark_oak_sapling" })); this.variantNames.put(Item.getItemFromBlock(Blocks.sand), Lists.newArrayList(new String[] { "sand", "red_sand" })); this.variantNames.put(Item.getItemFromBlock(Blocks.log), Lists.newArrayList(new String[] { "oak_log", "spruce_log", "birch_log", "jungle_log" })); this.variantNames.put(Item.getItemFromBlock(Blocks.leaves), Lists.newArrayList(new String[] { "oak_leaves", "spruce_leaves", "birch_leaves", "jungle_leaves" })); this.variantNames.put(Item.getItemFromBlock(Blocks.sponge), Lists.newArrayList(new String[] { "sponge", "sponge_wet" })); this.variantNames.put(Item.getItemFromBlock(Blocks.sandstone), Lists.newArrayList(new String[] { "sandstone", "chiseled_sandstone", "smooth_sandstone" })); this.variantNames.put(Item.getItemFromBlock(Blocks.red_sandstone), Lists.newArrayList(new String[] { "red_sandstone", "chiseled_red_sandstone", "smooth_red_sandstone" })); this.variantNames.put(Item.getItemFromBlock(Blocks.tallgrass), Lists.newArrayList(new String[] { "dead_bush", "tall_grass", "fern" })); this.variantNames.put(Item.getItemFromBlock(Blocks.deadbush), Lists.newArrayList(new String[] { "dead_bush" })); this.variantNames.put(Item.getItemFromBlock(Blocks.wool), Lists.newArrayList(new String[] { "black_wool", "red_wool", "green_wool", "brown_wool", "blue_wool", "purple_wool", "cyan_wool", "silver_wool", "gray_wool", "pink_wool", "lime_wool", "yellow_wool", "light_blue_wool", "magenta_wool", "orange_wool", "white_wool" })); this.variantNames.put(Item.getItemFromBlock(Blocks.yellow_flower), Lists.newArrayList(new String[] { "dandelion" })); this.variantNames.put(Item.getItemFromBlock(Blocks.red_flower), Lists.newArrayList(new String[] { "poppy", "blue_orchid", "allium", "houstonia", "red_tulip", "orange_tulip", "white_tulip", "pink_tulip", "oxeye_daisy" })); this.variantNames.put(Item.getItemFromBlock(Blocks.stone_slab), Lists.newArrayList(new String[] { "stone_slab", "sandstone_slab", "cobblestone_slab", "brick_slab", "stone_brick_slab", "nether_brick_slab", "quartz_slab" })); this.variantNames.put(Item.getItemFromBlock(Blocks.stone_slab2), Lists.newArrayList(new String[] { "red_sandstone_slab" })); this.variantNames.put(Item.getItemFromBlock(Blocks.stained_glass), Lists.newArrayList(new String[] { "black_stained_glass", "red_stained_glass", "green_stained_glass", "brown_stained_glass", "blue_stained_glass", "purple_stained_glass", "cyan_stained_glass", "silver_stained_glass", "gray_stained_glass", "pink_stained_glass", "lime_stained_glass", "yellow_stained_glass", "light_blue_stained_glass", "magenta_stained_glass", "orange_stained_glass", "white_stained_glass" })); this.variantNames.put(Item.getItemFromBlock(Blocks.monster_egg), Lists.newArrayList(new String[] { "stone_monster_egg", "cobblestone_monster_egg", "stone_brick_monster_egg", "mossy_brick_monster_egg", "cracked_brick_monster_egg", "chiseled_brick_monster_egg" })); this.variantNames.put(Item.getItemFromBlock(Blocks.stonebrick), Lists.newArrayList( new String[] { "stonebrick", "mossy_stonebrick", "cracked_stonebrick", "chiseled_stonebrick" })); this.variantNames.put(Item.getItemFromBlock(Blocks.wooden_slab), Lists.newArrayList(new String[] { "oak_slab", "spruce_slab", "birch_slab", "jungle_slab", "acacia_slab", "dark_oak_slab" })); this.variantNames.put(Item.getItemFromBlock(Blocks.cobblestone_wall), Lists.newArrayList(new String[] { "cobblestone_wall", "mossy_cobblestone_wall" })); this.variantNames.put(Item.getItemFromBlock(Blocks.anvil), Lists.newArrayList(new String[] { "anvil_intact", "anvil_slightly_damaged", "anvil_very_damaged" })); this.variantNames.put(Item.getItemFromBlock(Blocks.quartz_block), Lists.newArrayList(new String[] { "quartz_block", "chiseled_quartz_block", "quartz_column" })); this.variantNames.put(Item.getItemFromBlock(Blocks.stained_hardened_clay), Lists.newArrayList(new String[] { "black_stained_hardened_clay", "red_stained_hardened_clay", "green_stained_hardened_clay", "brown_stained_hardened_clay", "blue_stained_hardened_clay", "purple_stained_hardened_clay", "cyan_stained_hardened_clay", "silver_stained_hardened_clay", "gray_stained_hardened_clay", "pink_stained_hardened_clay", "lime_stained_hardened_clay", "yellow_stained_hardened_clay", "light_blue_stained_hardened_clay", "magenta_stained_hardened_clay", "orange_stained_hardened_clay", "white_stained_hardened_clay" })); this.variantNames.put(Item.getItemFromBlock(Blocks.stained_glass_pane), Lists.newArrayList(new String[] { "black_stained_glass_pane", "red_stained_glass_pane", "green_stained_glass_pane", "brown_stained_glass_pane", "blue_stained_glass_pane", "purple_stained_glass_pane", "cyan_stained_glass_pane", "silver_stained_glass_pane", "gray_stained_glass_pane", "pink_stained_glass_pane", "lime_stained_glass_pane", "yellow_stained_glass_pane", "light_blue_stained_glass_pane", "magenta_stained_glass_pane", "orange_stained_glass_pane", "white_stained_glass_pane" })); this.variantNames.put(Item.getItemFromBlock(Blocks.leaves2), Lists.newArrayList(new String[] { "acacia_leaves", "dark_oak_leaves" })); this.variantNames.put(Item.getItemFromBlock(Blocks.log2), Lists.newArrayList(new String[] { "acacia_log", "dark_oak_log" })); this.variantNames.put(Item.getItemFromBlock(Blocks.prismarine), Lists.newArrayList(new String[] { "prismarine", "prismarine_bricks", "dark_prismarine" })); this.variantNames.put(Item.getItemFromBlock(Blocks.carpet), Lists.newArrayList(new String[] { "black_carpet", "red_carpet", "green_carpet", "brown_carpet", "blue_carpet", "purple_carpet", "cyan_carpet", "silver_carpet", "gray_carpet", "pink_carpet", "lime_carpet", "yellow_carpet", "light_blue_carpet", "magenta_carpet", "orange_carpet", "white_carpet" })); this.variantNames.put(Item.getItemFromBlock(Blocks.double_plant), Lists.newArrayList( new String[] { "sunflower", "syringa", "double_grass", "double_fern", "double_rose", "paeonia" })); this.variantNames.put(Items.bow, Lists.newArrayList(new String[] { "bow", "bow_pulling_0", "bow_pulling_1", "bow_pulling_2" })); this.variantNames.put(Items.coal, Lists.newArrayList(new String[] { "coal", "charcoal" })); this.variantNames.put(Items.fishing_rod, Lists.newArrayList(new String[] { "fishing_rod", "fishing_rod_cast" })); this.variantNames.put(Items.fish, Lists.newArrayList(new String[] { "cod", "salmon", "clownfish", "pufferfish" })); this.variantNames.put(Items.cooked_fish, Lists.newArrayList(new String[] { "cooked_cod", "cooked_salmon" })); this.variantNames.put(Items.dye, Lists.newArrayList(new String[] { "dye_black", "dye_red", "dye_green", "dye_brown", "dye_blue", "dye_purple", "dye_cyan", "dye_silver", "dye_gray", "dye_pink", "dye_lime", "dye_yellow", "dye_light_blue", "dye_magenta", "dye_orange", "dye_white" })); this.variantNames.put(Items.potionitem, Lists.newArrayList(new String[] { "bottle_drinkable", "bottle_splash" })); this.variantNames.put(Items.skull, Lists.newArrayList( new String[] { "skull_skeleton", "skull_wither", "skull_zombie", "skull_char", "skull_creeper", "skull_dragon" })); this.variantNames.put(Item.getItemFromBlock(Blocks.oak_fence_gate), Lists.newArrayList(new String[] { "oak_fence_gate" })); this.variantNames.put(Item.getItemFromBlock(Blocks.oak_fence), Lists.newArrayList(new String[] { "oak_fence" })); this.variantNames.put(Items.oak_door, Lists.newArrayList(new String[] { "oak_door" })); for (EaglerCustomBlock block : EaglerItems.getEaglerCustomBlocks()) { if (block.isSlab()) { this.variantNames.put(Item.getItemFromBlock(block.getBlock()), Lists.newArrayList(block.getVariants().toArray(new String[0]))); } } } private List getVariantNames(Item parItem) { List list = (List) this.variantNames.get(parItem); if (list == null) { list = Collections .singletonList(((ResourceLocation) Item.itemRegistry.getNameForObject(parItem)).toString()); } return list; } private ResourceLocation getItemLocation(String parString1) { ResourceLocation resourcelocation = new ResourceLocation(parString1); return new ResourceLocation(resourcelocation.getResourceDomain(), "item/" + resourcelocation.getResourcePath()); } private void bakeBlockModels() { boolean deferred = Minecraft.getMinecraft().gameSettings.shaders; for (ModelResourceLocation modelresourcelocation : this.variants.keySet()) { WeightedBakedModel.Builder weightedbakedmodel$builder = new WeightedBakedModel.Builder(); int i = 0; for (ModelBlockDefinition.Variant modelblockdefinition$variant : ((ModelBlockDefinition.Variants) this.variants .get(modelresourcelocation)).getVariants()) { ModelBlock modelblock = (ModelBlock) this.models.get(modelblockdefinition$variant.getModelLocation()); if (modelblock != null && modelblock.isResolved()) { ++i; if (deferred) { ModelBlock currentBlockModel = modelblock; ResourceLocation currentResourceLocation = modelblockdefinition$variant.getModelLocation(); Integer blockId = null; do { blockId = BlockVertexIDs.modelToID.get(currentResourceLocation.toString()); if (blockId != null) { break; } currentResourceLocation = currentBlockModel.getParentLocation(); currentBlockModel = models.get(currentResourceLocation); } while (currentBlockModel != null); if (blockId != null) { VertexMarkerState.markId = blockId.intValue(); try { weightedbakedmodel$builder.add( this.bakeModel(modelblock, modelblockdefinition$variant.getRotation(), modelblockdefinition$variant.isUvLocked()), modelblockdefinition$variant.getWeight()); } finally { VertexMarkerState.markId = 0; } continue; } } weightedbakedmodel$builder.add( this.bakeModel(modelblock, modelblockdefinition$variant.getRotation(), modelblockdefinition$variant.isUvLocked()), modelblockdefinition$variant.getWeight()); } else { LOGGER.warn("Missing model for: " + modelresourcelocation); } } if (i == 0) { LOGGER.warn("No weighted models for: " + modelresourcelocation); } else if (i == 1) { this.bakedRegistry.putObject(modelresourcelocation, weightedbakedmodel$builder.first()); } else { this.bakedRegistry.putObject(modelresourcelocation, weightedbakedmodel$builder.build()); } } for (Entry entry : this.itemLocations.entrySet()) { ResourceLocation resourcelocation = (ResourceLocation) entry.getValue(); ModelResourceLocation modelresourcelocation1 = new ModelResourceLocation((String) entry.getKey(), "inventory"); ModelBlock modelblock1 = (ModelBlock) this.models.get(resourcelocation); if (modelblock1 != null && modelblock1.isResolved()) { if (this.isCustomRenderer(modelblock1)) { this.bakedRegistry.putObject(modelresourcelocation1, new BuiltInModel(modelblock1.func_181682_g(), modelblock1.createOverrides())); } else { this.bakedRegistry.putObject(modelresourcelocation1, this.bakeModel(modelblock1, ModelRotation.X0_Y0, false)); } } else { LOGGER.warn("Missing model for: " + resourcelocation); } } } private Set getVariantsTextureLocations() { HashSet hashset = Sets.newHashSet(); ArrayList arraylist = Lists.newArrayList(this.variants.keySet()); Collections.sort(arraylist, new Comparator() { public int compare(ModelResourceLocation modelresourcelocation1, ModelResourceLocation modelresourcelocation2) { return modelresourcelocation1.toString().compareTo(modelresourcelocation2.toString()); } }); for (ModelResourceLocation modelresourcelocation : (List) arraylist) { ModelBlockDefinition.Variants modelblockdefinition$variants = (ModelBlockDefinition.Variants) this.variants .get(modelresourcelocation); for (ModelBlockDefinition.Variant modelblockdefinition$variant : modelblockdefinition$variants .getVariants()) { ModelBlock modelblock = (ModelBlock) this.models.get(modelblockdefinition$variant.getModelLocation()); if (modelblock == null) { LOGGER.warn("Missing model for: " + modelresourcelocation); } else { hashset.addAll(this.getTextureLocations(modelblock)); } } } hashset.addAll(LOCATIONS_BUILTIN_TEXTURES); return hashset; } private IBakedModel bakeModel(ModelBlock modelBlockIn, ModelRotation modelRotationIn, boolean uvLocked) { EaglerTextureAtlasSprite textureatlassprite = (EaglerTextureAtlasSprite) this.sprites .get(new ResourceLocation(modelBlockIn.resolveTextureName("particle"))); SimpleBakedModel.Builder simplebakedmodel$builder = (new SimpleBakedModel.Builder(modelBlockIn, modelBlockIn.createOverrides())) .setTexture(textureatlassprite); for (BlockPart blockpart : modelBlockIn.getElements()) { for (EnumFacing enumfacing : blockpart.mapFaces.keySet()) { BlockPartFace blockpartface = (BlockPartFace) blockpart.mapFaces.get(enumfacing); EaglerTextureAtlasSprite textureatlassprite1 = (EaglerTextureAtlasSprite) this.sprites .get(new ResourceLocation(modelBlockIn.resolveTextureName(blockpartface.texture))); if (blockpartface.cullFace == null) { simplebakedmodel$builder.addGeneralQuad(this.makeBakedQuad(blockpart, blockpartface, textureatlassprite1, enumfacing, modelRotationIn, uvLocked)); } else { simplebakedmodel$builder.addFaceQuad(modelRotationIn.rotateFace(blockpartface.cullFace), this.makeBakedQuad(blockpart, blockpartface, textureatlassprite1, enumfacing, modelRotationIn, uvLocked)); } } } return simplebakedmodel$builder.makeBakedModel(); } private BakedQuad makeBakedQuad(BlockPart parBlockPart, BlockPartFace parBlockPartFace, EaglerTextureAtlasSprite parTextureAtlasSprite, EnumFacing parEnumFacing, ModelRotation parModelRotation, boolean parFlag) { return this.faceBakery.makeBakedQuad(parBlockPart.positionFrom, parBlockPart.positionTo, parBlockPartFace, parTextureAtlasSprite, parEnumFacing, parModelRotation, parBlockPart.partRotation, parFlag, parBlockPart.shade); } private void loadModelsCheck() { this.loadModels(); for (ModelBlock modelblock : this.models.values()) { modelblock.getParentFromMap(this.models); } ModelBlock.checkModelHierarchy(this.models); } private void loadModels() { List arraydeque = Lists.newLinkedList(); HashSet hashset = Sets.newHashSet(); for (ResourceLocation resourcelocation : this.models.keySet()) { hashset.add(resourcelocation); ResourceLocation resourcelocation1 = ((ModelBlock) this.models.get(resourcelocation)).getParentLocation(); if (resourcelocation1 != null) { arraydeque.add(resourcelocation1); } } while (!arraydeque.isEmpty()) { ResourceLocation resourcelocation2 = (ResourceLocation) arraydeque.remove(0); try { if (this.models.get(resourcelocation2) != null) { continue; } ModelBlock modelblock = this.loadModel(resourcelocation2); this.models.put(resourcelocation2, modelblock); ResourceLocation resourcelocation3 = modelblock.getParentLocation(); if (resourcelocation3 != null && !hashset.contains(resourcelocation3)) { arraydeque.add(resourcelocation3); } } catch (Exception exception) { LOGGER.warn("In parent chain: " + JOINER.join(this.getParentPath(resourcelocation2)) + "; unable to load model: \'" + resourcelocation2 + "\'"); LOGGER.warn(exception); } hashset.add(resourcelocation2); } } private List getParentPath(ResourceLocation parResourceLocation) { ArrayList arraylist = Lists.newArrayList(new ResourceLocation[] { parResourceLocation }); ResourceLocation resourcelocation = parResourceLocation; while ((resourcelocation = this.getParentLocation(resourcelocation)) != null) { arraylist.add(0, resourcelocation); } return arraylist; } private ResourceLocation getParentLocation(ResourceLocation parResourceLocation) { for (Entry entry : this.models.entrySet()) { ModelBlock modelblock = (ModelBlock) entry.getValue(); if (modelblock != null && parResourceLocation.equals(modelblock.getParentLocation())) { return (ResourceLocation) entry.getKey(); } } return null; } private Set getTextureLocations(ModelBlock parModelBlock) { HashSet hashset = Sets.newHashSet(); for (BlockPart blockpart : parModelBlock.getElements()) { for (BlockPartFace blockpartface : blockpart.mapFaces.values()) { ResourceLocation resourcelocation = new ResourceLocation( parModelBlock.resolveTextureName(blockpartface.texture)); hashset.add(resourcelocation); } } hashset.add(new ResourceLocation(parModelBlock.resolveTextureName("particle"))); return hashset; } private void loadSprites() { final Set set = this.getVariantsTextureLocations(); set.addAll(this.getItemsTextureLocations()); set.remove(TextureMap.LOCATION_MISSING_TEXTURE); IIconCreator iiconcreator = new IIconCreator() { public void registerSprites(TextureMap texturemap) { for (ResourceLocation resourcelocation : (Set) set) { EaglerTextureAtlasSprite textureatlassprite = texturemap.registerSprite(resourcelocation); ModelBakery.this.sprites.put(resourcelocation, textureatlassprite); } } }; this.textureMap.loadSprites(this.resourceManager, iiconcreator); this.sprites.put(new ResourceLocation("missingno"), this.textureMap.getMissingSprite()); } private Set getItemsTextureLocations() { HashSet hashset = Sets.newHashSet(); for (ResourceLocation resourcelocation : this.itemLocations.values()) { ModelBlock modelblock = (ModelBlock) this.models.get(resourcelocation); if (modelblock != null) { hashset.add(new ResourceLocation(modelblock.resolveTextureName("particle"))); if (this.hasItemModel(modelblock)) { for (String s : ItemModelGenerator.LAYERS) { ResourceLocation resourcelocation2 = new ResourceLocation(modelblock.resolveTextureName(s)); if (modelblock.getRootModel() == MODEL_COMPASS && !TextureMap.LOCATION_MISSING_TEXTURE.equals(resourcelocation2)) { EaglerTextureAtlasSprite.setLocationNameCompass(resourcelocation2.toString()); } else if (modelblock.getRootModel() == MODEL_CLOCK && !TextureMap.LOCATION_MISSING_TEXTURE.equals(resourcelocation2)) { EaglerTextureAtlasSprite.setLocationNameClock(resourcelocation2.toString()); } hashset.add(resourcelocation2); } } else if (!this.isCustomRenderer(modelblock)) { for (BlockPart blockpart : modelblock.getElements()) { for (BlockPartFace blockpartface : blockpart.mapFaces.values()) { ResourceLocation resourcelocation1 = new ResourceLocation( modelblock.resolveTextureName(blockpartface.texture)); hashset.add(resourcelocation1); } } } } } return hashset; } private boolean hasItemModel(ModelBlock parModelBlock) { if (parModelBlock == null) { return false; } else { ModelBlock modelblock = parModelBlock.getRootModel(); return modelblock == MODEL_GENERATED || modelblock == MODEL_COMPASS || modelblock == MODEL_CLOCK; } } private boolean isCustomRenderer(ModelBlock parModelBlock) { if (parModelBlock == null) { return false; } else { ModelBlock modelblock = parModelBlock.getRootModel(); return modelblock == MODEL_ENTITY; } } private void bakeItemModels() { for (ResourceLocation resourcelocation : this.itemLocations.values()) { ModelBlock modelblock = (ModelBlock) this.models.get(resourcelocation); if (this.hasItemModel(modelblock)) { ModelBlock modelblock1 = this.makeItemModel(modelblock); if (modelblock1 != null) { modelblock1.name = resourcelocation.toString(); } this.models.put(resourcelocation, modelblock1); } else if (this.isCustomRenderer(modelblock)) { this.models.put(resourcelocation, modelblock); } } for (EaglerTextureAtlasSprite textureatlassprite : this.sprites.values()) { if (!textureatlassprite.hasAnimationMetadata()) { textureatlassprite.clearFramesTextureData(); } } } private ModelBlock makeItemModel(ModelBlock parModelBlock) { return this.itemModelGenerator.makeItemModel(this.textureMap, parModelBlock); } static { BUILT_IN_MODELS.put("missing", "{ \"textures\": { \"particle\": \"missingno\", \"missingno\": \"missingno\"}, \"elements\": [ { \"from\": [ 0, 0, 0 ], \"to\": [ 16, 16, 16 ], \"faces\": { \"down\": { \"uv\": [ 0, 0, 16, 16 ], \"cullface\": \"down\", \"texture\": \"#missingno\" }, \"up\": { \"uv\": [ 0, 0, 16, 16 ], \"cullface\": \"up\", \"texture\": \"#missingno\" }, \"north\": { \"uv\": [ 0, 0, 16, 16 ], \"cullface\": \"north\", \"texture\": \"#missingno\" }, \"south\": { \"uv\": [ 0, 0, 16, 16 ], \"cullface\": \"south\", \"texture\": \"#missingno\" }, \"west\": { \"uv\": [ 0, 0, 16, 16 ], \"cullface\": \"west\", \"texture\": \"#missingno\" }, \"east\": { \"uv\": [ 0, 0, 16, 16 ], \"cullface\": \"east\", \"texture\": \"#missingno\" } }}]}"); MODEL_GENERATED.name = "generation marker"; MODEL_COMPASS.name = "compass generation marker"; MODEL_CLOCK.name = "class generation marker"; MODEL_ENTITY.name = "block entity marker"; } }