マインクラフト非公式フォーラム

本フォーラムでは多彩なサービスを提供しています。

利用方法は「Wiki」より確認できます。

ぜひご登録をお願いいたします!

PocketMine-MP プラグイン開発講座 #2【初心者向け】

こんにちは。
今回は実際にコードに触れながら、"どのように"コーディングしていくのかを勉強していきましょう。

環境の確認

サーバーが一度でも起動していれば、前回作ったフォルダの中身は以下のスクリーンショットのようになると思います。

1609168685721.png


このような状態であれば起動ができていると思います。

DevToolsの導入

DevTools.pharはプラグインです。そのため、pluginsフォルダ内に入れないと動作しません。
とりあえず「DevTools.phar」を「plugins」フォルダに入れましょう。

サーバーを起動した後、コンソールに「plugins」、もしくは「pl」(省略形)と打ち込むと、以下のスクリーンショットのように読み込まれているのが分かるはずです。

1609168893045.png


これでプラグインの開発をする準備が整いました。それでは早速作っていきましょう。


最初のプラグイン開発

何を作る?

まず、プラグインを作るときに何を作りたいのか構想を練ります。「ブロックの名前を見たい」、「ゾンビを動くように」...などなど。
今回は初めてなので、簡単なメッセージプラグインを作りましょう。プラグインの仕様は以下の通りです。
  • "プレイヤーがサーバーに入ってきた時"に、「〇〇さんが参加しました!」と表示する

プラグインの構造

まず、DevToolsプラグインが何をしてくれるのかを思い出して下さい。

DevToolsは「ソースコードのままプラグインを読み込んでくれるプラグイン」です。
つまり、DevToolsが私達の書いたプラグインを読み込んでくれるように、プラグインの構造、Pharの中身を知っておく必要があります。
Pharは解凍(展開)、圧縮、が簡単にできますが、それについては今後説明します。

スケルトンプラグインを作る

スケルトンプラグインとは、その名の通り骨組みのプラグインです。一番単純な読み込むだけのプラグインを自動生成してくれます。
サーバーを起動して、以下のコマンドを入力しましょう。

genplugin JoinMessage fuyutsuki

genpluginはコマンド、JoinMessageはプラグイン名、fuyutsukiはプラグインの作者です。
作者の部分はご自分の名前で置き換えて下さい。

正しく入力できていれば、以下のスクリーンショットのように表示されているはずです。

1609169877025.png


メッセージが出ているのが確認できたら、サーバーを再起動してみましょう。

1609169945554.png


読み込めているのが確認できるはずです。

プラグインの中身

それでは、プラグインの中身を覗いてみましょう。以下のスクリーンショットのように、最初に作ったフォルダの「plugins」フォルダ内に「JoinMessage」フォルダができているはずです。

1609170187531.png


JoinMessageフォルダ内を見てみましょう。まず、「src」フォルダと「plugin.yml」がありますね。

1609170260458.png


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 にプラグインが起動したときに読み込まれるソースコードの場所が書いてあるので、その場所にソースコードを見に行きましょう。

1609170602085.png


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);
としています。

途中....
 
Top