提供: Minecraft Modding Wiki
移動先: 案内検索

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
1行目: 1行目:
 +
 
Minecraft1.1向けのBukkit API以降、新しいイベントの仕組みが提供されています。<BR />
 
Minecraft1.1向けのBukkit API以降、新しいイベントの仕組みが提供されています。<BR />
 
この新しい仕組みは、シンプルでかつ、汎用性・高速性・可読性等に優れています。<BR />
 
この新しい仕組みは、シンプルでかつ、汎用性・高速性・可読性等に優れています。<BR />
14行目: 15行目:
 
=== イベントリスナ ===
 
=== イベントリスナ ===
 
まず、イベントを待ち受ける処理(Event Listenerと呼ばれます)が必要です:
 
まず、イベントを待ち受ける処理(Event Listenerと呼ばれます)が必要です:
<blockquote><source lang="java">
+
<blockquote><source lang="java">public void onPlayerLogin(PlayerLoginEvent event) {
@EventHandler
+
     // Your code here...
public void onPlayerLogin(PlayerLoginEvent event) {
+
}</source></blockquote>
     // ここに処理を書きます...
 
}
 
</source></blockquote>
 
 
次に、発生するイベント(Event Handlerと呼ばれます)が必要になります。
 
次に、発生するイベント(Event Handlerと呼ばれます)が必要になります。
  
28行目: 26行目:
  
 
イベントハンドラには優先度を指定でき、次のような書き方をします:
 
イベントハンドラには優先度を指定でき、次のような書き方をします:
<blockquote><source lang="java">@EventHandler(priority = EventPriority.HIGHEST) // 高優先度のイベントハンドラとする
+
<blockquote><source lang="java">@EventHandler(priority = EventPriority.HIGHEST) // 高優先度のイベントとする
@EventHandler(priority = EventPriority.LOW) // 低優先度のイベントハンドラとする</source></blockquote>
+
@EventHandler(priority = EventPriority.LOW) // 低優先度のイベントとする</source></blockquote>
  
 
以上をまとめると、次のようになります:
 
以上をまとめると、次のようになります:
 
<blockquote><source lang="java">@EventHandler
 
<blockquote><source lang="java">@EventHandler
 
public void onPlayerLogin(PlayerLoginEvent event) {
 
public void onPlayerLogin(PlayerLoginEvent event) {
     // ここに処理を書きます...
+
     // Your code here...
 
}</source></blockquote>
 
}</source></blockquote>
  
43行目: 41行目:
 
     @EventHandler
 
     @EventHandler
 
     public void onPlayerLogin(PlayerLoginEvent event) {
 
     public void onPlayerLogin(PlayerLoginEvent event) {
         // ここに処理を書きます...
+
         // Your code here...
 
     }
 
     }
 
}</source></blockquote>
 
}</source></blockquote>
53行目: 51行目:
 
上記の例で言えば、PlayerLoginEventから読み込みます。
 
上記の例で言えば、PlayerLoginEventから読み込みます。
  
:'''Note''': 特定のイベントハンドラを1つも登録していなければ、Bukkitはそのクラスをイベントリスナとして登録することができません。
+
:'''Note''': 特定のイベントまたはBukkitが登録しないイベントに関しては、手動で指定しなければなりません。(訳が不適切か)
  
 
=== イベントハンドラの設定 ===
 
=== イベントハンドラの設定 ===
107行目: 105行目:
 
その後、LOWからHIGHESTまで、順にリスナーが行われ、設定内容が書き換わります。<br>
 
その後、LOWからHIGHESTまで、順にリスナーが行われ、設定内容が書き換わります。<br>
 
最終的に、MONITORのリスナーが呼び出されます。この時点で、全てのリスナーが設定した内容が最終結果として参照できるようになります。<br>
 
最終的に、MONITORのリスナーが呼び出されます。この時点で、全てのリスナーが設定した内容が最終結果として参照できるようになります。<br>
MONITORは、イベントの内容を変更すべきではなく、イベントの結果を確認するためだけに使用してください。
+
MONITORは、イベントの内容を変更すべきではなく、イベントの結果を見るために使用されるべきです。
  
 
例として、BLOCK_PLACE イベントが処理されるとしましょう。<br>
 
例として、BLOCK_PLACE イベントが処理されるとしましょう。<br>
 
3つのプラグインが有効になっており、1つ目は基本的な領域保護プラグイン、2つ目はカンバンを使った付加価値的プラグイン、3つ目はログ記録プラグインです。<br>
 
3つのプラグインが有効になっており、1つ目は基本的な領域保護プラグイン、2つ目はカンバンを使った付加価値的プラグイン、3つ目はログ記録プラグインです。<br>
 
領域保護プラグインはPriority.LOWESTで待機します。
 
領域保護プラグインはPriority.LOWESTで待機します。
そのプラグインは、「この領域内にブロックを配置することはできない」と判断して、イベントをキャンセルします。<br>
+
それは、「この領域内にブロックを配置することはできません」という理由で、イベントをキャンセルします。<br>
 
カンバンを使った付加価値的プラグインはPriority.NORMALで待機します。
 
カンバンを使った付加価値的プラグインはPriority.NORMALで待機します。
そのプラグインは、「この領域内にカンバンを置くことができる」と判断したので、イベントをuncancelします(''event.isCancelled(false)'')。<br>
+
それは、「この領域内にカンバンを置くことができます」という理由で、イベントをuncancelします。<br>
 
ログ記録プラグインはPriority.MONITORで待機します。
 
ログ記録プラグインはPriority.MONITORで待機します。
これは、'''イベント処理が実際に実行された'''(キャンセルされていない)という最終結果を確認し、イベント内容をログに記録します。
+
これは、'''イベントが実際に許された'''という最終結果を確認し、イベント内容をログに記録します。
  
 
あなたはイベントの結果を変更する場合、LOWESTからHIGHESTの間で、慎重に選択してください。<br>
 
あなたはイベントの結果を変更する場合、LOWESTからHIGHESTの間で、慎重に選択してください。<br>
あなたが、イベントの最終結果を受け取りたいが、結果を変更しないときは、MONITORを使用してください。<br>
+
あなたが、イベントを受け取りたいが、結果を変更しないときは、MONITORを使用してください。<br>
ただし、'''MONITORのリスナーがイベントをキャンセルしたりしないように、イベントの内容を変更したりしないように、十分注意してください。'''最悪、他のプラグインの動作を阻害してしまうことになってしまいます。
+
ただし、MONITORのリスナーがイベントをキャンセルしたりしないように、イベントの内容を変更したりしないように、十分注意してください。最悪、他のプラグインの正常動作を阻害してしまうことになってしまいます。
  
== イベントリスナの登録 ==
+
== イベントの登録 ==
イベントリスナを記述するクラスは、<BR />
+
イベントを記述するクラスは、<BR />
 
Listenerインタフェースを実装(implements)し、かつイベントハンドラを含んでいなければなりません。
 
Listenerインタフェースを実装(implements)し、かつイベントハンドラを含んでいなければなりません。
  
131行目: 129行目:
 
}</source></blockquote>
 
}</source></blockquote>
  
イベントリスナの登録処理は、PluginManagerインスタンスのregisterEventsメソッドを使って、プラグインクラスと共に記述します。
+
イベントの登録処理は、PluginManagerインスタンスのregisterEventsメソッドとして、プラグインとリスナに記述します。
 
<blockquote><source lang="java">getServer().getPluginManager().registerEvents(Listener, Plugin);</source></blockquote>
 
<blockquote><source lang="java">getServer().getPluginManager().registerEvents(Listener, Plugin);</source></blockquote>
  
248行目: 246行目:
 
// 全てのイベントリスナを登録解除します。
 
// 全てのイベントリスナを登録解除します。
 
</source></blockquote>
 
</source></blockquote>
 +
  
  
324行目: 323行目:
 
     }
 
     }
 
}</source></blockquote>
 
}</source></blockquote>
 
=== 自作イベントをキャンセル可能にする ===
 
 
次に、自作イベントをキャンセル可能に実装してみましょう。Cancellableクラスを実装してください(implements Cancellable)。<br>
 
あとはそのまま利用してください。とっても簡単ですね!<br>
 
では、実例をみてみましょう。
 
 
<blockquote><source lang="java">import org.bukkit.event.Event;
 
import org.bukkit.event.HandlerList;
 
import org.bukkit.event.Cancellable;
 
 
public final class CustomEvent extends Event implements Cancellable {
 
    private static final HandlerList handlers = new HandlerList();
 
    private String message;
 
    private boolean cancelled;
 
 
    public CustomEvent(String example) {
 
        message = example;
 
    }
 
 
    public String getMessage() {
 
        return message;
 
    }
 
 
    public boolean isCancelled() {
 
        return cancelled;
 
    }
 
 
    public void setCancelled(boolean cancel) {
 
        cancelled = cancel;
 
    }
 
 
    public HandlerList getHandlers() {
 
        return handlers;
 
    }
 
 
    public static HandlerList getHandlerList() {
 
        return handlers;
 
    }
 
}</source></blockquote>
 
 
イベントをコールした後に、イベントがリスナーによってキャンセルされているかどうかを調べてください。<br>
 
キャンセルされていないなら、通常通り処理を実行すれば良いのです。
 
 
<blockquote><source lang="java">
 
// イベントのインスタンス化
 
CustomEvent event = new CustomEvent("Sample Message");
 
// イベントのコール
 
Bukkit.getServer().getPluginManager().callEvent(event);
 
// イベントがキャンセルされていないなら・・・
 
if (!event.isCancelled()) {
 
    // イベントからメッセージ内容を取得して処理する
 
    Bukkit.getServer().broadcastMessage(event.getMessage());
 
}
 
</source></blockquote>
 

Minecraft Modding Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMinecraft Modding Wiki:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)