package com.pclewis.mcpatcher.mod; import com.pclewis.mcpatcher.MCPatcherUtils; import com.pclewis.mcpatcher.mod.CustomAnimation; import com.pclewis.mcpatcher.mod.TileSize; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.File; import javax.imageio.stream.FileImageInputStream; import java.lang.reflect.Constructor; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import javax.imageio.ImageIO; import net.minecraft.client.Minecraft; import net.minecraft.src.ColorizerFoliage; import net.minecraft.src.ColorizerGrass; import net.minecraft.src.ColorizerWater; import net.minecraft.src.GLAllocation; import net.minecraft.src.TextureCompassFX; import net.minecraft.src.TextureFX; import net.minecraft.src.TextureFlamesFX; import net.minecraft.src.TextureLavaFX; import net.minecraft.src.TextureLavaFlowFX; import net.minecraft.src.TexturePackBase; import net.minecraft.src.TexturePackDefault; import net.minecraft.src.TexturePortalFX; import net.minecraft.src.TextureWatchFX; import net.minecraft.src.TextureWaterFX; import net.minecraft.src.TextureWaterFlowFX; public class TextureUtils { public static Minecraft minecraft; private static boolean animatedFire = true; private static boolean animatedLava = true; private static boolean animatedWater = true; private static boolean animatedPortal = true; private static boolean customFire = true; private static boolean customLava = true; private static boolean customWater = true; private static boolean customPortal = true; public static final int LAVA_STILL_TEXTURE_INDEX = 237; public static final int LAVA_FLOWING_TEXTURE_INDEX = 238; public static final int WATER_STILL_TEXTURE_INDEX = 205; public static final int WATER_FLOWING_TEXTURE_INDEX = 206; public static final int FIRE_E_W_TEXTURE_INDEX = 31; public static final int FIRE_N_S_TEXTURE_INDEX = 47; public static final int PORTAL_TEXTURE_INDEX = 14; private static HashMap expectedColumns = new HashMap(); private static boolean useTextureCache = false; private static TexturePackBase lastTexturePack = null; private static HashMap cache = new HashMap(); public static boolean setTileSize() { int var0 = getTileSize(); if(var0 == TileSize.int_size) { //unchanged return false; } else { TileSize.setTileSize(var0); return true; } } public static void setFontRenderer() { minecraft.fontRenderer.initialize(minecraft.gameSettings, "/font/default.png", minecraft.renderEngine); } public static void registerTextureFX(List var0, TextureFX var1) { TextureFX var2 = refreshTextureFX(var1); if(var2 != null) { var0.add(var2); var2.onTick(); } } private static TextureFX refreshTextureFX(TextureFX var0) { if(!(var0 instanceof TextureCompassFX) && !(var0 instanceof TextureWatchFX) && !(var0 instanceof TextureLavaFX) && !(var0 instanceof TextureLavaFlowFX) && !(var0 instanceof TextureWaterFX) && !(var0 instanceof TextureWaterFlowFX) && !(var0 instanceof TextureFlamesFX) && !(var0 instanceof TexturePortalFX) && !(var0 instanceof CustomAnimation)) { Class var1 = var0.getClass(); for(int var2 = 0; var2 < 3; ++var2) { try { Constructor var3; switch(var2) { case 0: var3 = var1.getConstructor(new Class[]{Minecraft.class, Integer.TYPE}); return (TextureFX)var3.newInstance(new Object[]{minecraft, Integer.valueOf(TileSize.int_size)}); case 1: var3 = var1.getConstructor(new Class[]{Minecraft.class}); return (TextureFX)var3.newInstance(new Object[]{minecraft}); case 2: var3 = var1.getConstructor(new Class[0]); return (TextureFX)var3.newInstance(new Object[0]); } } catch (NoSuchMethodException var5) { ; } catch (IllegalAccessException var6) { ; } catch (Exception var7) { var7.printStackTrace(); } } if(var0.imageData.length != TileSize.int_numBytes) { var0.imageData = new byte[TileSize.int_numBytes]; } return var0; } else { return null; } } public static void refreshTextureFX(List var0) { //MCPatcherUtils.log("refreshTextureFX()", new Object[0]); ArrayList var1 = new ArrayList(); Iterator var2 = var0.iterator(); while(var2.hasNext()) { TextureFX var3 = (TextureFX)var2.next(); TextureFX var4 = refreshTextureFX(var3); if(var4 != null) { var1.add(var4); } } var0.clear(); var0.add(new TextureCompassFX(minecraft)); var0.add(new TextureWatchFX(minecraft)); TexturePackBase var6 = getSelectedTexturePack(); boolean var7 = var6 == null || var6 instanceof TexturePackDefault; if(!var7 && customLava) { var0.add(new CustomAnimation(237, 0, 1, "lava_still", -1, -1)); var0.add(new CustomAnimation(238, 0, 2, "lava_flowing", 3, 6)); } else if(animatedLava) { var0.add(new TextureLavaFX()); var0.add(new TextureLavaFlowFX()); } if(!var7 && customWater) { var0.add(new CustomAnimation(205, 0, 1, "water_still", -1, -1)); var0.add(new CustomAnimation(206, 0, 2, "water_flowing", 0, 0)); } else if(animatedWater) { var0.add(new TextureWaterFX()); var0.add(new TextureWaterFlowFX()); } if(!var7 && customFire && hasResource("/custom_fire_e_w.png") && hasResource("/custom_fire_n_s.png")) { var0.add(new CustomAnimation(47, 0, 1, "fire_n_s", 2, 4)); var0.add(new CustomAnimation(31, 0, 1, "fire_e_w", 2, 4)); } else if(animatedFire) { var0.add(new TextureFlamesFX(0)); var0.add(new TextureFlamesFX(1)); } if(!var7 && customPortal && hasResource("/custom_portal.png")) { var0.add(new CustomAnimation(14, 0, 1, "portal", -1, -1)); } else if(animatedPortal) { var0.add(new TexturePortalFX()); } Iterator var8 = var1.iterator(); TextureFX var5; while(var8.hasNext()) { var5 = (TextureFX)var8.next(); var0.add(var5); } var8 = var0.iterator(); while(var8.hasNext()) { var5 = (TextureFX)var8.next(); var5.onTick(); } if(ColorizerWater.waterBuffer != ColorizerFoliage.foliageBuffer) { refreshColorizer(ColorizerWater.waterBuffer, "/misc/watercolor.png"); } refreshColorizer(ColorizerGrass.grassBuffer, "/misc/grasscolor.png"); refreshColorizer(ColorizerFoliage.foliageBuffer, "/misc/foliagecolor.png"); System.gc(); } public static TexturePackBase getSelectedTexturePack() { return minecraft == null?null:(minecraft.texturePackList == null?null:minecraft.texturePackList.selectedTexturePack); } public static String getTexturePackName(TexturePackBase var0) { return var0 == null?"Default":var0.texturePackFileName; } public static ByteBuffer getByteBuffer(ByteBuffer var0, byte[] var1) { var0.clear(); int var2 = var0.capacity(); int var3 = var1.length; if(var3 > var2 || var2 >= 4 * var3) { var0 = GLAllocation.createDirectByteBuffer(var3); } var0.put(var1); var0.position(0).limit(var3); TileSize.int_glBufferSize = var3; return var0; } public static InputStream getResourceAsStream(TexturePackBase var0, String var1) { InputStream var2 = null; if(var0 != null) { try { var2 = var0.getResourceAsStream(var1); } catch (Exception var4) { var4.printStackTrace(); } } if(var2 == null) { var2 = TextureUtils.class.getResourceAsStream(var1); } if(var2 == null && !var1.startsWith("/custom_")) { var2 = Thread.currentThread().getContextClassLoader().getResourceAsStream(var1); } return var2; } public static InputStream getResourceAsStream(String var0) { return getResourceAsStream(getSelectedTexturePack(), var0); } public static BufferedImage getResourceAsBufferedImage(TexturePackBase var0, String var1) throws IOException { BufferedImage var2 = null; boolean var3 = false; if(useTextureCache && var0 == lastTexturePack) { var2 = (BufferedImage)cache.get(var1); if(var2 != null) { var3 = true; } } if(var2 == null) { InputStream var4 = getResourceAsStream(var0, var1); if(var4 != null) { try { var2 = ImageIO.read(var4); } finally { MCPatcherUtils.close((Closeable)var4); } } } if(var2 == null) { //Search local files (downloaded texture) FileImageInputStream imageStream = null; try { File test = new File(var1); if (test.exists()) { imageStream = new FileImageInputStream(test); var2 = ImageIO.read(imageStream); } } catch (Exception e) { e.printStackTrace(); } } if(var2 == null) { throw new IOException(var1 + " image is null"); } else { if(useTextureCache && !var3 && var0 != lastTexturePack) { cache.clear(); } if(!var3) { Integer var8 = (Integer)expectedColumns.get(var1); if(var8 != null && var2.getWidth() != var8.intValue() * TileSize.int_size) { var2 = resizeImage(var2, var8.intValue() * TileSize.int_size); } if(useTextureCache) { lastTexturePack = var0; cache.put(var1, var2); } } return var2; } } public static BufferedImage getResourceAsBufferedImage(String var0) throws IOException { return getResourceAsBufferedImage(getSelectedTexturePack(), var0); } public static int getTileSize(TexturePackBase var0) { int var1 = 0; Iterator var2 = expectedColumns.entrySet().iterator(); while(var2.hasNext()) { Entry var3 = (Entry)var2.next(); InputStream var4 = null; try { var4 = getResourceAsStream(var0, (String)var3.getKey()); if(var4 != null) { BufferedImage var5 = ImageIO.read(var4); int var6 = var5.getWidth() / ((Integer)var3.getValue()).intValue(); var1 = Math.max(var1, var6); } } catch (Exception var10) { var10.printStackTrace(); } finally { MCPatcherUtils.close((Closeable)var4); } } return var1 > 0?var1:16; } public static int getTileSize() { return getTileSize(getSelectedTexturePack()); } public static boolean hasResource(TexturePackBase var0, String var1) { InputStream var2 = getResourceAsStream(var0, var1); boolean var3 = var2 != null; MCPatcherUtils.close((Closeable)var2); return var3; } public static boolean hasResource(String var0) { return hasResource(getSelectedTexturePack(), var0); } private static BufferedImage resizeImage(BufferedImage var0, int var1) { int var2 = var0.getHeight() * var1 / var0.getWidth(); BufferedImage var3 = new BufferedImage(var1, var2, 2); Graphics2D var4 = var3.createGraphics(); var4.drawImage(var0, 0, 0, var1, var2, (ImageObserver)null); return var3; } private static void refreshColorizer(int[] var0, String var1) { try { BufferedImage var2 = getResourceAsBufferedImage(var1); if(var2 != null) { var2.getRGB(0, 0, 256, 256, var0, 0, 256); } } catch (IOException var3) { var3.printStackTrace(); } } public static void setMinecraft(Minecraft var0) { minecraft = var0; } public static Minecraft getMinecraft() { return minecraft; } static { expectedColumns.put("/terrain.png", Integer.valueOf(16)); expectedColumns.put("/gui/items.png", Integer.valueOf(16)); expectedColumns.put("/misc/dial.png", Integer.valueOf(1)); expectedColumns.put("/custom_lava_still.png", Integer.valueOf(1)); expectedColumns.put("/custom_lava_flowing.png", Integer.valueOf(1)); expectedColumns.put("/custom_water_still.png", Integer.valueOf(1)); expectedColumns.put("/custom_water_flowing.png", Integer.valueOf(1)); expectedColumns.put("/custom_fire_n_s.png", Integer.valueOf(1)); expectedColumns.put("/custom_fire_e_w.png", Integer.valueOf(1)); expectedColumns.put("/custom_portal.png", Integer.valueOf(1)); } }