今回はPMMPプラグイン講座の三回目です。
前回は「JoinMessage」という名前で参加時にメッセージを送るプラグインを実際に作ってみました。
私が改修したプラグイン、「TapID」を見て、内容を学んでみましょう。

TapID

今回は、解説用に簡単なプラグイン、TapIDをご紹介します。
このプラグインはその名の通り、(ブロックを)タップするとIDを表示するプラグインです。
ええ、ただそれだけです。

…それだけかって?そんなこと無いよ。ソースコードが見られるGitHubのリポジトリはこちら

内容の解説

まず、このプラグインのソースコードを眺めてみて下さい。私がわかりやすいようにコメントで動作の内容を書いておきました。
このプラグインがどうやって動いているかなんとなく分かれば、初心者は脱却したと言ってもいいでしょう。
中級者向けのプラグイン講座の記事も出す予定なので待っててね…。

見てもちんぷんかんぷんな方、安心して下さい。ちゃんと解説します。

初めにこのプラグインの核(PluginBaseを継承しているクラス)、Main.phpを見てみましょう
このクラスはPluginBaseを継承しているので、onEnable関数を上書きし、プラグインの有効化時にEventListenerクラスをイベントのリスナーとして登録しています。
(イベントが発生したときに何かを動かす感じ)

また、今回はクラス分けを学ぶためにプラグインのメインクラスとイベントリスナを分けています。
クラス分けをすることによって、プラグインがより大規模になった時にコードの管理がしやすくなります(細分化しすぎると処理を追うのは大変になりますが)。

文字ばっかりだと疲れるとは思いますが、開発者を目指しているのであれば読んで下さい。

Mainクラスに見慣れない関数があるのが分かるでしょうか。
そうです。getLastTappedTime()、setLastTappedTime()、removeTimer()の3つですね。

これらは私がMainクラスに作った関数です。関数の作り方は…例えば以下の通りです。

例1. 足し算をしたい時

PMMPは現行のものだとPHP7.2~7.3なので、型の指定ができます。
しなくてもコード自体は動きますが、以下のようにエラーの素になるのでできる限り適切な型を付けることをオススメします。

型についてはPHP公式サイトに書いてあります。

また、PHPに実装されている型はスカラー型と呼ばれていて、PHPの場合は動的型付け言語であるので(そうなんだー程度の理解で大丈夫です)、文脈によって変数の型が決まります。

それをMain.phpの3行目にあるdeclare(strict_types=1);で抑制している、というわけです。なので、これはおまじない程度に考えてもらえれば大丈夫。書き忘れてももちろん動きます。

脱線しましたね。関数は以下のようなときにすごく役立ちます。

例2. 何回も同じ処理をするとき

ちゃっかり例2でPlayerクラスを関数の引数として使ってますが、PHPの型以外にもクラスを指定することができます。
つまり、勘の良い方ならもう分かるかもしれませんが、自分で定義したクラスを引数に入れることもできます。
中級者向けの記事で解説しようかと思います。

話を戻しましょう。Mainクラスに私が定義した関数は3つです。これらの働きを一つ一つ解説しましょう。

まず、getLastTappedTime(Player $player): int ですね。
この関数は、その名の通り最後に(ブロックを)タップしたときの時間を返す、という関数になります。中身は

$this->timer[$player->getId()] ?? 0;

です。これは $this (このクラスのことなのでMainクラスのことを指します)の timer と言う名前のクラスメンバ変数を参照しています。
この変数もPluginBase にはないもので、私がMainクラスにくっつけたものになります。17行目ですね

17行目では、クラスメンバ変数の宣言及び初期化を行っています。
private というのは、その変数を宣言したクラスからしかその変数にアクセスできないようにする”アクセス修飾子”というものになります。
今は詳しく説明しませんが、どういうものなのか気になる方はこちらを見てみて下さい。

$this->timer の中身は17行目で配列(Array)として宣言しています。
大括弧([])の中に$player->getId()という関数が入っていますね。
この関数はプレイヤーのEntityID(int(整数型))を返す関数ですが、今は余り考える必要はないです。

その次、$this->timer[$player->getId()] の次に ?が2つあって、その次に0、と書いてあります。
これはPHP7で実装されたNull合体演算子というもので、

$this->timer[$player->getId()] ?? 0;

というこの一文は以下と同じ意味を表します。

つまり、$this->timer[$player->getId()]の中身があればそれを返して、なければ0を返す、ということです。

若干中級者向けの記事に、そして長くなってしまいました。
次の更新は残り2つの関数の説明ですね。今月中に更新するので、この記事をスルメのように噛んでいて下さい。