From f27d4d7e46b805c81cbc29b3ddb8da90028259df Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Sat, 5 Sep 2020 22:41:30 +0200 Subject: [PATCH] Update KSpigotListeners.kt --- .../axay/kspigot/event/KSpigotListeners.kt | 67 ++++++++++++++++--- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/net/axay/kspigot/event/KSpigotListeners.kt b/src/main/kotlin/net/axay/kspigot/event/KSpigotListeners.kt index e708ef8e..edae0363 100644 --- a/src/main/kotlin/net/axay/kspigot/event/KSpigotListeners.kt +++ b/src/main/kotlin/net/axay/kspigot/event/KSpigotListeners.kt @@ -2,7 +2,7 @@ package net.axay.kspigot.event import net.axay.kspigot.extensions.pluginManager import org.bukkit.event.Event -import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority import org.bukkit.event.HandlerList import org.bukkit.event.Listener import org.bukkit.plugin.Plugin @@ -10,20 +10,69 @@ import org.bukkit.plugin.Plugin /** * Shortcut for registering this listener on the given plugin. */ - fun Listener.register(plugin: Plugin) = pluginManager.registerEvents(this, plugin) +/** + * Shortcut for unregistering all events in this listener. + */ fun Listener.unregister() = HandlerList.unregisterAll(this) -fun Plugin.listen(onEvent: (T) -> Unit): SingleListener { +/** + * Registers the event with a custom event [executor]. + * + * @param T the type of event + * @param priority the priority when multiple listeners handle this event + * @param ignoreCancelled if manual cancellation should be ignored + * @param executor handles incoming events + */ +inline fun Listener.register( + plugin: Plugin, + priority: EventPriority = EventPriority.NORMAL, + ignoreCancelled: Boolean = false, + noinline executor: (Listener, Event) -> Unit +) { + pluginManager.registerEvent(T::class.java, this, priority, executor, plugin, ignoreCancelled) +} + +/** + * This class represents a [Listener] with + * only one event to listen to. + */ +interface SingleListener : Listener { + fun onEvent(event: T) +} + +/** + * Registers the [SingleListener] with its + * event listener. + * + * @param priority the priority when multiple listeners handle this event + * @param ignoreCancelled if manual cancellation should be ignored + */ +inline fun SingleListener.register( + plugin: Plugin, + priority: EventPriority = EventPriority.NORMAL, + ignoreCancelled: Boolean = false +) { + register(plugin, priority, ignoreCancelled) { _, event -> + this.onEvent(event as T) + } +} + +/** + * @param T the type of event to listen to + * @param priority the priority when multiple listeners handle this event + * @param ignoreCancelled if manual cancellation should be ignored + * @param onEvent the event callback + */ +inline fun Plugin.listen( + priority: EventPriority, + ignoreCancelled: Boolean = false, + crossinline onEvent: (T) -> Unit +): SingleListener { val listener = object : SingleListener { override fun onEvent(event: T) = onEvent.invoke(event) } - listener.register(this) + listener.register(this, priority, ignoreCancelled) return listener -} - -interface SingleListener : Listener { - @EventHandler - fun onEvent(event: T) } \ No newline at end of file