package com.cricketcraft.chisel.api.carving; import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.oredict.OreDictionary; import com.cricketcraft.chisel.api.ChiselAPIProps; import com.cricketcraft.chisel.api.FMPIMC; import com.cricketcraft.chisel.api.rendering.ISubmapManager; import com.cricketcraft.chisel.api.rendering.TextureType; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class CarvableHelper { public static Class itemCarvableClass = null; private Block theBlock; public ArrayList infoList = new ArrayList(); IVariationInfo[] infoMap = new IVariationInfo[16]; public boolean forbidChiseling = false; public CarvableHelper(Block block) { this.theBlock = block; } public void addVariation(String description, int metadata, ISubmapManager manager) { addVariation(description, metadata, null, manager); } public void addVariation(String description, int metadata, Block bb) { addVariation(description, metadata, null, bb, 0, ChiselAPIProps.MOD_ID); } public void addVariation(String description, int metadata, Block bb, int blockMeta) { addVariation(description, metadata, null, bb, blockMeta, ChiselAPIProps.MOD_ID); } public void addVariation(String description, int metadata, Block bb, int blockMeta, Material material) { addVariation(description, metadata, null, bb, blockMeta, ChiselAPIProps.MOD_ID); } public void addVariation(String description, int metadata, String texture) { addVariation(description, metadata, texture, (ISubmapManager) null); } public void addVariation(String description, int metadata, String texture, ISubmapManager manager) { addVariation(description, metadata, texture, null, 0, ChiselAPIProps.MOD_ID, manager, metadata); } public void addVariation(String description, int metadata, Block bb, String modid) { addVariation(description, metadata, null, bb, 0, modid); } public void addVariation(String description, int metadata, Block bb, int blockMeta, String modid) { addVariation(description, metadata, null, bb, blockMeta, modid); } public void addVariation(String description, int metadata, Block bb, int blockMeta, Material material, String modid) { addVariation(description, metadata, null, bb, blockMeta, modid); } public void addVariation(String description, int metadata, String texture, String modid) { addVariation(description, metadata, texture, null, 0, modid); } public void addVariation(String description, int metadata, String texture, Block block, int blockMeta, String modid) { addVariation(description, metadata, texture, block, blockMeta, modid, null, metadata); } public void addVariation(String description, int metadata, String texture, int order) { addVariation(description, metadata, texture, null, 0, ChiselAPIProps.MOD_ID, (ISubmapManager) null, order); } public void addVariation(String description, int metadata, String texture, Block block, int blockMeta, String modid, ISubmapManager customManager, int order) { if (infoList.size() >= 16) return; IVariationInfo info = FMLCommonHandler.instance().getSide().isClient() ? getClientInfo(modid, texture, description, metadata, block, blockMeta, customManager, order) : getServerInfo(modid, texture, description, metadata, block, blockMeta, customManager, order); infoList.add(info); infoMap[metadata] = info; } private IVariationInfo getClientInfo(String modid, String texture, String description, int metadata, Block block, int blockMeta, ISubmapManager customManager) { return getClientInfo(modid, texture, description, metadata, block, blockMeta, customManager, metadata); } private IVariationInfo getClientInfo(String modid, String texture, String description, int metadata, Block block, int blockMeta, ISubmapManager customManager, int order) { ICarvingVariation var = CarvingUtils.getDefaultVariationFor(theBlock, metadata, order); TextureType type = TextureType.getTypeFor(this, modid, texture); if (type == TextureType.CUSTOM && customManager == null && block == null) { throw new IllegalArgumentException(String.format("Could not find texture %s, and no custom texture manager was provided.", texture)); } ISubmapManager manager; if (customManager != null) { manager = customManager; } else if (block != null) { manager = type.createManagerFor(var, block, blockMeta); } else { manager = type.createManagerFor(var, texture); } return new VariationInfoBase(var, description, manager); } private IVariationInfo getServerInfo(String modid, String texture, String description, int metadata, Block block, int blockMeta, ISubmapManager customManager) { return getServerInfo(modid, texture, description, metadata, block, blockMeta, customManager, metadata); } private IVariationInfo getServerInfo(String modid, String texture, String description, int metadata, Block block, int blockMeta, ISubmapManager customManager, int order) { ICarvingVariation var = CarvingUtils.getDefaultVariationFor(theBlock, metadata, order); return new VariationInfoBase(var, description, null); } public IVariationInfo getVariation(int metadata) { if (metadata < 0 || metadata > 15) metadata = 0; IVariationInfo info = infoMap[metadata]; if (info == null) return null; return info; } public IIcon getIcon(int side, int metadata) { if (metadata < 0 || metadata > 15) metadata = 0; IVariationInfo info = infoMap[metadata]; if (info == null) return getMissingIcon(); return info.getSubmapManager().getIcon(side, metadata); } public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { int metadata = world.getBlockMetadata(x, y, z); if (metadata < 0 || metadata > 15) metadata = 0; IVariationInfo info = infoMap[metadata]; if (info == null) return getMissingIcon(); return info.getSubmapManager().getIcon(world, x, y, z, side); } public void registerAll(Block block, String name) { registerAll(block, name, itemCarvableClass); } public void registerBlock(Block block, String name) { registerBlock(block, name, itemCarvableClass); } void registerBlock(Block block, String name, Class cl) { block.setBlockName("chisel." + name); GameRegistry.registerBlock(block, cl, name); } public void registerAll(Block block, String name, Class cl) { registerBlock(block, name, cl); registerVariations(name, block); } public void registerVariations(String name, Block block) { for (IVariationInfo info : infoList) { registerVariation(name, info); } } public void registerVariation(String name, IVariationInfo info) { Block block = info.getVariation().getBlock(); if (block.renderAsNormalBlock() || block.isOpaqueCube() || block.isNormalCube()) { FMPIMC.registerFMP(block, info.getVariation().getBlockMeta()); } if (forbidChiseling) return; CarvingUtils.getChiselRegistry().addVariation(name, info.getVariation()); } @SideOnly(Side.CLIENT) public void registerBlockIcons(String modName, Block block, IIconRegister register) { for (IVariationInfo info : infoList) { info.getSubmapManager().registerIcons(modName, block, register); } } public void registerSubBlocks(Block block, CreativeTabs tabs, List list) { for (IVariationInfo info : infoList) { list.add(new ItemStack(block, 1, info.getVariation().getItemMeta())); } } public void registerOre(String ore) { OreDictionary.registerOre(ore, infoList.get(0).getVariation().getBlock()); } @SideOnly(Side.CLIENT) public IIcon getMissingIcon() { return ((TextureMap) Minecraft.getMinecraft().getTextureManager().getTexture(TextureMap.locationBlocksTexture)).getAtlasSprite("missingno"); } }