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. イベントに関与したアイテムを取得します。
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` などを適切に制御してください。

View File

@ -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)

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.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<ItemStack> {
val equipment = player.equipment
val items = mutableListOf<ItemStack>()
@ -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) {