package com.prupe.mcpatcher; import com.prupe.mcpatcher.TexturePackAPI$1; import java.awt.image.BufferedImage; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Properties; import java.util.Set; import java.util.Map.Entry; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import javax.imageio.ImageIO; import net.minecraft.src.AbstractResourcePack; import net.minecraft.src.AbstractTexture; import net.minecraft.src.DefaultResourcePack; import net.minecraft.src.DynamicTexture; import net.minecraft.src.FallbackResourceManager; import net.minecraft.src.FileResourcePack; import net.minecraft.src.Minecraft; import net.minecraft.src.ResourceLocation; import net.minecraft.src.ResourceManager; import net.minecraft.src.ResourcePack; import net.minecraft.src.SimpleReloadableResourceManager; import net.minecraft.src.TextureManager; import net.minecraft.src.TextureMap; import net.minecraft.src.TextureObject; import org.lwjgl.opengl.GL11; public class TexturePackAPI { private static final MCLogger logger = MCLogger.getLogger("Texture Pack"); public static final String DEFAULT_NAMESPACE = "minecraft"; public static final String MCPATCHER_SUBDIR = "mcpatcher/"; public static TexturePackAPI instance = new TexturePackAPI(); public static List<ResourcePack> getResourcePacks(String namespace) { ArrayList list = new ArrayList(); ResourceManager resourceManager = getResourceManager(); if (resourceManager instanceof SimpleReloadableResourceManager) { Iterator i$ = ((SimpleReloadableResourceManager)resourceManager).domainResourceManagers.entrySet().iterator(); while (i$.hasNext()) { Entry entry = (Entry)i$.next(); if (namespace == null || namespace.equals(entry.getKey())) { FallbackResourceManager resourceManager1 = (FallbackResourceManager)entry.getValue(); list.addAll(resourceManager1.resourcePacks); } } } Collections.reverse(list); return list; } public static Set<String> getNamespaces() { HashSet set = new HashSet(); ResourceManager resourceManager = getResourceManager(); if (resourceManager instanceof SimpleReloadableResourceManager) { set.addAll(((SimpleReloadableResourceManager)resourceManager).domainResourceManagers.keySet()); } return set; } public static ResourceManager getResourceManager() { return Minecraft.getMinecraft().getResourceManager(); } public static boolean isDefaultTexturePack() { return getResourcePacks("minecraft").size() <= 1; } public static InputStream getInputStream(ResourceLocation resource) { return resource == null ? null : instance.getInputStreamImpl(resource); } public static boolean hasResource(ResourceLocation resource) { if (resource == null) { return false; } else if (resource.getResourcePath().endsWith(".png")) { return getImage(resource) != null; } else if (resource.getResourcePath().endsWith(".properties")) { return getProperties(resource) != null; } else { InputStream is = getInputStream(resource); MCPatcherUtils.close((Closeable)is); return is != null; } } public static BufferedImage getImage(ResourceLocation resource) { return resource == null ? null : instance.getImageImpl(resource); } public static Properties getProperties(ResourceLocation resource) { Properties properties = new Properties(); return getProperties(resource, properties) ? properties : null; } public static boolean getProperties(ResourceLocation resource, Properties properties) { return resource != null && instance.getPropertiesImpl(resource, properties); } public static ResourceLocation transformResourceLocation(ResourceLocation resource, String oldExt, String newExt) { return new ResourceLocation(resource.getResourceDomain(), resource.getResourcePath().replaceFirst(Pattern.quote(oldExt) + "$", newExt)); } public static ResourceLocation parseResourceLocation(ResourceLocation baseResource, String path) { if (path != null && !path.equals("")) { boolean absolute = false; if (path.startsWith("%blur%")) { path = path.substring(6); } if (path.startsWith("%clamp%")) { path = path.substring(7); } if (path.startsWith("/")) { path = path.substring(1); absolute = true; } if (path.startsWith("assets/minecraft/")) { path = path.substring(17); absolute = true; } int colon = path.indexOf(58); return colon >= 0 ? new ResourceLocation(path.substring(0, colon), path.substring(colon + 1)) : (path.startsWith("~/") ? new ResourceLocation(baseResource.getResourceDomain(), "mcpatcher/" + path.substring(2)) : (path.startsWith("./") ? new ResourceLocation(baseResource.getResourceDomain(), baseResource.getResourcePath().replaceFirst("[^/]+$", "") + path.substring(2)) : (!absolute && !path.contains("/") ? new ResourceLocation(baseResource.getResourceDomain(), baseResource.getResourcePath().replaceFirst("[^/]+$", "") + path) : new ResourceLocation(baseResource.getResourceDomain(), path)))); } else { return null; } } public static ResourceLocation newMCPatcherResourceLocation(String path) { return new ResourceLocation("mcpatcher/" + path); } public static List<ResourceLocation> listResources(String directory, String suffix, boolean recursive, boolean directories, boolean sortByFilename) { return listResources((String)null, directory, suffix, recursive, directories, sortByFilename); } public static List<ResourceLocation> listResources(String namespace, String directory, String suffix, boolean recursive, boolean directories, boolean sortByFilename) { if (suffix == null) { suffix = ""; } ArrayList resources = new ArrayList(); if (MCPatcherUtils.isNullOrEmpty(namespace)) { Iterator i$ = getNamespaces().iterator(); while (i$.hasNext()) { String namespace1 = (String)i$.next(); findResources(namespace1, directory, suffix, recursive, directories, resources); } } else { findResources(namespace, directory, suffix, recursive, directories, resources); } Collections.sort(resources, new TexturePackAPI$1(sortByFilename)); return resources; } private static void findResources(String namespace, String directory, String suffix, boolean recursive, boolean directories, Collection<ResourceLocation> resources) { Iterator i$ = getResourcePacks(namespace).iterator(); while (i$.hasNext()) { ResourcePack resourcePack = (ResourcePack)i$.next(); if (resourcePack instanceof FileResourcePack) { ZipFile base = ((FileResourcePack)resourcePack).resourcePackZipFile; if (base != null) { findResources(base, namespace, "assets/" + namespace, directory, suffix, recursive, directories, resources); } } else { File base1; if (resourcePack instanceof DefaultResourcePack) { if ("minecraft".equals(namespace)) { base1 = ((DefaultResourcePack)resourcePack).fileAssets; if (base1 != null && base1.isDirectory()) { findResources(base1, namespace, directory, suffix, recursive, directories, resources); } } } else if (resourcePack instanceof AbstractResourcePack) { base1 = ((AbstractResourcePack)resourcePack).resourcePackFile; if (base1 != null && base1.isDirectory()) { base1 = new File(base1, "assets/" + namespace); if (base1.isDirectory()) { findResources(base1, namespace, directory, suffix, recursive, directories, resources); } } } } } } private static void findResources(ZipFile zipFile, String namespace, String root, String directory, String suffix, boolean recursive, boolean directories, Collection<ResourceLocation> resources) { String base = root + "/" + directory; Iterator i$ = Collections.list(zipFile.entries()).iterator(); while (i$.hasNext()) { ZipEntry entry = (ZipEntry)i$.next(); if (entry.isDirectory() == directories) { String name = entry.getName().replaceFirst("^/", ""); if (name.startsWith(base) && name.endsWith(suffix)) { if (directory.equals("")) { if (recursive || !name.contains("/")) { resources.add(new ResourceLocation(namespace, name)); } } else { String subpath = name.substring(base.length()); if ((subpath.equals("") || subpath.startsWith("/")) && (recursive || subpath.equals("") || !subpath.substring(1).contains("/"))) { resources.add(new ResourceLocation(namespace, name.substring(root.length() + 1))); } } } } } } private static void findResources(File base, String namespace, String directory, String suffix, boolean recursive, boolean directories, Collection<ResourceLocation> resources) { File subdirectory = new File(base, directory); String[] list = subdirectory.list(); if (list != null) { String pathComponent = directory.equals("") ? "" : directory + "/"; String[] arr$ = list; int len$ = list.length; for (int i$ = 0; i$ < len$; ++i$) { String s = arr$[i$]; File entry = new File(subdirectory, s); String resourceName = pathComponent + s; if (entry.isDirectory()) { if (directories && s.endsWith(suffix)) { resources.add(new ResourceLocation(namespace, resourceName)); } if (recursive) { findResources(base, namespace, pathComponent + s, suffix, recursive, directories, resources); } } else if (s.endsWith(suffix) && !directories) { resources.add(new ResourceLocation(namespace, resourceName)); } } } } public static int getTextureIfLoaded(ResourceLocation resource) { if (resource == null) { return -1; } else { TextureObject texture = Minecraft.getMinecraft().getTextureManager().getTexture(resource); return texture instanceof AbstractTexture ? ((AbstractTexture)texture).glTextureId : -1; } } public static boolean isTextureLoaded(ResourceLocation resource) { return getTextureIfLoaded(resource) >= 0; } public static TextureObject getTextureObject(ResourceLocation resource) { return Minecraft.getMinecraft().getTextureManager().getTexture(resource); } public static void bindTexture(ResourceLocation resource) { Minecraft.getMinecraft().getTextureManager().bindTexture(resource); } public static void bindTexture(int texture) { if (texture >= 0) { GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture); } } public static void unloadTexture(ResourceLocation resource) { TextureManager textureManager = Minecraft.getMinecraft().getTextureManager(); TextureObject texture = textureManager.getTexture(resource); if (texture != null && !(texture instanceof TextureMap) && !(texture instanceof DynamicTexture)) { if (texture instanceof AbstractTexture) { ((AbstractTexture)texture).unloadGLTexture(); } logger.finer("unloading texture %s", new Object[] {resource}); textureManager.mapTextureObjects.remove(resource); } } public static void deleteTexture(int texture) { if (texture >= 0) { GL11.glDeleteTextures(texture); } } protected InputStream getInputStreamImpl(ResourceLocation resource) { try { return Minecraft.getMinecraft().getResourceManager().getResource(resource).getInputStream(); } catch (IOException var3) { return null; } } protected BufferedImage getImageImpl(ResourceLocation resource) { InputStream input = getInputStream(resource); BufferedImage image = null; if (input != null) { try { image = ImageIO.read(input); } catch (IOException var8) { logger.error("could not read %s", new Object[] {resource}); var8.printStackTrace(); } finally { MCPatcherUtils.close((Closeable)input); } } return image; } protected boolean getPropertiesImpl(ResourceLocation resource, Properties properties) { if (properties != null) { InputStream input = getInputStream(resource); boolean e; try { if (input == null) { return false; } properties.load(input); e = true; } catch (IOException var8) { logger.error("could not read %s", new Object[] {resource}); var8.printStackTrace(); return false; } finally { MCPatcherUtils.close((Closeable)input); } return e; } else { return false; } } }