diff --git a/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/AddonLoader.java b/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/AddonLoader.java index bfd567d..2d9f524 100644 --- a/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/AddonLoader.java +++ b/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/AddonLoader.java @@ -2,12 +2,15 @@ package dev.unlegitdqrk.unlegitlibrary.addon; import dev.unlegitdqrk.unlegitlibrary.addon.events.AddonLoadedEvent; import dev.unlegitdqrk.unlegitlibrary.addon.impl.Addon; +import dev.unlegitdqrk.unlegitlibrary.addon.impl.AddonInfo; import dev.unlegitdqrk.unlegitlibrary.event.EventListener; import dev.unlegitdqrk.unlegitlibrary.event.EventManager; import dev.unlegitdqrk.unlegitlibrary.utils.DefaultMethodsOverrider; +import dev.unlegitdqrk.unlegitlibrary.utils.Logger; import java.io.File; import java.io.IOException; +import java.lang.reflect.Constructor; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; @@ -20,11 +23,21 @@ public final class AddonLoader extends DefaultMethodsOverrider { private final List addons; private final Map> loadedClasses; private final EventManager eventManager; + private final Logger logger; - public AddonLoader(EventManager eventManager) { + public final EventManager getEventManager() { + return eventManager; + } + + public final Logger getLogger() { + return logger; + } + + public AddonLoader(EventManager eventManager, Logger logger) { this.addons = new ArrayList<>(); this.loadedClasses = new HashMap<>(); this.eventManager = eventManager; + this.logger = logger; } public void loadAddonsFromDirectory(File addonFolder) throws IOException { @@ -48,15 +61,24 @@ public final class AddonLoader extends DefaultMethodsOverrider { try { Class clazz = classLoader.loadClass(className); - loadedClasses.put(className, clazz); - if (Addon.class.isAssignableFrom(clazz)) { - Addon addon = (Addon) clazz.getDeclaredConstructor().newInstance(); + if (clazz.isAnnotationPresent(AddonInfo.class) && Addon.class.isAssignableFrom(clazz)) { + + Constructor constructor = clazz.getConstructor(AddonLoader.class); + Addon addon = (Addon) constructor.newInstance(this); + addons.add(addon); + loadedClasses.put(className, clazz); + eventManager.executeEvent(new AddonLoadedEvent(addon)); } - } catch (Exception exception) { - exception.printStackTrace(); + } catch (Exception e) { + if (logger != null) { + logger.exception("Failed to load addon class: " + className, e); + } else { + System.err.println("Failed to load addon class: " + className); + e.printStackTrace(); + } } } }); diff --git a/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/impl/Addon.java b/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/impl/Addon.java index 1adb86e..bcf0bb6 100644 --- a/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/impl/Addon.java +++ b/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/impl/Addon.java @@ -1,17 +1,24 @@ package dev.unlegitdqrk.unlegitlibrary.addon.impl; +import dev.unlegitdqrk.unlegitlibrary.addon.AddonLoader; import dev.unlegitdqrk.unlegitlibrary.addon.events.AddonDisabledEvent; import dev.unlegitdqrk.unlegitlibrary.addon.events.AddonEnabledEvent; import dev.unlegitdqrk.unlegitlibrary.event.EventListener; +import dev.unlegitdqrk.unlegitlibrary.event.EventManager; import dev.unlegitdqrk.unlegitlibrary.event.impl.Event; +import dev.unlegitdqrk.unlegitlibrary.utils.Logger; public abstract class Addon { - private final AddonInfo addonInfo; private boolean isEnabled = false; + private final AddonLoader addonLoader; - public Addon(AddonInfo addonInfo) { - this.addonInfo = addonInfo; + public Addon(AddonLoader addonLoader) { + this.addonLoader = addonLoader; + } + + public final AddonLoader getAddonLoader() { + return addonLoader; } public final boolean isEnabled() { @@ -19,20 +26,20 @@ public abstract class Addon { } public final AddonInfo getAddonInfo() { - return addonInfo; + return getClass().getAnnotation(AddonInfo.class); } public void executeEvent(Event event) { if (!isEnabled) return; - addonInfo.eventManager().executeEvent(event); + getAddonLoader().getEventManager().executeEvent(event); } public final void registerEventListener(Class eventListener) throws Exception { - addonInfo.eventManager().registerListener(eventListener); + getAddonLoader().getEventManager().registerListener(eventListener); } public final void unregisterEventListener(Class eventListener) { - addonInfo.eventManager().unregisterListener(eventListener); + getAddonLoader().getEventManager().unregisterListener(eventListener); } public abstract void onEnable(); @@ -44,7 +51,7 @@ public abstract class Addon { isEnabled = true; onEnable(); - addonInfo.eventManager().executeEvent(new AddonEnabledEvent(this)); + getAddonLoader().getEventManager().executeEvent(new AddonEnabledEvent(this)); } public final void disable() { @@ -52,6 +59,6 @@ public abstract class Addon { isEnabled = false; onDisable(); - addonInfo.eventManager().executeEvent(new AddonDisabledEvent(this)); + getAddonLoader().getEventManager().executeEvent(new AddonDisabledEvent(this)); } } diff --git a/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/impl/AddonInfo.java b/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/impl/AddonInfo.java index 335112f..be708da 100644 --- a/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/impl/AddonInfo.java +++ b/src/main/java/dev/unlegitdqrk/unlegitlibrary/addon/impl/AddonInfo.java @@ -2,16 +2,12 @@ package dev.unlegitdqrk.unlegitlibrary.addon.impl; import dev.unlegitdqrk.unlegitlibrary.event.EventManager; -public final record AddonInfo(String name, String version, String author, EventManager eventManager) { +import java.lang.annotation.*; - @Override - protected AddonInfo clone() throws CloneNotSupportedException { - return new AddonInfo(name, version, author, eventManager); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof AddonInfo other)) return false; - return other.name.equalsIgnoreCase(name) && other.version.equalsIgnoreCase(version) && other.author.equalsIgnoreCase(author); - } +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface AddonInfo { + String name(); + String version(); + String author(); }