hcu-items/docs/creating_new_content.md

3.7 KiB
Raw Blame History

コンテンツの作成ガイド

このプロジェクトでは、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.ktonEnableItemRegistry.register(YourItem()) を呼び出して登録します。
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.ktonEnableComponentRegistry.register(YourComponent(this)) を呼び出して登録します。
class MyComponent(plugin: App) : AbstractComponent(plugin, "my_component") {
    override fun onInteract(event: PlayerInteractEvent) {
        event.player.sendMessage("Component interaction!")
    }
}

イベントの仕組み

AbstractComponent は初期化時に NamespacedKey を生成し、apply 時にこのキーをアイテムのPDCに書き込みます。 EventListener はアイテムのPDCにこのキーが存在することを確認すると、あなたのコンポーネントのイベントハンドラを呼び出します。

注意事項

  • AbstractItemCustomComponent は共存可能です。1つのアイテムが AbstractItem であり、かつ複数の CustomComponent を持つことができます。
  • イベントハンドラ内では、必要に応じて event.isCancelled などを適切に制御してください。