【Bukkit Plugin開発】 Metadata を使う
これは Adventar: Bukkit Plugin開発 Advent Calendar 2015 参加記事です。
他の記事もぜひご覧ください。
Bukkit では、プラグインの開発をより簡単にするため、Playerクラス、Entityクラス、Worldクラスに紐づく追加データをMetadataという形式で管理できるようになっています。
それぞれのプラグイン内で、Player、Entity、World などをキーとしたHashMap型の変数内で管理するような必要はなくなります。
例えば、経済プラグインを作る場合、HashMap
メリット
- 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<MetadataValue> 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とか扱いたいですね。