From a703367553290555b3455301828a4cddefe03dc9 Mon Sep 17 00:00:00 2001 From: cpw Date: Tue, 1 Dec 2015 13:08:35 -0500 Subject: [PATCH] Be noisy when API is in a coremod. It'll never work and modders should realize that fact. --- .../net/minecraftforge/fml/common/Loader.java | 2 +- .../fml/common/ModAPIManager.java | 3 +++ .../fml/common/ModClassLoader.java | 20 +++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraftforge/fml/common/Loader.java b/src/main/java/net/minecraftforge/fml/common/Loader.java index 14ee5d194..b58949b8c 100644 --- a/src/main/java/net/minecraftforge/fml/common/Loader.java +++ b/src/main/java/net/minecraftforge/fml/common/Loader.java @@ -639,7 +639,7 @@ public class Loader return "8.0.99.99"; } - public ClassLoader getModClassLoader() + public ModClassLoader getModClassLoader() { return modClassLoader; } diff --git a/src/main/java/net/minecraftforge/fml/common/ModAPIManager.java b/src/main/java/net/minecraftforge/fml/common/ModAPIManager.java index 4f4d8b2cd..5733190e7 100644 --- a/src/main/java/net/minecraftforge/fml/common/ModAPIManager.java +++ b/src/main/java/net/minecraftforge/fml/common/ModAPIManager.java @@ -90,6 +90,9 @@ public class ModAPIManager { public void validate(String providedAPI, String apiOwner, String apiVersion) { + if (Loader.instance().getModClassLoader().containsSource(this.getSource())) { + FMLLog.bigWarning("The API %s from source %s is loaded from an incompatible classloader. THIS WILL NOT WORK!", providedAPI, this.getSource().getAbsolutePath()); + } // TODO Compare this annotation data to the one we first found. Maybe barf if there is inconsistency? } diff --git a/src/main/java/net/minecraftforge/fml/common/ModClassLoader.java b/src/main/java/net/minecraftforge/fml/common/ModClassLoader.java index 161f93623..854ff23c4 100644 --- a/src/main/java/net/minecraftforge/fml/common/ModClassLoader.java +++ b/src/main/java/net/minecraftforge/fml/common/ModClassLoader.java @@ -19,6 +19,7 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Set; @@ -30,6 +31,7 @@ import net.minecraftforge.fml.common.discovery.ASMDataTable; import org.apache.logging.log4j.Level; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; /** * A simple delegating class loader used to load mods into the system @@ -42,6 +44,7 @@ public class ModClassLoader extends URLClassLoader { private static final List STANDARD_LIBRARIES = ImmutableList.of("jinput.jar", "lwjgl.jar", "lwjgl_util.jar", "rt.jar"); private LaunchClassLoader mainClassLoader; + private List sources; public ModClassLoader(ClassLoader parent) { super(new URL[0], null); @@ -52,6 +55,7 @@ public class ModClassLoader extends URLClassLoader { URL url = modFile.toURI().toURL(); mainClassLoader.addURL(url); + this.sources.add(modFile); } @Override @@ -148,4 +152,20 @@ public class ModClassLoader extends URLClassLoader modAPI.initTable(dataTable); return modAPI; } + + List parentURLs = null; + public boolean containsSource(File source) + { + if (parentURLs == null) { + parentURLs = Arrays.asList(mainClassLoader.getURLs()); + } + try + { + return parentURLs.contains(source.toURI().toURL()); + } catch (MalformedURLException e) + { + // shouldn't happen + return false; + } + } }