package net.minecraftforkage.setup_plugin; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.jar.Attributes; import java.util.jar.Manifest; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import net.minecraftforkage.instsetup.AbstractZipFile; import net.minecraftforkage.instsetup.JarTransformer; import net.minecraftforkage.instsetup.PackerContext; public class CoremodSearchTransformer extends JarTransformer { @Override public String getID() { return "MinecraftForkage|CoremodSearchTransformer"; } class CascadingTweaker { String className; int sortOrder; CascadingTweaker(String className, String sortOrder) { this.className = className; this.sortOrder = 0; if(sortOrder != null) { try { this.sortOrder = Integer.parseInt(sortOrder); } catch(NumberFormatException ex) { } } } } @Override public void transform(AbstractZipFile zipFile, PackerContext context) throws Exception { List<String> coremodClasses = new ArrayList<String>(); List<String> accessTransformers = new ArrayList<String>(); List<CascadingTweaker> cascadingTweakers = new ArrayList<CascadingTweaker>(); for(URL modURL : context.getModURLs()) { Manifest mf = null; try (ZipInputStream zin = new ZipInputStream(modURL.openStream())) { ZipEntry ze; while((ze = zin.getNextEntry()) != null) { if(ze.getName().equals("META-INF/MANIFEST.MF")) { mf = new Manifest(); mf.read(zin); zin.closeEntry(); break; } zin.closeEntry(); } } if(mf != null) { Attributes attr = mf.getMainAttributes(); String value; value = attr.getValue("FMLCorePlugin"); if(value != null) coremodClasses.add(value); value = attr.getValue("FMLAT"); if(value != null) accessTransformers.add(value); value = attr.getValue("TweakClass"); if(value != null) { // XXX: compatibility - remove check later! if(!value.equals("forestry.shade.javacheck.Java7Checker")) { cascadingTweakers.add(new CascadingTweaker(value, attr.getValue("TweakOrder"))); } } value = attr.getValue("ModType"); if(value != null) // TODO: use these somehow // FML's behaviour is to ignore the mod file if value.split(",") (no trimming) does not contain "FML" System.out.println("Unhandled: Found a ModType annotation in "+modURL+" with value "+value); value = attr.getValue("ModSide"); if(value != null) // TODO: use these somehow // FML's behaviour is to ignore the mod file if !FMLLaunchHandler.side.name().equals(modSide) System.out.println("Unhandled: Found a ModSide annotation in "+modURL+" with value "+value); } } zipFile.appendGSONArray("mcforkage-coremods.json", coremodClasses); zipFile.appendGSONArray("mcforkage-FMLAT.json", accessTransformers); zipFile.appendGSONArray("mcforkage-cascading-tweakers.json", cascadingTweakers); } @Override public Stage getStage() { return Stage.MOD_IDENTIFICATION_STAGE; } }