package com.carpentersblocks.util.handler; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import java.util.Enumeration; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import javax.imageio.ImageIO; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.resources.IResourceManager; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.Level; import com.carpentersblocks.CarpentersBlocks; import com.carpentersblocks.CarpentersBlocksCachedResources; import com.carpentersblocks.util.ModLogger; import com.carpentersblocks.util.registry.BlockRegistry; import com.carpentersblocks.util.registry.FeatureRegistry; import com.carpentersblocks.util.registry.IconRegistry; import com.carpentersblocks.util.registry.ItemRegistry; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class DesignHandler { public static ArrayList<String> listChisel = new ArrayList<String>(); public static ArrayList<String> listBed = new ArrayList<String>(); public static ArrayList<String> listFlowerPot = new ArrayList<String>(); public static ArrayList<String> listTile = new ArrayList<String>(); private static final String PATH_BASE = "assets/carpentersblocks/textures/blocks/"; private static final String PATH_EXEMPT = "template/"; private static final String PATH_CHISEL = "designs/chisel/"; private static final String PATH_BED = "designs/bed/"; private static final String PATH_FLOWER_POT = "designs/flowerpot/"; private static final String PATH_TILE = "designs/tile/"; private static boolean isPathValid(String path) { return path.contains(PATH_BASE) && path.endsWith(".png") && !path.contains(PATH_EXEMPT); } /** * Processes design files. */ public static void preInit(FMLPreInitializationEvent event) { File filePath = new File(event.getSourceFile().getAbsolutePath()); if (filePath.isDirectory()) { for (File file : FileUtils.listFiles(filePath, new String[] { "png" }, true)) { processPath(file.getAbsolutePath().replace("\\", "/")); } } else { try { JarFile jarFile = new JarFile(event.getSourceFile()); Enumeration enumeration = jarFile.entries(); while (enumeration.hasMoreElements()) { processPath(((ZipEntry)enumeration.nextElement()).getName()); } jarFile.close(); } catch (Exception e) { } } ModLogger.log(Level.INFO, String.format("Designs found: Bed(%s), Chisel(%s), FlowerPot(%s), Tile(%s)", listBed.size(), listChisel.size(), listFlowerPot.size(), listTile.size())); } private static void processPath(String path) { if (isPathValid(path)) { String name = path.substring(path.lastIndexOf('/') + 1, path.lastIndexOf('.')); if (path.contains(PATH_CHISEL)) { listChisel.add(name); } else if (path.contains(PATH_BED)) { listBed.add(name); } else if (path.contains(PATH_FLOWER_POT)) { listFlowerPot.add(name); } else if (path.contains(PATH_TILE)) { listTile.add(name); } } } @SideOnly(Side.CLIENT) public static void addResources(IResourceManager resourceManager) { for (String iconName : listBed) { ArrayList<BufferedImage> tempList = getBedIcons(resourceManager, iconName); for (BufferedImage image : tempList) { CarpentersBlocksCachedResources.INSTANCE.addResource("/textures/blocks/designs/bed/cache/" + iconName + "_" + tempList.indexOf(image), image); } } } @SideOnly(Side.CLIENT) public static void registerIcons(IIconRegister iconRegister) { if (BlockRegistry.enableBed) { for (String iconName : listBed) { IIcon[] icons = new IIcon[8]; for (int count = 0; count < 8; ++count) { icons[count] = iconRegister.registerIcon(CarpentersBlocksCachedResources.INSTANCE.getModId() + ":" + PATH_BED + "cache/" + iconName + "_" + count); } IconRegistry.icon_design_bed.add(icons); } } if (FeatureRegistry.enableChiselDesigns) { for (String iconName : listChisel) { IconRegistry.icon_design_chisel.add(iconRegister.registerIcon(CarpentersBlocks.MODID + ":" + PATH_CHISEL + iconName)); } } if (BlockRegistry.enableFlowerPot) { for (String iconName : listFlowerPot) { IconRegistry.icon_design_flower_pot.add(iconRegister.registerIcon(CarpentersBlocks.MODID + ":" + PATH_FLOWER_POT + iconName)); } } if (ItemRegistry.enableTile) { for (String iconName : listTile) { IconRegistry.icon_design_tile.add(iconRegister.registerIcon(CarpentersBlocks.MODID + ":" + PATH_TILE + iconName)); } } } public static ArrayList<String> getListForType(String type) { return (ArrayList<String>) ( type.equals("chisel") ? listChisel.clone() : type.equals("bed") ? listBed.clone() : type.equals("flowerpot") ? listFlowerPot.clone() : type.equals("tile") ? listTile.clone() : null); } /** * Returns name of next tile in list. */ public static String getNext(String type, String iconName) { ArrayList<String> tempList = getListForType(type); if (tempList.isEmpty()) { return iconName; } else { int idx = tempList.indexOf(iconName) + 1; return tempList.get(idx >= tempList.size() ? 0 : idx); } } /** * Returns name of previous tile in list. */ public static String getPrev(String type, String iconName) { ArrayList<String> tempList = getListForType(type); if (tempList.isEmpty()) { return iconName; } else { int idx = iconName.equals("") ? tempList.size() - 1 : tempList.indexOf(iconName) - 1; return tempList.get(idx < 0 ? tempList.size() - 1 : idx); } } @SideOnly(Side.CLIENT) public static ArrayList<BufferedImage> getBedIcons(IResourceManager resourceManager, String atlas) { ArrayList<BufferedImage> imageList = new ArrayList<BufferedImage>(); try { ResourceLocation resourceLocation = new ResourceLocation(CarpentersBlocks.MODID + ":textures/blocks/designs/bed/" + atlas + ".png"); BufferedImage image = ImageIO.read(resourceManager.getResource(resourceLocation).getInputStream()); int size = image.getWidth() / 3; int rows = image.getHeight() / size; int cols = image.getWidth() / size; int count = -1; for (int x = 0; x < rows; x++) { for (int y = 0; y < cols; y++) { ++count; switch (count) { case 0: case 2: case 9: case 11: continue; default: BufferedImage bufferedImage = new BufferedImage(size, size, image.getType()); Graphics2D gr = bufferedImage.createGraphics(); switch (count) { case 3: case 6: gr.rotate(Math.toRadians(270.0D), size/2, size/2); break; case 5: case 8: gr.rotate(Math.toRadians(90.0D), size/2, size/2); break; } gr.drawImage(image, 0, 0, size, size, size * y, size * x, size * y + size, size * x + size, null); gr.dispose(); imageList.add(bufferedImage); } } } } catch (Exception e) { } return imageList; } }