refactor: Consolidate component ticking logic into EventListener, remove ComponentListener, and update App.kt and documentation accordingly.
This commit is contained in:
parent
b476368425
commit
d293cb031b
|
|
@ -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` などを適切に制御してください。
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user