Last active
May 2, 2024 13:08
-
-
Save ShiftSad/07f4329b99197b63e5c62b5c511a4ef1 to your computer and use it in GitHub Desktop.
Spigot event api abstraction based on Kotlin's DSL and shynixn's mccoroutine
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import com.github.shynixn.mccoroutine.bukkit.launch | |
import com.github.shynixn.mccoroutine.bukkit.minecraftDispatcher | |
import org.bukkit.event.Event | |
import org.bukkit.event.EventPriority | |
import org.bukkit.event.Listener | |
import org.bukkit.event.player.PlayerEvent | |
import org.bukkit.plugin.java.JavaPlugin | |
import kotlin.coroutines.CoroutineContext | |
/** | |
* Example usage: | |
* ```kt | |
* JavaPlugin.events { | |
* event<PlayerJoinEvent>( | |
* priority = EventPriority.HIGHEST, | |
* permission = "my.permission", | |
* ) { | |
* player.sendMessage("Welcome!") | |
* } | |
* | |
* suspendedEvent<PlayerQuitEvent>( | |
* dispatcher = minecraftDispatcher | |
* ) { | |
* delay(1000) | |
* println("Player quit!") | |
* } | |
* } | |
* ``` | |
*/ | |
class EventRegistry(val plugin: JavaPlugin) { | |
val eventHandlers = mutableMapOf<Class<*>, EventData>() | |
data class EventData(val handler: (Event) -> Unit, val priority: EventPriority, val permission: String?, val ignoreCancelled: Boolean) | |
inline fun <reified T : Event> event(priority: EventPriority = EventPriority.NORMAL, permission: String? = null, ignoreCancelled: Boolean = false, noinline handler: T.() -> Unit) { | |
eventHandlers[T::class.java] = EventData(handler as (Event) -> Unit, priority, permission, ignoreCancelled) | |
} | |
inline fun <reified T : Event> suspendEvents(priority: EventPriority = EventPriority.NORMAL, permission: String? = null, ignoreCancelled: Boolean = false, dispatcher: CoroutineContext = plugin.minecraftDispatcher, noinline handler: suspend T.() -> Unit) { | |
eventHandlers[T::class.java] = EventData({ plugin.launch(dispatcher) { handler(it as T) } }, priority, permission, ignoreCancelled) | |
} | |
fun register() { | |
eventHandlers.forEach { (eventClass, eventData) -> | |
val (handler, priority, permission, ignoreCancelled) = eventData | |
plugin.server.pluginManager.registerEvent( | |
eventClass as Class<out Event>, | |
object : Listener {}, | |
priority, | |
{ _, event -> | |
if (permission == null || event is PlayerEvent && event.player.hasPermission(permission)) { | |
handler(event) | |
} | |
}, | |
plugin, | |
ignoreCancelled | |
) | |
} | |
} | |
} | |
fun JavaPlugin.events(init: EventRegistry.() -> Unit) { | |
val pluginEvents = EventRegistry(this) | |
pluginEvents.init() | |
pluginEvents.register() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment