【Bukkit Plugin開発】 Metadata を使う

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

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

メリット

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

デメリット

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

使い方

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

指定した方で受け取る

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

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

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

次回

SQLとか扱いたいですね。

参考

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