/* * This file is part of Spoutcraft. * * Copyright (c) 2011 SpoutcraftDev <http://spoutcraft.org/> * Spoutcraft is licensed under the GNU Lesser General Public License. * * Spoutcraft is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Spoutcraft is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.spoutcraft.client.io; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLDecoder; import java.util.HashMap; import org.lwjgl.opengl.GL11; import org.newdawn.slick.opengl.Texture; import org.newdawn.slick.opengl.TextureLoader; import net.minecraft.src.Minecraft; import net.minecraft.src.ItemStack; import net.minecraft.src.World; import org.spoutcraft.api.block.design.BlockDesign; import org.spoutcraft.api.Spoutcraft; import org.spoutcraft.api.material.CustomBlock; import org.spoutcraft.api.material.CustomItem; import org.spoutcraft.api.material.MaterialData; import org.spoutcraft.client.SpoutClient; import org.spoutcraft.client.block.SpoutcraftChunk; import org.spoutcraft.client.gui.minimap.ZanMinimap; import org.spoutcraft.client.SpoutcraftWorld; public class CustomTextureManager { static HashMap<String, Texture> textures = new HashMap<String, Texture>(); static HashMap<String, File> cacheTextureFiles = new HashMap<String, File>(); public static void downloadTexture(String url) { downloadTexture(null, url, false); } public static void downloadTexture(String url, boolean ignoreEnding) { downloadTexture(null, url, ignoreEnding); } public static void downloadTexture(String plugin, String url, boolean ignoreEnding) { String fileName = FileUtil.getFileName(url); if (!ignoreEnding && !FileUtil.isImageFile(fileName)) { System.out.println("Rejecting download of invalid texture: " + fileName); } else if (!isTextureDownloading(url) && !isTextureDownloaded(plugin, url)) { File dir = FileUtil.getTempDir(); if (plugin != null) { dir = new File(FileUtil.getCacheDir(), plugin); dir.mkdir(); } Download download = new Download(fileName, dir, url, null); FileDownloadThread.getInstance().addToDownloadQueue(download); } } public static void downloadTexture(String plugin, String url) { downloadTexture(plugin, url, false); } public static boolean isTextureDownloading(String url) { return FileDownloadThread.getInstance().isDownloading(url); } public static boolean isTextureDownloaded(String url) { return getTextureFile(null, url).exists(); } public static boolean isTextureDownloaded(String addon, String url) { return getTextureFile(addon, url).exists(); } public static File getTextureFile(String plugin, String url) { String fileName = FileUtil.getFileName(url); File cache = cacheTextureFiles.get(plugin + File.separator + fileName); if (cache != null) { return cache; } if (plugin != null) { File file = FileUtil.findFile(plugin, fileName); if (file != null) { cacheTextureFiles.put(plugin + File.separator + fileName, file); return file; } } return new File(FileUtil.getTempDir(), fileName); } public static Texture getTextureFromPath(String path) { if (textures.containsKey(path)) { return textures.get(path); } Texture texture = null; try { FileInputStream stream = new FileInputStream(path); if (stream.available() > 0) { texture = TextureLoader.getTexture(path.toLowerCase().endsWith(".png") ? "PNG" : "JPG", stream, true, GL11.GL_NEAREST); } stream.close(); } catch (IOException e) { } if (texture != null) { textures.put(path, texture); } return texture; } public static Texture getTextureFromJar(String path) { if (textures.containsKey(path)) { return textures.get(path); } Texture texture = null; // Check inside jar try { InputStream stream = Minecraft.class.getResourceAsStream(path); texture = TextureLoader.getTexture(path.toLowerCase().endsWith(".png") ? "PNG" : "JPG", stream, true, GL11.GL_NEAREST); stream.close(); } catch (Exception e) { } // Check MCP/Eclipse Path if (texture == null) { String pathToJar; File jar = new File(CustomTextureManager.class.getProtectionDomain().getCodeSource().getLocation().getFile()); try { pathToJar = jar.getCanonicalPath(); } catch (IOException e1) { pathToJar = jar.getAbsolutePath(); } try { pathToJar = URLDecoder.decode(pathToJar, "UTF-8"); } catch (java.io.UnsupportedEncodingException ignore) { } File relative = new File(pathToJar + "/../../src/main/resources" + path.substring(4)); try { pathToJar = relative.getCanonicalPath(); } catch (IOException e) { pathToJar = relative.getAbsolutePath(); } texture = getTextureFromPath(pathToJar); } if (texture != null) { textures.put(path, texture); } return texture; } public static void resetTextures() { for (Texture texture : textures.values()) { texture.release(); } cacheTextureFiles.clear(); textures.clear(); ZanMinimap.instance.texman.reset(); } public static Texture getTextureFromUrl(String url) { Texture tex = getTextureFromUrl(null, url); if (tex == null) { CustomTextureManager.downloadTexture(url, true); tex = CustomTextureManager.getTextureFromPath(FileUtil.getAssetsDir().getPath()+"/block/spout.png"); } return tex; } public static Texture getTextureFromUrl(String plugin, String url) { File texture = getTextureFile(plugin, url); try { return getTextureFromPath(texture.getCanonicalPath()); } catch (IOException e) { e.printStackTrace(); return null; } } public static String getTexturePathFromUrl(String url) { // Only used for sky, null checks not needed! return getTexturePathFromUrl(null, url); } public static String getTexturePathFromUrl(String plugin, String url) { // Only used above! if (!isTextureDownloaded(plugin, url)) { return null; } File download = new File(FileUtil.getTempDir(), FileUtil.getFileName(url)); try { return download.getCanonicalPath(); } catch (IOException e) { e.printStackTrace(); } return null; } // Don't call this method, for future use. protected Texture getTextureFromCoords(World world, int x, int y, int z) { short customId = 0; Texture texture = null; if (SpoutClient.getInstance().getRawWorld() != null) { SpoutcraftChunk sChunk = Spoutcraft.getChunkAt(SpoutClient.getInstance().getRawWorld(), x, y, z); customId = sChunk.getCustomBlockId(x, y, z); short[] customBlockIds = sChunk.getCustomBlockIds(); byte[] customBlockData = sChunk.getCustomBlockData(); if (customId > 0) { CustomBlock block = MaterialData.getCustomBlock(customId); if (block != null) { BlockDesign design = block.getBlockDesign(customBlockData[customId]); if (design != null) { texture = getTextureFromUrl(block.getAddon(), design.getTextureURL()); } } } } return texture; } // Don't call this method, for future use. protected Texture getTextureFromItemStack(ItemStack itemStack) { BlockDesign design = null; Texture texture = null; org.spoutcraft.api.material.CustomItem item = MaterialData.getCustomItem(itemStack.getItemDamage()); if (item != null) { String textureURI = item.getTexture(); if (textureURI == null) { org.spoutcraft.api.material.CustomBlock block = MaterialData.getCustomBlock(itemStack.getItemDamage()); design = block != null ? block.getBlockDesign() : null; textureURI = design != null ? design.getTextureURL() : null; } if (textureURI != null) { texture = CustomTextureManager.getTextureFromUrl(item.getAddon(), textureURI); } } return texture; } }