# コンテンツの作成ガイド このプロジェクトでは、HcuItemsプラグインを使用して新しいアイテムや機能(コンポーネント)を追加するための仕組みを提供しています。 イベント処理は`EventListener`によって統一的に管理され、アイテムのPersistentDataContainer (PDC)の情報に基づいて適切なクラスに委譲されます。 ## アーキテクチャ概要 全てのイベント(右クリック、ダメージ、移動など)は `EventListener` で受信されます。 `EventListener` は以下の手順で処理を委譲します: 1. イベントに関与したアイテムを取得します。 2. アイテムのPDCを確認します。 - `AbstractItem` ID (`hcu_items:id`) がある場合 -> `ItemRegistry` からアイテム定義を取得して実行。 - コンポーネント用のキー (`hcu_items:component_id`) がある場合 -> `ComponentRegistry` からコンポーネント定義を取得して実行。 ## 1. AbstractItem (独自のアイテム) の作成 完全に独自の挙動を持つアイテムを作成する場合に使用します。 ### 手順 1. `AbstractItem` クラスを継承した新しいクラスを作成します。 2. コンストラクタで一意のIDを指定します。 3. `buildItem` メソッドを実装し、アイテムの見た目(Material, Name, Loreなど)を定義します。 4. 必要なイベントハンドラ(`onInteract`, `onPlayerMove` など)をオーバーライドします。 5. `App.kt` の `onEnable` で `ItemRegistry.register(YourItem())` を呼び出して登録します。 ```kotlin class MyCustomItem : AbstractItem("my_custom_item") { override fun buildItem(tier: Tier): ItemStack { return ItemStack(Material.DIAMOND_SWORD).apply { // Meta設定 } } override fun onInteract(event: PlayerInteractEvent) { event.player.sendMessage("Used custom item!") } } ``` ## 2. CustomComponent (既存アイテムへの機能追加) の作成 既存のアイテムや、特定の条件を満たすアイテムに共通の機能(例:グライダー、パッシブ効果)を付与する場合に使用します。 ### 手順 1. `AbstractComponent` を継承し、`CustomComponent` (または `EquippableComponent`) を実装したクラスを作成します。 2. コンストラクタで一意のコンポーネントIDを指定します。 3. `apply` メソッドでアイテムにコンポーネントを適用するロジック(PDCへのキー登録は自動で行われますが、追加のメタデータが必要な場合は記述)を実装します。 4. 必要なイベントハンドラをオーバーライドします。 5. `App.kt` の `onEnable` で `ComponentRegistry.register(YourComponent(this))` を呼び出して登録します。 ```kotlin class MyComponent(plugin: App) : AbstractComponent(plugin, "my_component") { override fun onInteract(event: PlayerInteractEvent) { event.player.sendMessage("Component interaction!") } } ``` ### イベントの仕組み `AbstractComponent` は初期化時に `NamespacedKey` を生成し、`apply` 時にこのキーをアイテムのPDCに書き込みます。 `EventListener` はアイテムのPDCにこのキーが存在することを確認すると、あなたのコンポーネントのイベントハンドラを呼び出します。 ## 注意事項 - `AbstractItem` と `CustomComponent` は共存可能です。1つのアイテムが `AbstractItem` であり、かつ複数の `CustomComponent` を持つことができます。 - イベントハンドラ内では、必要に応じて `event.isCancelled` などを適切に制御してください。