From 483493bb877c89b11fde544f2d126b4b3bcb2a8b Mon Sep 17 00:00:00 2001 From: Kariya Date: Thu, 18 Dec 2025 16:43:15 +0000 Subject: [PATCH] refactor: Pass event class explicitly for event handler lookup during dispatch. --- src/main/kotlin/net/hareworks/hcu/items/App.kt | 2 +- .../hcu/items/content/items/GrapplingItem.kt | 2 +- .../hcu/items/events/EventContextStrategy.kt | 12 ++++++++---- .../hcu/items/listeners/EventListener.kt | 16 +++++++--------- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/net/hareworks/hcu/items/App.kt b/src/main/kotlin/net/hareworks/hcu/items/App.kt index a667a99..dad0678 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/App.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/App.kt @@ -33,7 +33,6 @@ public class App : JavaPlugin() { // Initialize Config saveDefaultConfig() net.hareworks.hcu.items.config.Config.load(this) - server.pluginManager.registerEvents(net.hareworks.hcu.items.listeners.EventListener(this), this) logger.info("Items plugin enabled!") commands = CommandRegistrar.register(this, permits) @@ -50,5 +49,6 @@ public class App : JavaPlugin() { ComponentRegistry.register(BlinkComponent(this)) ComponentRegistry.register(VeinMinerComponent(this)) + server.pluginManager.registerEvents(net.hareworks.hcu.items.listeners.EventListener(this), this) } } diff --git a/src/main/kotlin/net/hareworks/hcu/items/content/items/GrapplingItem.kt b/src/main/kotlin/net/hareworks/hcu/items/content/items/GrapplingItem.kt index 1cb83f0..946a36d 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/content/items/GrapplingItem.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/content/items/GrapplingItem.kt @@ -59,7 +59,7 @@ class GrapplingItem : AbstractItem("grappling_hook") { val player = event.player val isStuck = hook.persistentDataContainer.has(KEY_HOOK_STUCK, org.bukkit.persistence.PersistentDataType.BYTE) - + if (event.state == PlayerFishEvent.State.REEL_IN && isStuck) { if (!cooldown.checkAndWarn(player)) { return diff --git a/src/main/kotlin/net/hareworks/hcu/items/events/EventContextStrategy.kt b/src/main/kotlin/net/hareworks/hcu/items/events/EventContextStrategy.kt index 93fc90f..1fe38e0 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/events/EventContextStrategy.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/events/EventContextStrategy.kt @@ -119,8 +119,10 @@ object EventStrategyRegistry { // PlayerFishEvent register(PlayerFishEvent::class, object : EventContextStrategy { override fun resolveItems(event: PlayerFishEvent): List { - val item = event.player.inventory.itemInMainHand - return if (item.type.isAir) emptyList() else listOf(item) + val items = mutableListOf() + items.add(event.player.inventory.itemInMainHand) + items.add(event.player.inventory.itemInOffHand) + return items.filter { !it.type.isAir } } override fun resolvePlayer(event: PlayerFishEvent): Player = event.player }) @@ -129,8 +131,10 @@ object EventStrategyRegistry { register(ProjectileLaunchEvent::class, object : EventContextStrategy { override fun resolveItems(event: ProjectileLaunchEvent): List { val shooter = event.entity.shooter as? Player ?: return emptyList() - val item = shooter.inventory.itemInMainHand - return if (item.type.isAir) emptyList() else listOf(item) + val items = mutableListOf() + items.add(shooter.inventory.itemInMainHand) + items.add(shooter.inventory.itemInOffHand) + return items.filter { !it.type.isAir } } override fun resolvePlayer(event: ProjectileLaunchEvent): Player? = event.entity.shooter as? Player }) diff --git a/src/main/kotlin/net/hareworks/hcu/items/listeners/EventListener.kt b/src/main/kotlin/net/hareworks/hcu/items/listeners/EventListener.kt index e13e059..2b57ecb 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/listeners/EventListener.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/listeners/EventListener.kt @@ -87,7 +87,7 @@ class EventListener(private val plugin: Plugin) : Listener { if (eventClass.isInstance(event)) { @Suppress("UNCHECKED_CAST") val castedEvent = event as T - dispatchWithStrategy(castedEvent, strategy) + dispatchWithStrategy(castedEvent, strategy, eventClass) } } @@ -100,35 +100,33 @@ class EventListener(private val plugin: Plugin) : Listener { ) } - private fun dispatchWithStrategy(event: T, strategy: EventContextStrategy) { + private fun dispatchWithStrategy(event: T, strategy: EventContextStrategy, eventClass: KClass) { val items = strategy.resolveItems(event) // Avoid duplicate firing for the same component on the same item context for (item in items) { - dispatchToItem(event, item) - dispatchToComponents(event, item) + dispatchToItem(event, item, eventClass) + dispatchToComponents(event, item, eventClass) } } - private fun dispatchToItem(event: T, item: ItemStack) { + private fun dispatchToItem(event: T, item: ItemStack, eventClass: KClass) { if (item.type.isAir) return val id = AbstractItem.getId(item) ?: return val abstractItem = ItemRegistry.get(id) ?: return - val handler = abstractItem.getEventHandlers()[event::class] + val handler = abstractItem.getEventHandlers()[eventClass] if (handler != null) { @Suppress("UNCHECKED_CAST") (handler as (T, ItemStack) -> Unit).invoke(event, item) } } - private fun dispatchToComponents(event: T, item: ItemStack) { + private fun dispatchToComponents(event: T, item: ItemStack, eventClass: KClass) { if (item.type.isAir) return val meta = item.itemMeta ?: return val pdc = meta.persistentDataContainer - val eventClass = event::class - for (key in pdc.keys) { val component = ComponentRegistry.get(key) ?: continue