11
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

イベントをもっと制御してみる[PocketMine-MP]

Last updated at Posted at 2019-02-11

注意

PMMP3.x向けの記事です。
バージョン4以上をお使いの方はあてにしないで。あくまで参考までに。いつか更新します

#はじめに

PocketMine-MPには、プラグインで
マーカーインターフェースのListenerを持つクラスに
任意のイベントを引数としたメソッドを用意し、
イベント処理を行わせる機能があります。

その中で、今回触れるのは PHPDocを使って動作を制御する方法です。

何故使っているものを見ないのだろうと疑問に感じたので
書いていきます。
(そもそも使う機会そんなにないのかな...とか)
 

イベントを実行させる順序

イベントにおいて、
どのプラグインのイベント処理が先に行われるか考えたことはありますか?

私は、PlayerJoinEventでのネームタグ操作処理で、その考えがよぎりました。

例えば、$player->setNameTag("[ahehe]".$player->getNameTag())
としたとき、
同じイベントを持つ別のメソッドで、$player->setNameTag("[ohoho]".$player->getNameTag())
と書いてあると想定します。

[ohoho][ahehe]MyDeacy みたいにしたいのに、順序のわからない状態だと
[ahehe][ohoho]MyDeacy となってしまうかもしれません。
ややこしい。

そこを解決してくれるのがこれ
@priority <優先度>

PHPDocの中に書き、こんな感じになります。

/**
 * @priority HIGH
 */
function onJoin(PlayerJoinEvent $event){
    //処理
}

@priorityの次に優先度を記入することで
イベントの実行順を操作できます。

順序は、実行が速い順から
LOWEST → LOW → NORMAL(これが通常) → HIGH → HIGHEST → MONITOR
となります。

(単語の意味的に順序逆な気もしますが、流石PMMPですね。)

 

このプラグインがないとイベント処理しない

「あなたがないと これやらないわ!」
メンヘラみたいですね。

プラグインの__依存関係__を定義することができます。

書き方は↓↓

@softDepend [PluginName]

PluginNameは該当のプラグインの名前をいれ、
そのプラグインが有効でない状態ならば
イベントを引数に置いたそのメソッドはコールされません。

これは割と使い道あるのではないでしょうか。

使用法です。
前述の例と同様に記載します。

/**
 * @softDepend EconomyAPI
 */
function onJoin(PlayerJoinEvent $event){
    //処理
}

 

キャンセルされたイベントならば処理しない

このように記載します。

@ignoreCancelled

タイトルではピンと来ないかもしれません。

前述の、イベントの実行順序に絡んでおり、
前に実行されたメソッドで、
自分が引数として持っているイベントがキャンセルされていない場合
これをPHPDocに持ったメソッドはコールされます。

分かりにくいと思うので例を。

先に、イベント発火時に このメソッドが実行されていたとします。

function onJoin(PlayerJoinEvent $event){
    $event->setCancelled(); //イベントをキャンセル
}

 
その次に実行されたこのメソッドは、
イベントがキャンセルされたため ハンドラに渡されず、
コールされることはありません。

/**
 * @ignoreCancelled
 * @priority HIGH
 */
function onJoin(PlayerJoinEvent $event){
    $event->getPlayer()->sendMessage("anpon");
}

 

実行させない

メソッドをイベントハンドラではないとみなし、
イベントが発生した際、そのイベントを引数に持っていたとしても
メソッドはコールされなくなります。

書き方↓↓  今までの例のように記載するだけです。

@notHandler
 
#おわりに
機能をメモがてら記事に書き起こしましたが どうでしょう。
少しでも参考になると幸いです。

ここにあらかた書いてあるんですけどね。

pocketmine/event/Listener.php

それにしても優先順序 low → high は謎である。
☝とか言ってたけど、これ実行順じゃなくて優先度を意味してるからそりゃそーだよね

11
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?