diff --git a/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java b/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java index ae7d143..9e1a59b 100644 --- a/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java +++ b/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java @@ -4,13 +4,12 @@ import eu.mikroskeem.utils.reflect.Reflect; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPluginLoader; -import org.bukkit.plugin.java.PluginClassLoader; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import static com.google.common.base.Preconditions.checkNotNull; @@ -45,31 +44,42 @@ public class ServerUtils { */ @SuppressWarnings("unchecked") public static ClassLoader getPluginClassLoader(JavaPlugin plugin){ - JavaPluginLoader pl = (JavaPluginLoader)plugin.getPluginLoader(); - Field loadersField = Reflect.getField(pl.getClass(), "loaders"); - if(loadersField != null) { - List loaders = null; + /* + * Note: CB/Spigot has PluginClassLoader package-private, PaperSpigot has public + * So *DO NOT* try to cast this ClassLoader to PluginClassLoader, if you aim to be + * compatible with other Bukkit-based servers + * I repeat, *DO NOT USE* PluginClassLoader! + */ + JavaPluginLoader pl = (JavaPluginLoader) plugin.getPluginLoader(); + try { + Field loadersField = checkNotNull(Reflect.getField(pl.getClass(), "loaders")); switch (getNmsVersion()){ case "v1_8_R3": - case "v1_9_R1": // TODO: Check? + case "v1_9_R1": case "v1_9_R2": - loaders = new ArrayList<>(((Map) - Reflect.readField(loadersField, pl)).values()); + try { + Map loaderMap = (Map) + checkNotNull(Reflect.readField(loadersField, pl)); + return loaderMap.get(plugin.getName()); + } + catch (NullPointerException ignored){} break; case "v1_10_R1": case "v1_11_R1": - loaders = (List) Reflect.readField(loadersField, pl); - break; - } - - if(loaders != null) { - for(PluginClassLoader loader : loaders) { - if(loader.getPlugin().getName().equals(plugin.getName())){ - return loader; - } - } + Class pluginClassLoader = checkNotNull(Reflect.getClass( + "org.bukkit.plugin.java.PluginClassLoader")); + List loaders = (List) + checkNotNull(Reflect.readField(loadersField, pl)); + Optional loader = loaders.stream() + .filter(l->{ + Field f = checkNotNull(Reflect.getField(pluginClassLoader, "plugin")); + return checkNotNull(((JavaPlugin)Reflect.readField(f, l))) + .getName().equals(plugin.getName()); + }).findFirst(); + return loader.isPresent()?loader.get():null; } } + catch (NullPointerException ignored){} return null; }