はじめに
この記事はMinecraft BedRock Editionのサーバーソフト、PocketMine-MP(以下pmmp)について記述されたものです。ご了承ください。
また、著者はpmmpについて全くの初学者であり、調べながらちょこちょこ書いた覚え書きのため、すべての情報が正しいとは限りません。あらかじめ把握頂いたうえで読んでいただくことをお勧めいたします(内容の修正があればお気軽にコメント頂けると幸いです)
さらに詳しい説明は専用のdiscordサーバーの質問フォームにて質問すると確実かなと思います🐥
前提知識
- Minecraftについての基本的な知識
- pmmpのプラグイン制作についての最低限の知識(読み込むだけのプラグインをつくれればOKです)
Vector3とは
マインクラフトのx, y, z
からなる座標を表すクラスです。(ソースコードは[ココ]
(https://github.com/pmmp/Math/blob/stable/src/Vector3.php))
このクラスでは、座標を示す3つの変数$x, $y, $z
の定義と、それに足したり引いたりして加工する関数が用意されてるみたいです。
ただ、例えば「特定のプレイヤーを指定した座標にワープさせる関数」のようなものはない様子。
/tp
のようなコマンドを実装するためにはどうすればいいのでしょうか?
Entityをテレポートさせてみる
実際にプレイヤーやEntityをテレポートさせるためのコードを考えてみることにします。
pmmpで実装されている/tp
コマンドの実装を見てみるとなにかわかるかも。(ソースコードはココ)
// Player $subject;
$subject->teleport($targetPlayer->getLocation());
どうやらこの一文がテレポートを実行しているみたい。
$subject->teleport()
の実装部分も見てみましょう(ソースコードはココ)
public function teleport(Vector3 $pos, float $yaw = null, float $pitch = null) : bool {
...
}
引数にVector3型を用いていますね。
(ちなみにEntity.phpでも同じ実装がなされていることから、他Entityに対しても有効です)
以上のことから、/tp
のようにエンティティを瞬間移動させるためには、
Player型 or Entity型の変数(ここでは$entityとする)を用意
↓
指定したい座標を代入したVector3型の変数(ここでは$positionとする)を用意
↓
$entity->teleport($position);
でオッケーです。
ちょっとつかってみよう
これをつかっていくつか軽い実装をしてみます。
(コマンド登録や例外処理などの方法はここでは省略しています)
プレイヤーを指定の座標に飛ばすコマンド
/warp [player] [x] [y] [z]
で指定座標にテレポートできるような、/tp
と同じようなコマンドを作ってみます。
ライブラリの読み込み
使うライブラリを読み込んでいきます。 1
use pocketmine\math\Vector3;
use pocketmine\Player;
実装
# テレポート先の座標を定義(Vector3型)
$targetPosition = new Vector3($x, $y, $z);
$player->teleport($targetPosition);
これだけです。結構単純。
結果
https://youtu.be/ysOivioXyNw
指定した座標にプレイヤー(この場合は自分)がテレポートされているのが確認できました。
-
実は、Vector3とPlayerのあるpocketmineディレクトリはそれぞれ違う場所にあるものです。前者は**名前空間(namespace)**というシステムによってpocketmineディレクトリから参照できるようになっていますが、実際には
pmmp\Math\src
にソースコードが置いてあります。(最初はどこに書いてあるかわからず混乱しました) ↩