Minecraft BE wiki - Pocketmine-MP用プラグインの作り方

ここでは、マルチプレイ用ソフト「Pockemtine-MP」用のプラグインの作り方について少し説明していきます。

はじめに

PC表示で見てください。
自分自身、プラグイン作成に関してはまだまだ初心者です。いわゆる「汚い」コードも平気で書いてしまいます。
今回は鯖運営者の方々がもしかして作りたいと思っているんじゃないか?ということで、少しばかりの知識ですが書いていきます。
それ故に以下の記述に間違いがあるかもしれませんが、そのときは優しく教えていただければ幸いに思います。
自分はおまっちゃお氏とNexusMine氏に分からない部分を教えていただきました。ありがとうございます。
以下自分が参考にしたページです。
これらのサイトはAPI 1.3系(0.8.0/0.8.1)でのプラグインの作り方を説明しているので1.3の方はこちらも参考にしてください。

おまっちゃおの備忘録-プラグインサンプル集
http://mattyaphone.blog.fc2.com/blog-entry-107.htm...

おまっちゃおの備忘録-PocketMine-MP用プラグインの作り方
http://mattyaphone.blog.fc2.com/blog-entry-103.htm...

プラグインとは?

プラグインの作り方

1.3(0.8.0/0.8.1)でのプラグインの作り方

1.4(0.10.4バージョン)でのプラグインの作り方

1章 チュートリアル

今回のテーマ

1.3でのプラグインの作り方で作った/ip <プレイヤー名>と入力すると、その人のIPアドレスを表示させるプラグインを
1.4で作りましょう。
仕組みを少しずつ解説しつつ、プラグインを完成させていく、という感じで進めていこうと思います。

用意するもの

  • Pockemtine-MP本体
  • テキストエディタもしくは専用のエディタ(自分はeclipse(terapad)というエディタで編集しています。このソフトの使い方についてはご自身でお調べになってください。)
  • DevTools(理由は下の方で)

1.4で変わったこと

  • phpから読み込みではなくphar(zipみたいにフォルダを圧縮したもの)から読み込みになりました。
  • APIが変わったことでデータ呼び出し方法が変わりました。

作成するもの

1. プラグインの名前のフォルダを作成します。(名前は自分でわかるようにしてください!)写真ではIPPluginです。

2. IPPluginフォルダ内にsrcの名前のフォルダとplugin.ymlを追加します。

3. srcフォルダ内にフォルダを追加します。フォルダの名前は自由で大丈夫です。
写真ではプラグインの名前です。

4. 3での自由な名前のフォルダ内にphpを作成。phpの名前も自由で大丈夫です。写真ではプラグインの名前です。

自動生成したい時はMinecrafterJPN氏作のTemplateGeneratorを使いましょう!

TemplateGeneratorの使い方
まず、上のリンクからTemplateGeneratorをダウンロードしましょう
ダウンロードしたらTemplateGeneratorをプラグインのファイルを生成したいところにおいてください
置き終わったら、サーバーのファイルを開いて、binからphpをひらきその中のphp.exeにTemplateGenerator.phpをドロップアンドドラッグしてください
するとTemplateGeneratorの画面が出てきます
あとは画面の指示に従い項目を入力していってください

plugin.ymlの基本形・テンプレート

name: IPPlugin
main: IPPlugin\IPPlugin
version: 0.2
api: [1.1.0]
load: POSTWORLD
author: hmy2001
authors: [hmy2001]
description: Plyaer,IP.
website: 
commands:
 ip:
  description: "Players,IP"
  usage: " /ip [Player]"
permissions:
 ip:
  default: op
  description: "Allows using all the IPPlugin things"
  children:
   ip.command:
    default: true
    description: "Allows using all the IPPlugin commands"
  • name: IPPlugin
このプラグインのなまえは「IPPlugin」だよー
IPPluginの部分を自分の好きなプラグイン名にする
  • main: IPPlugin\IPPlugin
最初に読み込むphpファイルはsrcのIPPluginのフォルダ内にあるIPPlugin.phpだよー
version: 0.2
このプラグインのバージョンは「0.2」だよー
0.2の部分を編集。
  • api: [1.1.0]
対応しているAPIバージョンは1.1.0だよー
これは1.4での規格です。
  • load: POSTWORLD
これはよくわかりませんが、
ワールド読み込まれた時にプラグインを読み込むということだと思います。
  • author: hmy2001
一人で開発している場合はauthorのみに、自分の名前を記入してください。

複数人で開発している場合

製作者は「hmy2001」だよー
自分の名前を入れておこう。
  • description: Plyaer,IP.
ここはプラグインの説明をかいておきましょう。
  • website:
ここはプラグインのURLなどを載せるところです。
載せなくても構いません。
  • commands:
コマンドについて書きます。
  • ip:
IPPluginでのコマンドはipだということだよー(サブコマンドは書きません。)
  • description: "Players,IP"
/helpで出てくるコマンドの説明です。
  • usage: " /ip [Player]"
使用法が/ip [Player]だよーということです。
  • permissions:
権限について書きます。
  • ip:
ipの権限を設定。
  • default: op
デフォルトではop権限だよー
  • description: "Allows using all the IPPlugin things"
権限の説明です。
  • children:
もう一つの権限の設定。
  • ip.command:
ipの権限を設定。
  • default: true
デフォルトをオンにするよー
  • description: "Allows using all the IPPlugin commands"
権限の説明です。

src\自由な名前\自由な名前.php(ここではIPPlugin.php)の基本形・テンプレート

長くなるので処理部分を書いておきます。
<?php

namespace IPPlugin;

use pocketmine\Player;
use pocketmine\plugin\PluginBase;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\Server;

class IPPlugin extends PluginBase{

public function onCommand(CommandSender $sender, Command $command, $label, array $args){
$username = strtolower($args[0]);
$player = $this->getServer()->getPlayer($username);
if($player instanceOf Player){
$playerip = $player->getPlayer()->getAddress();
$sender->sendMessage("".$username."'s IP :".$playerip."");
return true;
}else{
$sender->sendMessage("Player doesn't exist");
return true;
}
}

}
  • namespace IPPlugin;
プラグインの名前はIPPluginだよー
  • use pocketmine\Player;
  • use pocketmine\plugin\PluginBase;
  • use pocketmine\command\Command;
  • use pocketmine\command\CommandSender;
  • use pocketmine\Server;
これはプラグインで使うものを本体から読み出します。
最低限、これぐらい読み出しましょう。
  • class IPPlugin extends PluginBase{
ここではクラス宣言をしています。

コマンド処理部分

public function onCommand(CommandSender $sender, Command $command, $label, array $args){
$username = strtolower($args[0]);
$player = $this->getServer()->getPlayer($username);
if($player instanceOf Player){
$playerip = $player->getPlayer()->getAddress();
$sender->sendMessage("".$username."'s IP :".$playerip."");
return true;
}else{
$sender->sendMessage("Player doesn't exist");
return true;
}
}
これでコマンドを処理しています。
順番は1.3と同じ順番です。
  • 1、コマンドで指定されたユーザーを探す
  • 2、そのユーザーに関するデータを取得
  • 3、データの中からIPアドレスのデータを抜き取る
  • 4、表示
$username = strtolower($args[0]);
で$usernameにプレイヤーの名前が入ります。自動に小文字となるのでエラーは出ません。
1.3では$params[0]でしたが1.4は$args[0]となりました。
$player = $this->getServer()->getPlayer($username);
で$usernameを使ってデータを入手してプレイヤーデータが$playerに入ります。
プレイヤーのデータが取れないままIPアドレス入手は出来ません。
なので条件分岐して入手したりしないようにしましょう。
ifをつかいます。
if($player instanceOf Player){
$playerip = $player->getPlayer()->getAddress();
$sender->sendMessage("".$username."'s IP :".$playerip."");
return true;
}else{
$sender->sendMessage("Player doesn't exist");
return true;
}
となります。
$playerip = $player->getPlayer()->getAddress();
で$playerでIPアドレスを入手して$playeripにIPアドレスが入ります。
$sender->sendMessage("".$username."'s IP :".$playerip."");
return true;
でコマンドをを入れた人にIPアドレスが送られます。
ここで}else{をいれ条件分岐させましょう。
$sender->sendMessage("Player doesn't exist");
return true;
これでプレイヤーがいなかったことが送られます。
これでプラグインが出来ました。
フォルダのままpluginsに入れても読み込まれません。

phar化

phar化することで読み込まれます。
ここでDevToolsを使いフォルダを一時的に読み込ませて
phar化します。
コンソールに/makeplugin IPPlugin(今回作成したプラグインの名前)
を打ってphar化し、pluginsのDevToolsフォルダ内にpharファイルが有るので
pluginsにいれて再起動します。フォルダのプラグインは削除しても大丈夫です。

最後に

これで1.4のプラグインの作り方の説明はおしまいです。
わからないことあったら掲示板にてお願いします。
説明難しくてすみません。