refactor: Consolidate component ticking logic into EventListener, remove ComponentListener, and update App.kt and documentation accordingly.

This commit is contained in:
Kariya 2025-12-11 13:18:04 +00:00
parent b476368425
commit d293cb031b
4 changed files with 32 additions and 52 deletions

View File

@ -10,23 +10,23 @@
1. イベントに関与したアイテムを取得します。 1. イベントに関与したアイテムを取得します。
2. アイテムのPDCを確認します。 2. アイテムのPDCを確認します。
- `SpecialItem` ID (`hcu_items:id`) がある場合 -> `ItemRegistry` からアイテム定義を取得して実行。 - `AbstractItem` ID (`hcu_items:id`) がある場合 -> `ItemRegistry` からアイテム定義を取得して実行。
- コンポーネント用のキー (`hcu_items:component_id`) がある場合 -> `ComponentRegistry` からコンポーネント定義を取得して実行。 - コンポーネント用のキー (`hcu_items:component_id`) がある場合 -> `ComponentRegistry` からコンポーネント定義を取得して実行。
## 1. SpecialItem (独自のアイテム) の作成 ## 1. AbstractItem (独自のアイテム) の作成
完全に独自の挙動を持つアイテムを作成する場合に使用します。 完全に独自の挙動を持つアイテムを作成する場合に使用します。
### 手順 ### 手順
1. `SpecialItem` クラスを継承した新しいクラスを作成します。 1. `AbstractItem` クラスを継承した新しいクラスを作成します。
2. コンストラクタで一意のIDを指定します。 2. コンストラクタで一意のIDを指定します。
3. `buildItem` メソッドを実装し、アイテムの見た目Material, Name, Loreなどを定義します。 3. `buildItem` メソッドを実装し、アイテムの見た目Material, Name, Loreなどを定義します。
4. 必要なイベントハンドラ(`onInteract`, `onPlayerMove` など)をオーバーライドします。 4. 必要なイベントハンドラ(`onInteract`, `onPlayerMove` など)をオーバーライドします。
5. `App.kt``onEnable``ItemRegistry.register(YourItem())` を呼び出して登録します。 5. `App.kt``onEnable``ItemRegistry.register(YourItem())` を呼び出して登録します。
```kotlin ```kotlin
class MyCustomItem : SpecialItem("my_custom_item") { class MyCustomItem : AbstractItem("my_custom_item") {
override fun buildItem(tier: Tier): ItemStack { override fun buildItem(tier: Tier): ItemStack {
return ItemStack(Material.DIAMOND_SWORD).apply { return ItemStack(Material.DIAMOND_SWORD).apply {
// Meta設定 // Meta設定
@ -64,5 +64,5 @@ class MyComponent(plugin: App) : AbstractComponent(plugin, "my_component") {
`EventListener` はアイテムのPDCにこのキーが存在することを確認すると、あなたのコンポーネントのイベントハンドラを呼び出します。 `EventListener` はアイテムのPDCにこのキーが存在することを確認すると、あなたのコンポーネントのイベントハンドラを呼び出します。
## 注意事項 ## 注意事項
- `SpecialItem` と `CustomComponent` は共存可能です。1つのアイテムが `SpecialItem` であり、かつ複数の `CustomComponent` を持つことができます。 - `AbstractItem` と `CustomComponent` は共存可能です。1つのアイテムが `AbstractItem` であり、かつ複数の `CustomComponent` を持つことができます。
- イベントハンドラ内では、必要に応じて `event.isCancelled` などを適切に制御してください。 - イベントハンドラ内では、必要に応じて `event.isCancelled` などを適切に制御してください。

View File

@ -26,8 +26,7 @@ public class App : JavaPlugin() {
override fun onEnable() { override fun onEnable() {
instance = this instance = this
saveDefaultConfig() saveDefaultConfig()
server.pluginManager.registerEvents(net.hareworks.hcu.items.listeners.EventListener(), this) server.pluginManager.registerEvents(net.hareworks.hcu.items.listeners.EventListener(this), this)
server.pluginManager.registerEvents(net.hareworks.hcu.items.listeners.ComponentListener(this), this)
logger.info("Items plugin enabled!") logger.info("Items plugin enabled!")
commands = CommandRegistrar.register(this, permits) commands = CommandRegistrar.register(this, permits)

View File

@ -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<ItemStack>()
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)
}
}
}
}
}
}

View File

@ -10,7 +10,16 @@ import org.bukkit.event.Listener
import org.bukkit.inventory.EquipmentSlot import org.bukkit.inventory.EquipmentSlot
import org.bukkit.inventory.ItemStack 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 @EventHandler
fun onInteract(event: org.bukkit.event.player.PlayerInteractEvent) { 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<ItemStack> { private fun getEquipmentItems(player: Player): List<ItemStack> {
val equipment = player.equipment val equipment = player.equipment
val items = mutableListOf<ItemStack>() val items = mutableListOf<ItemStack>()
@ -101,8 +123,8 @@ class EventListener : Listener {
private fun dispatchToItem(item: ItemStack, action: (AbstractItem) -> Unit) { private fun dispatchToItem(item: ItemStack, action: (AbstractItem) -> Unit) {
if (item.type.isAir) return if (item.type.isAir) return
val id = AbstractItem.getId(item) ?: return val id = AbstractItem.getId(item) ?: return
val specialItem = ItemRegistry.get(id) ?: return val abstractItem = ItemRegistry.get(id) ?: return
action(specialItem) action(abstractItem)
} }
private fun dispatchToComponents(item: ItemStack, action: (CustomComponent) -> Unit) { private fun dispatchToComponents(item: ItemStack, action: (CustomComponent) -> Unit) {