【Bukkit Plugin開発】 Metadata を使う

これは Adventar: Bukkit Plugin開発 Advent Calendar 2015 参加記事です。
他の記事もぜひご覧ください。

Bukkit では、プラグインの開発をより簡単にするため、Playerクラス、Entityクラス、Worldクラスに紐づく追加データをMetadataという形式で管理できるようになっています。
それぞれのプラグイン内で、Player、Entity、World などをキーとしたHashMap型の変数内で管理するような必要はなくなります。
例えば、経済プラグインを作る場合、HashMap のようなデータをプラグイン内で持つ必要はありません。 プレイヤーにMetadataを直接設定すればやりたいことができるようになります。

メリット

  • Metadataは全てBukkit側で管理されます。プラグイン側で管理する必要がありません。
  • プラグイン間で共通にアクセスできるので、データの共有に使用できます。

デメリット

  • データの取得・設定を行うときに、ひと手間が必要になります。
  • Bukkitが停止すると、全てのMetadataが消えます。

使い方

    /**
     * PlayerにMetadataを設定するサンプルメソッド.
     * @param player 対象プレイヤー
     * @param key Metadataのキー名
     * @param value Metadataの値
     * @param plugin プラグインクラス
     */
    public void setMetadata(Player player, String key, Object value, Plugin plugin) {
        player.setMetadata(key, new FixedMetadataValue(plugin, value));
    }
 
    /**
     * PlayerからMetadataを取得するサンプルメソッド.
     * @param player 対象プレイヤー
     * @param key Metadataのキー名
     * @param plugin プラグインクラス
     * @return Metadataの値
     */
    public Object getMetadata(Player player, String key, Plugin plugin) {
        List<MetadataValue> values = player.getMetadata(key);
        for (MetadataValue value : values) {
            if (value.getOwningPlugin().getDescription().getName()
                    .equals(plugin.getDescription().getName())) {
                return value.value();
            }
        }
        return null;
    }

指定した方で受け取る

もしあなたが、必ず boolean、int、String としてMetadataの値を取得したいのであれば、asBoolean()、asInt()、asString() メソッドを使うことで、キャストせずに直接取得が可能です。

実際には以下のメソッドが用意されている。(1.8.8 R0.1 SNAPSHOT)

  • asBoolean()
  • asByte()
  • asDouble()
  • asFloat()
  • asInt()
  • asLong()
  • asShort()
  • asString()

次回

SQLとか扱いたいですね。

参考

コメント
トラックバック
ページトップへ