- 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.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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user