From d293cb031b760f10b56f28ccc107aaa63d21e023 Mon Sep 17 00:00:00 2001 From: Kariya Date: Thu, 11 Dec 2025 13:18:04 +0000 Subject: [PATCH] refactor: Consolidate component ticking logic into EventListener, remove ComponentListener, and update App.kt and documentation accordingly. --- docs/creating_new_content.md | 12 +++--- .../kotlin/net/hareworks/hcu/items/App.kt | 3 +- .../hcu/items/listeners/ComponentListener.kt | 41 ------------------- .../hcu/items/listeners/EventListener.kt | 28 +++++++++++-- 4 files changed, 32 insertions(+), 52 deletions(-) delete mode 100644 src/main/kotlin/net/hareworks/hcu/items/listeners/ComponentListener.kt diff --git a/docs/creating_new_content.md b/docs/creating_new_content.md index 09f38ff..f484a4c 100644 --- a/docs/creating_new_content.md +++ b/docs/creating_new_content.md @@ -10,23 +10,23 @@ 1. イベントに関与したアイテムを取得します。 2. アイテムのPDCを確認します。 - - `SpecialItem` ID (`hcu_items:id`) がある場合 -> `ItemRegistry` からアイテム定義を取得して実行。 + - `AbstractItem` ID (`hcu_items:id`) がある場合 -> `ItemRegistry` からアイテム定義を取得して実行。 - コンポーネント用のキー (`hcu_items:component_id`) がある場合 -> `ComponentRegistry` からコンポーネント定義を取得して実行。 -## 1. SpecialItem (独自のアイテム) の作成 +## 1. AbstractItem (独自のアイテム) の作成 -完全に独自の挙動を持つアイテムを作成する場合に使用します。 +完全に独自の挙動を持つアイテムを作成する場合に使用します。 ### 手順 -1. `SpecialItem` クラスを継承した新しいクラスを作成します。 +1. `AbstractItem` クラスを継承した新しいクラスを作成します。 2. コンストラクタで一意のIDを指定します。 3. `buildItem` メソッドを実装し、アイテムの見た目(Material, Name, Loreなど)を定義します。 4. 必要なイベントハンドラ(`onInteract`, `onPlayerMove` など)をオーバーライドします。 5. `App.kt` の `onEnable` で `ItemRegistry.register(YourItem())` を呼び出して登録します。 ```kotlin -class MyCustomItem : SpecialItem("my_custom_item") { +class MyCustomItem : AbstractItem("my_custom_item") { override fun buildItem(tier: Tier): ItemStack { return ItemStack(Material.DIAMOND_SWORD).apply { // Meta設定 @@ -64,5 +64,5 @@ class MyComponent(plugin: App) : AbstractComponent(plugin, "my_component") { `EventListener` はアイテムのPDCにこのキーが存在することを確認すると、あなたのコンポーネントのイベントハンドラを呼び出します。 ## 注意事項 -- `SpecialItem` と `CustomComponent` は共存可能です。1つのアイテムが `SpecialItem` であり、かつ複数の `CustomComponent` を持つことができます。 +- `AbstractItem` と `CustomComponent` は共存可能です。1つのアイテムが `AbstractItem` であり、かつ複数の `CustomComponent` を持つことができます。 - イベントハンドラ内では、必要に応じて `event.isCancelled` などを適切に制御してください。 diff --git a/src/main/kotlin/net/hareworks/hcu/items/App.kt b/src/main/kotlin/net/hareworks/hcu/items/App.kt index 2b4d236..15fc46d 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/App.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/App.kt @@ -26,8 +26,7 @@ public class App : JavaPlugin() { override fun onEnable() { instance = this saveDefaultConfig() - server.pluginManager.registerEvents(net.hareworks.hcu.items.listeners.EventListener(), this) - server.pluginManager.registerEvents(net.hareworks.hcu.items.listeners.ComponentListener(this), this) + server.pluginManager.registerEvents(net.hareworks.hcu.items.listeners.EventListener(this), this) logger.info("Items plugin enabled!") commands = CommandRegistrar.register(this, permits) diff --git a/src/main/kotlin/net/hareworks/hcu/items/listeners/ComponentListener.kt b/src/main/kotlin/net/hareworks/hcu/items/listeners/ComponentListener.kt deleted file mode 100644 index 1d6d923..0000000 --- a/src/main/kotlin/net/hareworks/hcu/items/listeners/ComponentListener.kt +++ /dev/null @@ -1,41 +0,0 @@ -package net.hareworks.hcu.items.listeners - -import net.hareworks.hcu.items.App -import net.hareworks.hcu.items.registry.ComponentRegistry -import org.bukkit.event.Listener -import org.bukkit.inventory.ItemStack - -class ComponentListener(private val plugin: App) : Listener { - - init { - // Run ticker - plugin.server.scheduler.runTaskTimer(plugin, Runnable { - tickComponents() - }, 1L, 1L) - } - - private fun tickComponents() { - val equippableComponents = ComponentRegistry.getEquippableComponents() - if (equippableComponents.isEmpty()) return - - for (player in plugin.server.onlinePlayers) { - val equipment = player.equipment - - // Collect items to check: Armor + Hands - val itemsToCheck = mutableListOf() - itemsToCheck.addAll(equipment.armorContents.filterNotNull()) - itemsToCheck.add(equipment.itemInMainHand) - itemsToCheck.add(equipment.itemInOffHand) - - for (item in itemsToCheck) { - if (item.type.isAir) continue - - for (component in equippableComponents) { - if (component.has(item)) { - component.onTick(player, item) - } - } - } - } - } -} 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 91deda2..497a580 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/listeners/EventListener.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/listeners/EventListener.kt @@ -10,7 +10,16 @@ import org.bukkit.event.Listener import org.bukkit.inventory.EquipmentSlot import org.bukkit.inventory.ItemStack -class EventListener : Listener { +import net.hareworks.hcu.items.api.component.EquippableComponent +import org.bukkit.plugin.Plugin + +class EventListener(private val plugin: Plugin) : Listener { + + init { + plugin.server.scheduler.runTaskTimer(plugin, Runnable { + tickComponents() + }, 1L, 1L) + } @EventHandler fun onInteract(event: org.bukkit.event.player.PlayerInteractEvent) { @@ -89,6 +98,19 @@ class EventListener : Listener { } } + private fun tickComponents() { + for (player in plugin.server.onlinePlayers) { + val items = getEquipmentItems(player) + for (item in items) { + dispatchToComponents(item) { component -> + if (component is EquippableComponent) { + component.onTick(player, item) + } + } + } + } + } + private fun getEquipmentItems(player: Player): List { val equipment = player.equipment val items = mutableListOf() @@ -101,8 +123,8 @@ class EventListener : Listener { private fun dispatchToItem(item: ItemStack, action: (AbstractItem) -> Unit) { if (item.type.isAir) return val id = AbstractItem.getId(item) ?: return - val specialItem = ItemRegistry.get(id) ?: return - action(specialItem) + val abstractItem = ItemRegistry.get(id) ?: return + action(abstractItem) } private fun dispatchToComponents(item: ItemStack, action: (CustomComponent) -> Unit) {