package com.maceswinger.mods; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import javax.imageio.ImageIO; import com.maceswinger.Resources; import com.maceswinger.client.GameClient; import com.moomoohk.Mootilities.FileUtils.FileUtils; import com.moomoohk.Mootilities.OSUtils.OSUtils; public class ModuleLoader { private static URLClassLoader loader; public static ArrayList<Mod> mods = new ArrayList<Mod>(); public static ArrayList<ModTexture> tileTextures = new ArrayList<ModTexture>(); public static ArrayList<ModTexture> maceTextures = new ArrayList<ModTexture>(); public static ArrayList<ModTexture> mobTextures = new ArrayList<ModTexture>(); public static void debugPasteCoreMod() { File coredir = new File(System.getProperty("user.dir") + "/../Core/bin/core"); File newlocdir = new File(OSUtils.getDynamicStorageLocation() + "Mace Swinger/modules/core"); try { FileUtils.copyFolder(coredir, newlocdir); } catch (IOException e) { e.printStackTrace(); } } public static ArrayList<File> getFilesInFolder(File folder) { ArrayList<File> files = new ArrayList<File>(); for (final File fileEntry : folder.listFiles()) { if (fileEntry.isDirectory()) { files.addAll(getFilesInFolder(fileEntry)); } else { if (fileEntry.isFile()) { files.add(fileEntry); } } } return files; } public static void initMods() { try { loader = new URLClassLoader(new URL[] { new File(OSUtils.getDynamicStorageLocation() + "Mace Swinger" + File.separator + "modules").toURL() }); //TODO: Fix this deprecated usage } catch (MalformedURLException e1) { e1.printStackTrace(); } File file = new File(OSUtils.getDynamicStorageLocation() + "Mace Swinger" + File.separator + "modules"); String[] directories = file.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return new File(dir, name).isDirectory(); } }); for (int i = 0; i < directories.length; i++) { for (File f : getFilesInFolder(new File(file.toString() + File.separator + directories[i]))) { String c = f.toString().substring((OSUtils.getDynamicStorageLocation() + "Mace Swinger" + File.separator + "modules").length() + 1).replace(File.separatorChar, '.'); if (!c.endsWith(".class")) continue; if (c.contains("$")) continue; c = c.substring(0, c.length() - 6); Object o = null; try { o = loader.loadClass(c).getConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); } if (o != null && o.getClass().isAnnotationPresent(ModInfo.class)) { Mod info = (Mod) o; info.info(); info.init(); mods.add(info); } } } combineTextures(); } private static void combineTextures() { for(ModTexture tex:Mod.textures){ switch(tex.type){ case TILE: tileTextures.add(tex); break; case MACE: maceTextures.add(tex); break; case MOB: mobTextures.add(tex); break; } } stitchTextures(TextureType.TILE, "image/vmobs.png"); stitchTextures(TextureType.TILE, "image/vtileset.png"); stitchTextures(TextureType.TILE, "image/vtileset.png"); } static String resFolder = OSUtils.getDynamicStorageLocation() + "Mace Swinger" + File.separator+"game"+File.separator+"res"+File.separator; private static void stitchTextures(TextureType type, String path) { int nheight=0; ArrayList<BufferedImage> images = new ArrayList<BufferedImage>(); try { BufferedImage vanillaImage = ImageIO .read(new File(resFolder+path)); int vwidth = vanillaImage.getWidth(); int vheight = vanillaImage.getHeight(); for(ModTexture tex:tileTextures){ BufferedImage toAddImage = ImageIO .read(new File(OSUtils.getDynamicStorageLocation() + "Mace Swinger" + File.separator + "modules"+File.separator+"res"+File.separator+tex.name+".png")); int nwidth = toAddImage.getWidth(); nheight += toAddImage.getHeight(); if(toAddImage.getHeight()%32!=0){ System.err.println("Mod texture not correct height! Not multiple of 32"); GameClient.exit(1); } images.add(toAddImage); } BufferedImage combined = new BufferedImage(vwidth, nheight+vheight, BufferedImage.TYPE_INT_ARGB); Graphics g = combined.getGraphics(); g.drawImage(vanillaImage,0,0,null); int length=0; for(BufferedImage im:images){ g.drawImage(im,0,vheight+length,null); length+=im.getHeight(); } System.out.println(nheight+vheight); switch(type){ case TILE: ImageIO.write(combined, "PNG", new File(resFolder+"image/tileset.png")); break; case MOB: ImageIO.write(combined, "PNG", new File(resFolder+"image/mob.png")); break; case MACE: ImageIO.write(combined, "PNG", new File(resFolder+"image/maces.png")); break; } } catch (IOException e) { e.printStackTrace(); } } }