【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とか扱いたいですね。