Skip to content

Instantly share code, notes, and snippets.

@ShiftSad
Last active May 2, 2024 13:08
Show Gist options
  • Save ShiftSad/07f4329b99197b63e5c62b5c511a4ef1 to your computer and use it in GitHub Desktop.
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
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