package net.minecraft.src; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.Properties; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import javax.imageio.ImageIO; import net.minecraft.client.renderer.texture.ITextureObject; import net.minecraft.client.resources.AbstractResourcePack; import net.minecraft.client.resources.IResourcePack; import net.minecraft.client.settings.GameSettings; import net.minecraft.util.ResourceLocation; public class TextureAnimations { private static TextureAnimation[] textureAnimations = null; public static void reset() { textureAnimations = null; } public static void update() { IResourcePack[] rps = Config.getResourcePacks(); textureAnimations = getTextureAnimations(rps); updateAnimations(); } public static void updateCustomAnimations() { if (textureAnimations != null) { if (Config.isAnimatedTextures()) { updateAnimations(); } } } public static void updateAnimations() { if (textureAnimations != null) { for (int i = 0; i < textureAnimations.length; ++i) { TextureAnimation anim = textureAnimations[i]; anim.updateTexture(); } } } public static TextureAnimation[] getTextureAnimations(IResourcePack[] rps) { ArrayList list = new ArrayList(); for (int anims = 0; anims < rps.length; ++anims) { IResourcePack rp = rps[anims]; TextureAnimation[] tas = getTextureAnimations(rp); if (tas != null) { list.addAll(Arrays.asList(tas)); } } TextureAnimation[] var5 = (TextureAnimation[])((TextureAnimation[])list.toArray(new TextureAnimation[list.size()])); return var5; } public static TextureAnimation[] getTextureAnimations(IResourcePack rp) { if (!(rp instanceof AbstractResourcePack)) { return null; } else { AbstractResourcePack arp = (AbstractResourcePack)rp; File tpFile = ResourceUtils.getResourcePackFile(arp); if (tpFile == null) { return null; } else if (!tpFile.exists()) { return null; } else { String[] animPropNames = null; if (tpFile.isFile()) { animPropNames = getAnimationPropertiesZip(tpFile); } else { animPropNames = getAnimationPropertiesDir(tpFile); } if (animPropNames == null) { return null; } else { ArrayList list = new ArrayList(); for (int anims = 0; anims < animPropNames.length; ++anims) { String propName = animPropNames[anims]; Config.dbg("Texture animation: " + propName); try { ResourceLocation e = new ResourceLocation(propName); InputStream in = rp.getInputStream(e); Properties props = new Properties(); props.load(in); TextureAnimation anim = makeTextureAnimation(props, e); if (anim != null) { ResourceLocation locDstTex = new ResourceLocation(anim.getDstTex()); if (Config.getDefiningResourcePack(locDstTex) != rp) { Config.dbg("Skipped: " + propName + ", target texture not loaded from same resource pack"); } else { list.add(anim); } } } catch (FileNotFoundException var12) { Config.warn("File not found: " + var12.getMessage()); } catch (IOException var13) { var13.printStackTrace(); } } TextureAnimation[] var14 = (TextureAnimation[])((TextureAnimation[])list.toArray(new TextureAnimation[list.size()])); return var14; } } } } public static TextureAnimation makeTextureAnimation(Properties props, ResourceLocation propLoc) { String texFrom = props.getProperty("from"); String texTo = props.getProperty("to"); int x = Config.parseInt(props.getProperty("x"), -1); int y = Config.parseInt(props.getProperty("y"), -1); int width = Config.parseInt(props.getProperty("w"), -1); int height = Config.parseInt(props.getProperty("h"), -1); if (texFrom != null && texTo != null) { if (x >= 0 && y >= 0 && width >= 0 && height >= 0) { String basePath = TextureUtils.getBasePath(propLoc.getResourcePath()); texFrom = TextureUtils.fixResourcePath(texFrom, basePath); texTo = TextureUtils.fixResourcePath(texTo, basePath); byte[] imageBytes = getCustomTextureData(texFrom, width); if (imageBytes == null) { Config.warn("TextureAnimation: Source texture not found: " + texTo); return null; } else { ResourceLocation locTexTo = new ResourceLocation(texTo); if (!Config.hasResource(locTexTo)) { Config.warn("TextureAnimation: Target texture not found: " + texTo); return null; } else { ITextureObject destTex = TextureUtils.getTexture(locTexTo); if (destTex == null) { Config.warn("TextureAnimation: Target texture not found: " + locTexTo); return null; } else { int destTexId = destTex.getGlTextureId(); TextureAnimation anim = new TextureAnimation(texFrom, imageBytes, texTo, destTexId, x, y, width, height, props, 1); return anim; } } } } else { Config.warn("TextureAnimation: Invalid coordinates"); return null; } } else { Config.warn("TextureAnimation: Source or target texture not specified"); return null; } } public static String[] getAnimationPropertiesDir(File tpDir) { File dirAnim = new File(tpDir, "anim"); if (!dirAnim.exists()) { return null; } else if (!dirAnim.isDirectory()) { return null; } else { File[] propFiles = dirAnim.listFiles(); if (propFiles == null) { return null; } else { ArrayList list = new ArrayList(); for (int props = 0; props < propFiles.length; ++props) { File file = propFiles[props]; String name = file.getName(); if (!name.startsWith("custom_") && name.endsWith(".properties") && file.isFile() && file.canRead()) { Config.dbg("TextureAnimation: anim/" + file.getName()); list.add("/anim/" + name); } } String[] var7 = (String[])((String[])list.toArray(new String[list.size()])); return var7; } } } public static String[] getAnimationPropertiesZip(File tpFile) { try { ZipFile e = new ZipFile(tpFile); Enumeration en = e.entries(); ArrayList list = new ArrayList(); while (en.hasMoreElements()) { ZipEntry props = (ZipEntry)en.nextElement(); String name = props.getName(); if (name.startsWith("assets/minecraft/mcpatcher/anim/") && !name.startsWith("assets/minecraft/mcpatcher/anim/custom_") && name.endsWith(".properties")) { String assetsMcStr = "assets/minecraft/"; name = name.substring(assetsMcStr.length()); list.add(name); } } String[] props1 = (String[])((String[])list.toArray(new String[list.size()])); return props1; } catch (IOException var7) { var7.printStackTrace(); return null; } } public static byte[] getCustomTextureData(String imagePath, int tileWidth) { byte[] imageBytes = loadImage(imagePath, tileWidth); if (imageBytes == null) { imageBytes = loadImage("/anim" + imagePath, tileWidth); } return imageBytes; } private static byte[] loadImage(String name, int targetWidth) { GameSettings options = Config.getGameSettings(); try { ResourceLocation e = new ResourceLocation(name); InputStream in = Config.getResourceStream(e); if (in == null) { return null; } else { BufferedImage image = readTextureImage(in); if (image == null) { return null; } else { if (targetWidth > 0 && image.getWidth() != targetWidth) { double width = (double)(image.getHeight() / image.getWidth()); int ai = (int)((double)targetWidth * width); image = scaleBufferedImage(image, targetWidth, ai); } int var20 = image.getWidth(); int height = image.getHeight(); int[] var21 = new int[var20 * height]; byte[] byteBuf = new byte[var20 * height * 4]; image.getRGB(0, 0, var20, height, var21, 0, var20); for (int l = 0; l < var21.length; ++l) { int alpha = var21[l] >> 24 & 255; int red = var21[l] >> 16 & 255; int green = var21[l] >> 8 & 255; int blue = var21[l] & 255; if (options != null && options.anaglyph) { int j3 = (red * 30 + green * 59 + blue * 11) / 100; int l3 = (red * 30 + green * 70) / 100; int j4 = (red * 30 + blue * 70) / 100; red = j3; green = l3; blue = j4; } byteBuf[l * 4 + 0] = (byte)red; byteBuf[l * 4 + 1] = (byte)green; byteBuf[l * 4 + 2] = (byte)blue; byteBuf[l * 4 + 3] = (byte)alpha; } return byteBuf; } } } catch (FileNotFoundException var18) { return null; } catch (Exception var19) { var19.printStackTrace(); return null; } } private static BufferedImage readTextureImage(InputStream par1InputStream) throws IOException { BufferedImage var2 = ImageIO.read(par1InputStream); par1InputStream.close(); return var2; } public static BufferedImage scaleBufferedImage(BufferedImage image, int width, int height) { BufferedImage scaledImage = new BufferedImage(width, height, 2); Graphics2D gr = scaledImage.createGraphics(); gr.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); gr.drawImage(image, 0, 0, width, height, (ImageObserver)null); return scaledImage; } }