Skip to content

Injected Listener Providers

This allows us to dynamically add ListenerProviders depending on the specific event being broadcasted.

This may help performance instead, for example, instead of each minigame registering for a specific PlayerEvent then checking whether the player from that event belongs in a minigame. We can instead add an injected listener provider which gets the player's minigame then adds that minigame's listener provider.

Here's how this is used for minigame related events:

kotlin
GlobalEventHandler.Server.addInjectedProvider { event, consumer ->
    if (event is ExtensionEvent) {
        return@addInjectedProvider
    }
    val minigames = ObjectOpenHashSet<Minigame>(3)
    if (event is PlayerEvent) {
        val minigame = event.player.getMinigame()
        if (minigame != null) {
            minigames.add(minigame)
        }
    }
    if (event is LocatedLevelEvent) {
        minigames.addAll(event.level.getMinigames(event.pos))
    } else if (event is LevelEvent) {
        minigames.addAll(event.level.getMinigames())
    }
    if (event is MinigameEvent) {
        minigames.add(event.minigame)
    }
    for (minigame in minigames) {
        consumer.accept(minigame.events.getInjectedProvider())
    }
}