- Fixed AddonSystem
This commit is contained in:
@@ -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<Addon> addons;
|
||||
private final Map<String, Class<?>> 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@@ -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<? extends EventListener> eventListener) throws Exception {
|
||||
addonInfo.eventManager().registerListener(eventListener);
|
||||
getAddonLoader().getEventManager().registerListener(eventListener);
|
||||
}
|
||||
|
||||
public final void unregisterEventListener(Class<? extends EventListener> 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));
|
||||
}
|
||||
}
|
||||
|
@@ -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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user