From 71c55ccdae1a68419a56d7cba0eef55d575156e3 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 26 Dec 2020 04:13:23 +0300 Subject: [PATCH] add EventManager --- build.gradle | 19 ++++++++ src/main/java/ghast/EventManager.java | 68 +++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/main/java/ghast/EventManager.java diff --git a/build.gradle b/build.gradle index 2152129..dcc0dfc 100644 --- a/build.gradle +++ b/build.gradle @@ -13,15 +13,34 @@ project.version = projectVersion repositories { mavenLocal() mavenCentral() + maven { url 'https://hub.spigotmc.org/nexus/content/groups/public' } } ext { libs = [ + bukkit: [lib: 'org.bukkit:bukkit:1.12.2-R0.1-SNAPSHOT', exclude: [ + 'com.google.code.gson:gson', + 'com.google.guava:guava', + 'com.googlecode.json-simple:json-simple', + 'commons-lang:commons-lang', + 'org.yaml:snakeyaml' + ]], lombok: 'org.projectlombok:lombok:1.18.12' ] } +def compileOnly2(library) { + dependencies.compileOnly library.lib, { + library.exclude.each { String excludeLibStr -> + String[] excludeLib = excludeLibStr.split(':') + exclude group: excludeLib[0], module: excludeLib[1] + } + } +} + dependencies { compileOnly libs.lombok annotationProcessor libs.lombok + + compileOnly2 libs.bukkit } \ No newline at end of file diff --git a/src/main/java/ghast/EventManager.java b/src/main/java/ghast/EventManager.java new file mode 100644 index 0000000..417e527 --- /dev/null +++ b/src/main/java/ghast/EventManager.java @@ -0,0 +1,68 @@ +package ghast; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.experimental.UtilityClass; +import org.bukkit.Bukkit; +import org.bukkit.event.Event; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; + +@UtilityClass +@SuppressWarnings("unused") +public class EventManager { + + public Builder createContext(Plugin plugin) { + return new Builder(plugin); + } + + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + public static class Builder { + + private static final BooleanSupplier EMPTY_FILTER = () -> true; + + private final EventContext eventContext = new EventContext(); + private final Plugin plugin; + + public Builder filter(BooleanSupplier filter) { + eventContext.setFilter(filter != null ? filter : EMPTY_FILTER); + return this; + } + + public Builder onEvent(Class eventType, EventPriority eventPriority, Consumer consumer) { + eventContext.getEventMap().put(eventType, consumer); + Bukkit.getPluginManager().registerEvent(eventType, eventContext, eventPriority, + eventContext::eventExecute, plugin); + return this; + } + + public Builder onEvent(Class eventType, Consumer consumer) { + return onEvent(eventType, EventPriority.NORMAL, consumer); + } + } + + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + @Getter(AccessLevel.PRIVATE) + @Setter(AccessLevel.PRIVATE) + private static class EventContext implements Listener { + + private final Map, Consumer> eventMap = new HashMap<>(); + private BooleanSupplier filter; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private void eventExecute(Listener listener, Event event) { + Consumer consumer = eventMap.get(event.getClass()); + if (consumer != null && filter.getAsBoolean()) { + consumer.accept(event); + } + } + } +}