こんにちは。
今回は実際にコードに触れながら、"どのように"コーディングしていくのかを勉強していきましょう。
このような状態であれば起動ができていると思います。
とりあえず「DevTools.phar」を「plugins」フォルダに入れましょう。
サーバーを起動した後、コンソールに「plugins」、もしくは「pl」(省略形)と打ち込むと、以下のスクリーンショットのように読み込まれているのが分かるはずです。
これでプラグインの開発をする準備が整いました。それでは早速作っていきましょう。
今回は初めてなので、簡単なメッセージプラグインを作りましょう。プラグインの仕様は以下の通りです。
DevToolsは「ソースコードのままプラグインを読み込んでくれるプラグイン」です。
つまり、DevToolsが私達の書いたプラグインを読み込んでくれるように、プラグインの構造、Pharの中身を知っておく必要があります。
Pharは解凍(展開)、圧縮、が簡単にできますが、それについては今後説明します。
サーバーを起動して、以下のコマンドを入力しましょう。
作者の部分はご自分の名前で置き換えて下さい。
正しく入力できていれば、以下のスクリーンショットのように表示されているはずです。
メッセージが出ているのが確認できたら、サーバーを再起動してみましょう。
読み込めているのが確認できるはずです。
JoinMessageフォルダ内を見てみましょう。まず、「src」フォルダと「plugin.yml」がありますね。
plugin.ymlを先に見てみましょう。メモ帳でも大丈夫です。
最低この4つがあればプラグインは動作するので、これだけ覚えておいて下さい。
api についてだけはよく勘違いする方がいるので説明します。
例えば、pmmp v3.0.11に対し api 3.0.0のプラグインは読み込めます。
しかし、pmmp v3.0.7に対し、api 3.0.8のプラグインは読み込めません。
つまり、apiの欄には対応したいpmmpのバージョンと同じか、それ以下のバージョンを書けば読み込むことが出来ます。
main にプラグインが起動したときに読み込まれるソースコードの場所が書いてあるので、その場所にソースコードを見に行きましょう。
srcフォルダ以下の「fuyutsuki\JoinMessage\Main」に確かにファイルがあることが確認できます。
実際にコードを見てみましょう。
次は、Mainクラスが継承しているPluginBaseクラスを見てみましょう。
PluginBaseクラスは、PMMPのsrc(ソースコード)内で実装されているので、PocketMine-MPのリポジトリをGitHubに見に行きます。
それでは、PluginBaseクラスを探してみましょう。
...
見つかりましたか?PluginBaseはここにあります。
私達はPluginBaseを継承したMainクラスを作ったので、PluginBaseに書いてある関数を自由に使うことができます。
実際にやってみましょう。PluginBaseにある関数、getName()を使います。
関数の宣言を見てみましょう。
簡単にまとめると以下の通りです。
例えば '日本', "あいうえお" などの文字列を指します。そのまんまですね。
型についてはPHP公式サイトで詳しく解説されています。
では、これを踏まえて次の例を見てみましょう。
テキストエディタを使って、コード部分をMain.phpにコピーして貼り付けてみて下さい。
namespaceを変更してしまうとプラグインを読み込まなくなってしまいます。
この例では、PluginBaseにある関数、onEnable()を上書きして実装しています。
onEnable()の関数名から分かるように、プラグインが有効になったときにこの関数が呼び出されます。
また、その関数の中で
としています。
途中....
今回は実際にコードに触れながら、"どのように"コーディングしていくのかを勉強していきましょう。
環境の確認
サーバーが一度でも起動していれば、前回作ったフォルダの中身は以下のスクリーンショットのようになると思います。このような状態であれば起動ができていると思います。
DevToolsの導入
DevTools.pharはプラグインです。そのため、pluginsフォルダ内に入れないと動作しません。とりあえず「DevTools.phar」を「plugins」フォルダに入れましょう。
サーバーを起動した後、コンソールに「plugins」、もしくは「pl」(省略形)と打ち込むと、以下のスクリーンショットのように読み込まれているのが分かるはずです。
これでプラグインの開発をする準備が整いました。それでは早速作っていきましょう。
最初のプラグイン開発
何を作る?
まず、プラグインを作るときに何を作りたいのか構想を練ります。「ブロックの名前を見たい」、「ゾンビを動くように」...などなど。今回は初めてなので、簡単なメッセージプラグインを作りましょう。プラグインの仕様は以下の通りです。
- "プレイヤーがサーバーに入ってきた時"に、「〇〇さんが参加しました!」と表示する
プラグインの構造
まず、DevToolsプラグインが何をしてくれるのかを思い出して下さい。DevToolsは「ソースコードのままプラグインを読み込んでくれるプラグイン」です。
つまり、DevToolsが私達の書いたプラグインを読み込んでくれるように、プラグインの構造、Pharの中身を知っておく必要があります。
Pharは解凍(展開)、圧縮、が簡単にできますが、それについては今後説明します。
スケルトンプラグインを作る
スケルトンプラグインとは、その名の通り骨組みのプラグインです。一番単純な読み込むだけのプラグインを自動生成してくれます。サーバーを起動して、以下のコマンドを入力しましょう。
genplugin JoinMessage fuyutsuki
genplugin
はコマンド、JoinMessage
はプラグイン名、fuyutsuki
はプラグインの作者です。作者の部分はご自分の名前で置き換えて下さい。
正しく入力できていれば、以下のスクリーンショットのように表示されているはずです。
メッセージが出ているのが確認できたら、サーバーを再起動してみましょう。
読み込めているのが確認できるはずです。
プラグインの中身
それでは、プラグインの中身を覗いてみましょう。以下のスクリーンショットのように、最初に作ったフォルダの「plugins」フォルダ内に「JoinMessage」フォルダができているはずです。JoinMessageフォルダ内を見てみましょう。まず、「src」フォルダと「plugin.yml」がありますね。
plugin.ymlを先に見てみましょう。メモ帳でも大丈夫です。
YAML:
name: JoinMessage
version: 0.0.1
main: fuyutsuki\JoinMessage\Main
api: 3.17.1
name: プラグインの名前
version: バージョン
main: プラグインが起動したときに読み込まれるソースコードの場所
api: 対応しているPMMPのAPIバージョン
最低この4つがあればプラグインは動作するので、これだけ覚えておいて下さい。
api についてだけはよく勘違いする方がいるので説明します。
例えば、pmmp v3.0.11に対し api 3.0.0のプラグインは読み込めます。
しかし、pmmp v3.0.7に対し、api 3.0.8のプラグインは読み込めません。
つまり、apiの欄には対応したいpmmpのバージョンと同じか、それ以下のバージョンを書けば読み込むことが出来ます。
main にプラグインが起動したときに読み込まれるソースコードの場所が書いてあるので、その場所にソースコードを見に行きましょう。
srcフォルダ以下の「fuyutsuki\JoinMessage\Main」に確かにファイルがあることが確認できます。
実際にコードを見てみましょう。
PHP:
<?php
# 名前空間: このファイルがある場所
namespace fuyutsuki\JoinMessage;
# pocketmine\plugin\PluginBase.php をこのファイル内で PluginBase として呼び出せるようにする
use pocketmine\plugin\PluginBase;
# Mainクラス は PluginBaseクラス の構造を引き継ぐ(extends = 継承)
class Main extends PluginBase{
// PluginBase.phpで実装されている内容をそのまま使える
}
次は、Mainクラスが継承しているPluginBaseクラスを見てみましょう。
PluginBaseクラスは、PMMPのsrc(ソースコード)内で実装されているので、PocketMine-MPのリポジトリをGitHubに見に行きます。
それでは、PluginBaseクラスを探してみましょう。
PMMPにもsrcフォルダがあって...
プラグインのuseで使用するパスはsrcフォルダ内の構造と同じで...
...
見つかりましたか?PluginBaseはここにあります。
私達はPluginBaseを継承したMainクラスを作ったので、PluginBaseに書いてある関数を自由に使うことができます。
実際にやってみましょう。PluginBaseにある関数、getName()を使います。
関数の宣言を見てみましょう。
PHP:
final public function getName() : string{
return $this->description->getName();
}
final
は"上書きされない"、継承先のMain.phpでgetName()を再定義することを防いでいます。public
は"公開"、これは関数のアクセスできる範囲を決める、「アクセス修飾子」というものです。簡単にまとめると以下の通りです。
- public: どこからでもアクセスできる
- protected: 継承先のクラスからならアクセスできる
- private: 定義したクラス自身からだけアクセスできる
function
は関数を定義する、という予約語です。getName()
は関数名getName、と同時に括弧内に何も定義されていないため、引数がないことを示しています。string
はstring型、文字列型を示しています。例えば '日本', "あいうえお" などの文字列を指します。そのまんまですね。
型についてはPHP公式サイトで詳しく解説されています。
では、これを踏まえて次の例を見てみましょう。
テキストエディタを使って、コード部分をMain.phpにコピーして貼り付けてみて下さい。
namespaceを変更してしまうとプラグインを読み込まなくなってしまいます。
PHP:
<?php
namespace fuyutsuki\JoinMessage;
use pocketmine\plugin\PluginBase;
class Main extends PluginBase {
// PluginBaseクラスで実装されている内容をそのまま使える
/**
* @link https://github.com/pmmp/PocketMine-MP/blob/stable/src/pocketmine/plugin/PluginBase.php#L259-L261
* onEnable関数の機能を上書き
*/
public function onEnable() {
$name = $this->getName();// コードの最後には ;(セミコロン)をつける
var_dump($name);// var_dump関数で $name の中身を出力
}
}
この例では、PluginBaseにある関数、onEnable()を上書きして実装しています。
onEnable()の関数名から分かるように、プラグインが有効になったときにこの関数が呼び出されます。
また、その関数の中で
PHP:
$name = $this->getName();
var_dump($name);
途中....