- 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.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();
}
}
}
});

View File

@@ -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));
}
}

View File

@@ -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();
}