/** * This class was created by <williewillus>. It's distributed as * part of the Botania Mod. Get the Source Code in github: * https://github.com/Vazkii/Botania * * Botania is Open Source and distributed under the * Botania License: http://botaniamod.net/license.php */ package vazkii.botania.client.core.handler; import java.util.Locale; import java.util.Map; import java.util.function.IntFunction; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.statemap.DefaultStateMapper; import net.minecraft.client.renderer.block.statemap.IStateMapper; import net.minecraft.item.Item; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.client.model.obj.OBJLoader; import net.minecraftforge.fml.common.registry.RegistryDelegate; import net.minecraftforge.fml.relauncher.ReflectionHelper; import vazkii.botania.api.BotaniaAPIClient; import vazkii.botania.api.item.IFloatingFlower; import vazkii.botania.client.model.SpecialFlowerModel; import vazkii.botania.client.render.IModelRegister; import vazkii.botania.common.block.subtile.SubTileManastar; import vazkii.botania.common.block.subtile.SubTilePureDaisy; import vazkii.botania.common.block.subtile.functional.SubTileAgricarnation; import vazkii.botania.common.block.subtile.functional.SubTileBellethorn; import vazkii.botania.common.block.subtile.functional.SubTileBergamute; import vazkii.botania.common.block.subtile.functional.SubTileBubbell; import vazkii.botania.common.block.subtile.functional.SubTileClayconia; import vazkii.botania.common.block.subtile.functional.SubTileDaffomill; import vazkii.botania.common.block.subtile.functional.SubTileDreadthorn; import vazkii.botania.common.block.subtile.functional.SubTileExoflame; import vazkii.botania.common.block.subtile.functional.SubTileFallenKanade; import vazkii.botania.common.block.subtile.functional.SubTileHeiseiDream; import vazkii.botania.common.block.subtile.functional.SubTileHopperhock; import vazkii.botania.common.block.subtile.functional.SubTileHyacidus; import vazkii.botania.common.block.subtile.functional.SubTileJadedAmaranthus; import vazkii.botania.common.block.subtile.functional.SubTileJiyuulia; import vazkii.botania.common.block.subtile.functional.SubTileLoonuim; import vazkii.botania.common.block.subtile.functional.SubTileMarimorphosis; import vazkii.botania.common.block.subtile.functional.SubTileMedumone; import vazkii.botania.common.block.subtile.functional.SubTileOrechid; import vazkii.botania.common.block.subtile.functional.SubTileOrechidIgnem; import vazkii.botania.common.block.subtile.functional.SubTilePollidisiac; import vazkii.botania.common.block.subtile.functional.SubTileRannuncarpus; import vazkii.botania.common.block.subtile.functional.SubTileSolegnolia; import vazkii.botania.common.block.subtile.functional.SubTileSpectranthemum; import vazkii.botania.common.block.subtile.functional.SubTileTangleberrie; import vazkii.botania.common.block.subtile.functional.SubTileTigerseye; import vazkii.botania.common.block.subtile.functional.SubTileVinculotus; import vazkii.botania.common.block.subtile.generating.SubTileArcaneRose; import vazkii.botania.common.block.subtile.generating.SubTileDandelifeon; import vazkii.botania.common.block.subtile.generating.SubTileEndoflame; import vazkii.botania.common.block.subtile.generating.SubTileEntropinnyum; import vazkii.botania.common.block.subtile.generating.SubTileGourmaryllis; import vazkii.botania.common.block.subtile.generating.SubTileHydroangeas; import vazkii.botania.common.block.subtile.generating.SubTileKekimurus; import vazkii.botania.common.block.subtile.generating.SubTileMunchdew; import vazkii.botania.common.block.subtile.generating.SubTileNarslimmus; import vazkii.botania.common.block.subtile.generating.SubTileRafflowsia; import vazkii.botania.common.block.subtile.generating.SubTileSpectrolus; import vazkii.botania.common.block.subtile.generating.SubTileThermalily; import vazkii.botania.common.lib.LibBlockNames; import vazkii.botania.common.lib.LibMisc; public final class ModelHandler { public static void registerModels() { ModelLoaderRegistry.registerLoader(SpecialFlowerModel.Loader.INSTANCE); OBJLoader.INSTANCE.addDomain(LibMisc.MOD_ID.toLowerCase(Locale.ROOT)); registerSubtiles(); for(Block block : Block.REGISTRY) { if(block instanceof IModelRegister) ((IModelRegister) block).registerModels(); } for(Item item : Item.REGISTRY) { if(item instanceof IModelRegister) ((IModelRegister) item).registerModels(); } } private static void registerSubtiles() { BotaniaAPIClient.registerIslandTypeModel(IFloatingFlower.IslandType.GRASS, new ModelResourceLocation("botania:miniIsland", "variant=grass")); BotaniaAPIClient.registerIslandTypeModel(IFloatingFlower.IslandType.PODZOL, new ModelResourceLocation("botania:miniIsland", "variant=podzol")); BotaniaAPIClient.registerIslandTypeModel(IFloatingFlower.IslandType.MYCEL, new ModelResourceLocation("botania:miniIsland", "variant=mycel")); BotaniaAPIClient.registerIslandTypeModel(IFloatingFlower.IslandType.SNOW, new ModelResourceLocation("botania:miniIsland", "variant=snow")); BotaniaAPIClient.registerIslandTypeModel(IFloatingFlower.IslandType.DRY, new ModelResourceLocation("botania:miniIsland", "variant=dry")); BotaniaAPIClient.registerIslandTypeModel(IFloatingFlower.IslandType.GOLDEN, new ModelResourceLocation("botania:miniIsland", "variant=golden")); BotaniaAPIClient.registerIslandTypeModel(IFloatingFlower.IslandType.VIVID, new ModelResourceLocation("botania:miniIsland", "variant=vivid")); BotaniaAPIClient.registerIslandTypeModel(IFloatingFlower.IslandType.SCORCHED, new ModelResourceLocation("botania:miniIsland", "variant=scorched")); BotaniaAPIClient.registerIslandTypeModel(IFloatingFlower.IslandType.INFUSED, new ModelResourceLocation("botania:miniIsland", "variant=infused")); BotaniaAPIClient.registerIslandTypeModel(IFloatingFlower.IslandType.MUTATED, new ModelResourceLocation("botania:miniIsland", "variant=mutated")); BotaniaAPIClient.registerSubtileModel(SubTileManastar.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_MANASTAR)); BotaniaAPIClient.registerSubtileModel(SubTilePureDaisy.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_PUREDAISY)); BotaniaAPIClient.registerSubtileModel(SubTileEndoflame.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_ENDOFLAME)); BotaniaAPIClient.registerSubtileModel(SubTileHydroangeas.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_HYDROANGEAS)); BotaniaAPIClient.registerSubtileModel(SubTileThermalily.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_THERMALILY)); BotaniaAPIClient.registerSubtileModel(SubTileArcaneRose.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_ARCANE_ROSE)); BotaniaAPIClient.registerSubtileModel(SubTileMunchdew.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_MUNCHDEW)); BotaniaAPIClient.registerSubtileModel(SubTileEntropinnyum.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_ENTROPINNYUM)); BotaniaAPIClient.registerSubtileModel(SubTileKekimurus.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_KEKIMURUS)); BotaniaAPIClient.registerSubtileModel(SubTileGourmaryllis.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_GOURMARYLLIS)); BotaniaAPIClient.registerSubtileModel(SubTileNarslimmus.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_NARSLIMMUS)); BotaniaAPIClient.registerSubtileModel(SubTileSpectrolus.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_SPECTROLUS)); BotaniaAPIClient.registerSubtileModel(SubTileDandelifeon.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_DANDELIFEON)); BotaniaAPIClient.registerSubtileModel(SubTileRafflowsia.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_RAFFLOWSIA)); BotaniaAPIClient.registerSubtileModel(SubTileBellethorn.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_BELLETHORN)); BotaniaAPIClient.registerSubtileModel(SubTileBellethorn.Mini.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_BELLETHORN + "Chibi")); BotaniaAPIClient.registerSubtileModel(SubTileDreadthorn.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_DREADTHORN)); BotaniaAPIClient.registerSubtileModel(SubTileHeiseiDream.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_HEISEI_DREAM)); BotaniaAPIClient.registerSubtileModel(SubTileTigerseye.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_TIGERSEYE)); BotaniaAPIClient.registerSubtileModel(SubTileJadedAmaranthus.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_JADED_AMARANTHUS)); BotaniaAPIClient.registerSubtileModel(SubTileOrechid.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_ORECHID)); BotaniaAPIClient.registerSubtileModel(SubTileOrechidIgnem.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_ORECHID_IGNEM)); BotaniaAPIClient.registerSubtileModel(SubTileFallenKanade.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_FALLEN_KANADE)); BotaniaAPIClient.registerSubtileModel(SubTileExoflame.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_EXOFLAME)); BotaniaAPIClient.registerSubtileModel(SubTileAgricarnation.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_AGRICARNATION)); BotaniaAPIClient.registerSubtileModel(SubTileAgricarnation.Mini.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_AGRICARNATION + "Chibi")); BotaniaAPIClient.registerSubtileModel(SubTileHopperhock.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_HOPPERHOCK)); BotaniaAPIClient.registerSubtileModel(SubTileHopperhock.Mini.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_HOPPERHOCK + "Chibi")); BotaniaAPIClient.registerSubtileModel(SubTileTangleberrie.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_TANGLEBERRIE)); BotaniaAPIClient.registerSubtileModel(SubTileJiyuulia.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_JIYUULIA)); BotaniaAPIClient.registerSubtileModel(SubTileRannuncarpus.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_RANNUNCARPUS)); BotaniaAPIClient.registerSubtileModel(SubTileRannuncarpus.Mini.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_RANNUNCARPUS + "Chibi")); BotaniaAPIClient.registerSubtileModel(SubTileHyacidus.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_HYACIDUS)); BotaniaAPIClient.registerSubtileModel(SubTilePollidisiac.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_POLLIDISIAC)); BotaniaAPIClient.registerSubtileModel(SubTileClayconia.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_CLAYCONIA)); BotaniaAPIClient.registerSubtileModel(SubTileClayconia.Mini.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_CLAYCONIA + "Chibi")); BotaniaAPIClient.registerSubtileModel(SubTileLoonuim.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_LOONIUM)); BotaniaAPIClient.registerSubtileModel(SubTileDaffomill.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_DAFFOMILL)); BotaniaAPIClient.registerSubtileModel(SubTileVinculotus.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_VINCULOTUS)); BotaniaAPIClient.registerSubtileModel(SubTileSpectranthemum.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_SPECTRANTHEMUM)); BotaniaAPIClient.registerSubtileModel(SubTileMedumone.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_MEDUMONE)); BotaniaAPIClient.registerSubtileModel(SubTileMarimorphosis.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_MARIMORPHOSIS)); BotaniaAPIClient.registerSubtileModel(SubTileMarimorphosis.Mini.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_MARIMORPHOSIS + "Chibi")); BotaniaAPIClient.registerSubtileModel(SubTileBubbell.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_BUBBELL)); BotaniaAPIClient.registerSubtileModel(SubTileBubbell.Mini.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_BUBBELL + "Chibi")); BotaniaAPIClient.registerSubtileModel(SubTileSolegnolia.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_SOLEGNOLIA)); BotaniaAPIClient.registerSubtileModel(SubTileSolegnolia.Mini.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_SOLEGNOLIA + "Chibi")); BotaniaAPIClient.registerSubtileModel(SubTileBergamute.class, new ModelResourceLocation("botania:" + LibBlockNames.SUBTILE_BERGAMUTE)); } public static void registerItemAllMeta(Item item, int range) { registerItemMetas(item, range, i -> item.getRegistryName().getResourcePath()); } public static void registerItemAppendMeta(Item item, int maxExclusive, String loc) { registerItemMetas(item, maxExclusive, i -> loc + i); } public static void registerItemMetas(Item item, int maxExclusive, IntFunction<String> metaToName) { for (int i = 0; i < maxExclusive; i++) { ModelLoader.setCustomModelResourceLocation( item, i, new ModelResourceLocation(LibMisc.MOD_ID + ":" + metaToName.apply(i), "inventory") ); } } private static final Map<RegistryDelegate<Block>, IStateMapper> customStateMappers = ReflectionHelper.getPrivateValue(ModelLoader.class, null, "customStateMappers"); private static final DefaultStateMapper fallbackMapper = new DefaultStateMapper(); private static ModelResourceLocation getMrlForState(IBlockState state) { return customStateMappers .getOrDefault(state.getBlock().delegate, fallbackMapper) .putStateModelLocations(state.getBlock()) .get(state); } public static void registerBlockToState(Block b, int meta, IBlockState state) { ModelLoader.setCustomModelResourceLocation( Item.getItemFromBlock(b), meta, getMrlForState(state) ); } public static void registerBlockToState(Block b, int maxExclusive) { for(int i = 0; i < maxExclusive; i++) registerBlockToState(b, i, b.getStateFromMeta(i)); } // Registers the ItemBlock to models/item/<registryname>#inventory public static void registerInventoryVariant(Block b) { ModelLoader.setCustomModelResourceLocation( Item.getItemFromBlock(b), 0, new ModelResourceLocation(b.getRegistryName(), "inventory")); } // Registers the ItemBlock to a custom path in models/item/itemblock/ public static void registerCustomItemblock(Block b, String path) { registerCustomItemblock(b, 1, i -> path); } public static void registerCustomItemblock(Block b, int maxExclusive, IntFunction<String> metaToPath) { Item item = Item.getItemFromBlock(b); for (int i = 0; i < maxExclusive; i++) { ModelLoader.setCustomModelResourceLocation( item, i, new ModelResourceLocation(LibMisc.MOD_ID + ":itemblock/" + metaToPath.apply(i), "inventory") ); } } private ModelHandler() {} }