diff --git a/src/main/java/de/studiocode/invgui/InvGui.java b/src/main/java/de/studiocode/invgui/InvGui.java index 82c2574..2dad311 100644 --- a/src/main/java/de/studiocode/invgui/InvGui.java +++ b/src/main/java/de/studiocode/invgui/InvGui.java @@ -1,31 +1,32 @@ package de.studiocode.invgui; +import de.studiocode.invgui.util.reflection.ReflectionUtils; import org.bukkit.plugin.Plugin; import java.util.ArrayList; import java.util.List; +import static de.studiocode.invgui.util.reflection.ReflectionRegistry.PLUGIN_CLASS_LOADER_PLUGIN_FIELD; + public class InvGui { private static InvGui instance; private final List disableHandlers = new ArrayList<>(); - private Plugin plugin; + private final Plugin plugin; + + public InvGui() { + this.plugin = ReflectionUtils.getFieldValue(PLUGIN_CLASS_LOADER_PLUGIN_FIELD, getClass().getClassLoader()); + } public static InvGui getInstance() { return instance == null ? instance = new InvGui() : instance; } public Plugin getPlugin() { - if (plugin == null) - throw new IllegalStateException("Please set your plugin using InvGui.getInstance().setPlugin"); return plugin; } - public void setPlugin(Plugin plugin) { - this.plugin = plugin; - } - public void addDisableHandler(Runnable runnable) { disableHandlers.add(runnable); } diff --git a/src/main/java/de/studiocode/invgui/util/reflection/ReflectionRegistry.java b/src/main/java/de/studiocode/invgui/util/reflection/ReflectionRegistry.java index 0bdae0c..87970a6 100644 --- a/src/main/java/de/studiocode/invgui/util/reflection/ReflectionRegistry.java +++ b/src/main/java/de/studiocode/invgui/util/reflection/ReflectionRegistry.java @@ -2,18 +2,20 @@ package de.studiocode.invgui.util.reflection; import java.lang.reflect.Field; -import static de.studiocode.invgui.util.reflection.ReflectionUtils.getCBClass; -import static de.studiocode.invgui.util.reflection.ReflectionUtils.getField; +import static de.studiocode.invgui.util.reflection.ReflectionUtils.*; public class ReflectionRegistry { public static final String NET_MINECRAFT_SERVER_PACKAGE_PATH = ReflectionUtils.getNMS(); public static final String CRAFT_BUKKIT_PACKAGE_PATH = ReflectionUtils.getCB(); + public static final String BUKKIT_PACKAGE_PATH = "org.bukkit."; // Classes public static final Class CB_CRAFT_META_SKULL_CLASS = getCBClass("inventory.CraftMetaSkull"); + public static final Class PLUGIN_CLASS_LOADER_CLASS = getBukkitClass("plugin.java.PluginClassLoader"); // Fields public static final Field CB_CRAFT_META_SKULL_PROFILE_FIELD = getField(CB_CRAFT_META_SKULL_CLASS, true, "profile"); - + public static final Field PLUGIN_CLASS_LOADER_PLUGIN_FIELD = getField(PLUGIN_CLASS_LOADER_CLASS, true, "plugin"); + } diff --git a/src/main/java/de/studiocode/invgui/util/reflection/ReflectionUtils.java b/src/main/java/de/studiocode/invgui/util/reflection/ReflectionUtils.java index 0e5d725..01d1522 100644 --- a/src/main/java/de/studiocode/invgui/util/reflection/ReflectionUtils.java +++ b/src/main/java/de/studiocode/invgui/util/reflection/ReflectionUtils.java @@ -6,8 +6,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; -import static de.studiocode.invgui.util.reflection.ReflectionRegistry.CRAFT_BUKKIT_PACKAGE_PATH; -import static de.studiocode.invgui.util.reflection.ReflectionRegistry.NET_MINECRAFT_SERVER_PACKAGE_PATH; +import static de.studiocode.invgui.util.reflection.ReflectionRegistry.*; public class ReflectionUtils { @@ -23,6 +22,16 @@ public class ReflectionUtils { return "net.minecraft.server." + version + "."; } + public static Class getBukkitClass(String path) { + try { + return Class.forName(BUKKIT_PACKAGE_PATH + path); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + return null; + } + public static Class getNMSClass(String path) { try { return Class.forName(NET_MINECRAFT_SERVER_PACKAGE_PATH + path); @@ -83,4 +92,15 @@ public class ReflectionUtils { } } + @SuppressWarnings("unchecked") + public static T getFieldValue(Field field, Object obj) { + try { + return (T) field.get(obj); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + return null; + } + }