- Fixed AddonSystem

This commit is contained in:
2025-09-29 14:40:54 +02:00
parent 385def97f3
commit 9b3641380b
3 changed files with 51 additions and 26 deletions

View File

@@ -2,12 +2,15 @@ package dev.unlegitdqrk.unlegitlibrary.addon;
import dev.unlegitdqrk.unlegitlibrary.addon.events.AddonLoadedEvent; import dev.unlegitdqrk.unlegitlibrary.addon.events.AddonLoadedEvent;
import dev.unlegitdqrk.unlegitlibrary.addon.impl.Addon; 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.EventListener;
import dev.unlegitdqrk.unlegitlibrary.event.EventManager; import dev.unlegitdqrk.unlegitlibrary.event.EventManager;
import dev.unlegitdqrk.unlegitlibrary.utils.DefaultMethodsOverrider; import dev.unlegitdqrk.unlegitlibrary.utils.DefaultMethodsOverrider;
import dev.unlegitdqrk.unlegitlibrary.utils.Logger;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Constructor;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.ArrayList; import java.util.ArrayList;
@@ -20,11 +23,21 @@ public final class AddonLoader extends DefaultMethodsOverrider {
private final List<Addon> addons; private final List<Addon> addons;
private final Map<String, Class<?>> loadedClasses; private final Map<String, Class<?>> loadedClasses;
private final EventManager eventManager; 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.addons = new ArrayList<>();
this.loadedClasses = new HashMap<>(); this.loadedClasses = new HashMap<>();
this.eventManager = eventManager; this.eventManager = eventManager;
this.logger = logger;
} }
public void loadAddonsFromDirectory(File addonFolder) throws IOException { public void loadAddonsFromDirectory(File addonFolder) throws IOException {
@@ -48,15 +61,24 @@ public final class AddonLoader extends DefaultMethodsOverrider {
try { try {
Class<?> clazz = classLoader.loadClass(className); Class<?> clazz = classLoader.loadClass(className);
loadedClasses.put(className, clazz);
if (Addon.class.isAssignableFrom(clazz)) { if (clazz.isAnnotationPresent(AddonInfo.class) && Addon.class.isAssignableFrom(clazz)) {
Addon addon = (Addon) clazz.getDeclaredConstructor().newInstance();
Constructor<?> constructor = clazz.getConstructor(AddonLoader.class);
Addon addon = (Addon) constructor.newInstance(this);
addons.add(addon); addons.add(addon);
loadedClasses.put(className, clazz);
eventManager.executeEvent(new AddonLoadedEvent(addon)); eventManager.executeEvent(new AddonLoadedEvent(addon));
} }
} catch (Exception exception) { } catch (Exception e) {
exception.printStackTrace(); if (logger != null) {
logger.exception("Failed to load addon class: " + className, e);
} else {
System.err.println("Failed to load addon class: " + className);
e.printStackTrace();
}
} }
} }
}); });

View File

@@ -1,17 +1,24 @@
package dev.unlegitdqrk.unlegitlibrary.addon.impl; 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.AddonDisabledEvent;
import dev.unlegitdqrk.unlegitlibrary.addon.events.AddonEnabledEvent; import dev.unlegitdqrk.unlegitlibrary.addon.events.AddonEnabledEvent;
import dev.unlegitdqrk.unlegitlibrary.event.EventListener; import dev.unlegitdqrk.unlegitlibrary.event.EventListener;
import dev.unlegitdqrk.unlegitlibrary.event.EventManager;
import dev.unlegitdqrk.unlegitlibrary.event.impl.Event; import dev.unlegitdqrk.unlegitlibrary.event.impl.Event;
import dev.unlegitdqrk.unlegitlibrary.utils.Logger;
public abstract class Addon { public abstract class Addon {
private final AddonInfo addonInfo;
private boolean isEnabled = false; private boolean isEnabled = false;
private final AddonLoader addonLoader;
public Addon(AddonInfo addonInfo) { public Addon(AddonLoader addonLoader) {
this.addonInfo = addonInfo; this.addonLoader = addonLoader;
}
public final AddonLoader getAddonLoader() {
return addonLoader;
} }
public final boolean isEnabled() { public final boolean isEnabled() {
@@ -19,20 +26,20 @@ public abstract class Addon {
} }
public final AddonInfo getAddonInfo() { public final AddonInfo getAddonInfo() {
return addonInfo; return getClass().getAnnotation(AddonInfo.class);
} }
public void executeEvent(Event event) { public void executeEvent(Event event) {
if (!isEnabled) return; if (!isEnabled) return;
addonInfo.eventManager().executeEvent(event); getAddonLoader().getEventManager().executeEvent(event);
} }
public final void registerEventListener(Class<? extends EventListener> eventListener) throws Exception { public final void registerEventListener(Class<? extends EventListener> eventListener) throws Exception {
addonInfo.eventManager().registerListener(eventListener); getAddonLoader().getEventManager().registerListener(eventListener);
} }
public final void unregisterEventListener(Class<? extends EventListener> eventListener) { public final void unregisterEventListener(Class<? extends EventListener> eventListener) {
addonInfo.eventManager().unregisterListener(eventListener); getAddonLoader().getEventManager().unregisterListener(eventListener);
} }
public abstract void onEnable(); public abstract void onEnable();
@@ -44,7 +51,7 @@ public abstract class Addon {
isEnabled = true; isEnabled = true;
onEnable(); onEnable();
addonInfo.eventManager().executeEvent(new AddonEnabledEvent(this)); getAddonLoader().getEventManager().executeEvent(new AddonEnabledEvent(this));
} }
public final void disable() { public final void disable() {
@@ -52,6 +59,6 @@ public abstract class Addon {
isEnabled = false; isEnabled = false;
onDisable(); onDisable();
addonInfo.eventManager().executeEvent(new AddonDisabledEvent(this)); getAddonLoader().getEventManager().executeEvent(new AddonDisabledEvent(this));
} }
} }

View File

@@ -2,16 +2,12 @@ package dev.unlegitdqrk.unlegitlibrary.addon.impl;
import dev.unlegitdqrk.unlegitlibrary.event.EventManager; import dev.unlegitdqrk.unlegitlibrary.event.EventManager;
public final record AddonInfo(String name, String version, String author, EventManager eventManager) { import java.lang.annotation.*;
@Override @Retention(RetentionPolicy.RUNTIME)
protected AddonInfo clone() throws CloneNotSupportedException { @Target(ElementType.TYPE)
return new AddonInfo(name, version, author, eventManager); public @interface AddonInfo {
} String name();
String version();
@Override String author();
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);
}
} }