refactor: Pass event class explicitly for event handler lookup during dispatch.

This commit is contained in:
Kariya 2025-12-18 16:43:15 +00:00
parent fe002a5372
commit 483493bb87
4 changed files with 17 additions and 15 deletions

View File

@ -33,7 +33,6 @@ public class App : JavaPlugin() {
// Initialize Config // Initialize Config
saveDefaultConfig() saveDefaultConfig()
net.hareworks.hcu.items.config.Config.load(this) net.hareworks.hcu.items.config.Config.load(this)
server.pluginManager.registerEvents(net.hareworks.hcu.items.listeners.EventListener(this), this)
logger.info("Items plugin enabled!") logger.info("Items plugin enabled!")
commands = CommandRegistrar.register(this, permits) commands = CommandRegistrar.register(this, permits)
@ -50,5 +49,6 @@ public class App : JavaPlugin() {
ComponentRegistry.register(BlinkComponent(this)) ComponentRegistry.register(BlinkComponent(this))
ComponentRegistry.register(VeinMinerComponent(this)) ComponentRegistry.register(VeinMinerComponent(this))
server.pluginManager.registerEvents(net.hareworks.hcu.items.listeners.EventListener(this), this)
} }
} }

View File

@ -59,7 +59,7 @@ class GrapplingItem : AbstractItem("grappling_hook") {
val player = event.player val player = event.player
val isStuck = hook.persistentDataContainer.has(KEY_HOOK_STUCK, org.bukkit.persistence.PersistentDataType.BYTE) val isStuck = hook.persistentDataContainer.has(KEY_HOOK_STUCK, org.bukkit.persistence.PersistentDataType.BYTE)
if (event.state == PlayerFishEvent.State.REEL_IN && isStuck) { if (event.state == PlayerFishEvent.State.REEL_IN && isStuck) {
if (!cooldown.checkAndWarn(player)) { if (!cooldown.checkAndWarn(player)) {
return return

View File

@ -119,8 +119,10 @@ object EventStrategyRegistry {
// PlayerFishEvent // PlayerFishEvent
register(PlayerFishEvent::class, object : EventContextStrategy<PlayerFishEvent> { register(PlayerFishEvent::class, object : EventContextStrategy<PlayerFishEvent> {
override fun resolveItems(event: PlayerFishEvent): List<ItemStack> { override fun resolveItems(event: PlayerFishEvent): List<ItemStack> {
val item = event.player.inventory.itemInMainHand val items = mutableListOf<ItemStack>()
return if (item.type.isAir) emptyList() else listOf(item) 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 override fun resolvePlayer(event: PlayerFishEvent): Player = event.player
}) })
@ -129,8 +131,10 @@ object EventStrategyRegistry {
register(ProjectileLaunchEvent::class, object : EventContextStrategy<ProjectileLaunchEvent> { register(ProjectileLaunchEvent::class, object : EventContextStrategy<ProjectileLaunchEvent> {
override fun resolveItems(event: ProjectileLaunchEvent): List<ItemStack> { override fun resolveItems(event: ProjectileLaunchEvent): List<ItemStack> {
val shooter = event.entity.shooter as? Player ?: return emptyList() val shooter = event.entity.shooter as? Player ?: return emptyList()
val item = shooter.inventory.itemInMainHand val items = mutableListOf<ItemStack>()
return if (item.type.isAir) emptyList() else listOf(item) 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 override fun resolvePlayer(event: ProjectileLaunchEvent): Player? = event.entity.shooter as? Player
}) })

View File

@ -87,7 +87,7 @@ class EventListener(private val plugin: Plugin) : Listener {
if (eventClass.isInstance(event)) { if (eventClass.isInstance(event)) {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val castedEvent = event as T 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 <T : Event> dispatchWithStrategy(event: T, strategy: EventContextStrategy<T>) { private fun <T : Event> dispatchWithStrategy(event: T, strategy: EventContextStrategy<T>, eventClass: KClass<T>) {
val items = strategy.resolveItems(event) val items = strategy.resolveItems(event)
// Avoid duplicate firing for the same component on the same item context // Avoid duplicate firing for the same component on the same item context
for (item in items) { for (item in items) {
dispatchToItem(event, item) dispatchToItem(event, item, eventClass)
dispatchToComponents(event, item) dispatchToComponents(event, item, eventClass)
} }
} }
private fun <T : Event> dispatchToItem(event: T, item: ItemStack) { private fun <T : Event> dispatchToItem(event: T, item: ItemStack, eventClass: KClass<T>) {
if (item.type.isAir) return if (item.type.isAir) return
val id = AbstractItem.getId(item) ?: return val id = AbstractItem.getId(item) ?: return
val abstractItem = ItemRegistry.get(id) ?: return val abstractItem = ItemRegistry.get(id) ?: return
val handler = abstractItem.getEventHandlers()[event::class] val handler = abstractItem.getEventHandlers()[eventClass]
if (handler != null) { if (handler != null) {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
(handler as (T, ItemStack) -> Unit).invoke(event, item) (handler as (T, ItemStack) -> Unit).invoke(event, item)
} }
} }
private fun <T : Event> dispatchToComponents(event: T, item: ItemStack) { private fun <T : Event> dispatchToComponents(event: T, item: ItemStack, eventClass: KClass<T>) {
if (item.type.isAir) return if (item.type.isAir) return
val meta = item.itemMeta ?: return val meta = item.itemMeta ?: return
val pdc = meta.persistentDataContainer val pdc = meta.persistentDataContainer
val eventClass = event::class
for (key in pdc.keys) { for (key in pdc.keys) {
val component = ComponentRegistry.get(key) ?: continue val component = ComponentRegistry.get(key) ?: continue