PocketMine-MPをUbuntu19.04でサーバー構築

## 必要なもの
- Ubuntu 19.04
- [GitHub](https://github.com)アカウント

## 新規ユーザの作成

```console
$ sudo adduser <任意のユーザ名>
```

画面の指示に従って設定してください。(設定するものはパスワードのみでいいです。）

次に、sudoグループに作成したユーザを登録し、ユーザを切り替えます。

```console
$ sudo gpasswd -a <ユーザ名> sudo
$ su - <ユーザ名>
```

## PocketMine-MPのダウンロード
作業用のディレクトリを作成し、Git上からPocketMine-MPのリポジトリをクローンします。

```console
$ mkdir pmmp
$ cd pmmp
$ git clone --recursive https://github.com/pmmp/PocketMine-MP.git
```

`--recursive`オプションを付与することで、サブモジュールも同時にクローンします。

```console
$ cd PocketMine-MP
$ cp -r src start.sh composer.json ../
$ cd ../
```

起動に必要な**src**フォルダと**start.sh**、**composer.json**をコピーします。

使わなくなったPocketMine-MPフォルダは削除してしまっても構いません。

## binフォルダのコンパイル
```console:Gitからクローンとbinのコンパイル
$ git clone https://github.com/pmmp/php-build-scripts.git
$ cd php-build-scripts
$ ./compile.sh
```

コンパイルには時間を要しますので、時間に余裕があるときに行うことをオススメします。

#### [ERROR] Please install "*" が発生した場合

```console:例(bisonとlibtoolがない)
$ ./compile.sh
[PocketMine] PHP compiler for Linux, MacOS and Android
[INFO] Checking dependencies
[ERROR] Please install "bison"
[ERROR] Please install "libtool" or "libtool-bin"
Press [Enter] to continue...

$ sudo apt install bison libtool-bin
```

コンパイルが終了したら、ファイルを移動します。

```console
$ mv bin ../
$ cd ../
```

php-build-scriptsフォルダは削除しても構いません。

## Composerのインストール
Composerの公式サイトから**composer.phar**をダウンロードします。

```console:Composerのダウンロードとインストール
$ curl -sS https://getcomposer.org/installer | php
$ bin/php7/bin/php composer.phar install
```

すると、

```
・
・
・
Token (hidden):
```
トークンの入力が要求される場合があります。
トークンの入手方法については、[composer使う時にgithubのトークンを聞かれた - Qiita](https://qiita.com/n0bisuke/items/54169b5e3800f792b8df)を参考に進めてください。(GitHubアカウントが必須となります。)

## PocketMine-MPのセットアップ
```console
$ ./start.sh -f src/pocketmine/PocketMine.php
```

でPocketMine-MPを起動します。

```:PocketMine-MPのセットアップ
[*] PocketMine-MP set-up wizard
[*] Please select a language
 العربية => ara
 Pyccĸий => rus
 Tiếng Việt => vie
 English => eng
 Čeština => ces
 Magyar => hun
 Español => spa
 tlhIngan => tlh
 한국어 => kor
 Українська => ukr
 Português => por
 Svenska => swe
 Latviešu => lav
 Türkçe => tur
 Norsk => nor
 Tagalog => tgl
 Italiano => ita
 日本語 => jpn
 Английски => bul
 Bahasa Melayu => msa
 Malti => mlt
 Eesti => est
 Français => fra
 中文 (简体) => chs
 Suomi => fin
 Bahasa Indonesia => ind
 Ελληνικά => ell
 Polski => pol
 Gaeilge => gle
 Deutsch => deu
 עברית => heb
 中文(繁體) => zho
 ภาษาอังกฤษ => tha
 Engleski => hrv
 Nederlands => nld
[?] Language (eng):
```
セットアップウィザードが起動し、使用する言語が求められるので、**jpn**と入力します。

```
[*] 日本語に設定されました
[*] PocketMine-MPをインストールして頂きありがとうございます！サーバのセットアップを開始するにはライセンスに同意する必要があります。PocketMine-MPはLGPLライセンスに基づいて認可されており、これについてはこのフォルダ内のLICENSEファイルから確認することができます。

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Lesser General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

[?] ライセンスに同意しますか？ (y/N):
```
日本語に設定され、ライセンスへの同意を求められますので**y**と入力します。

```
[?] セットアップウィザードをスキップしますか？ (y/N):
```

ここでは、サーバーの詳細設定は**server.properties**ファイルにて行いますので、**y**でスキップします。

これでサーバーは起動しますが、まだサーバーの設定とポートの解放が必要なので、一旦**Ctrl+C**でサーバーを閉じます。

## pocketmine.ymlファイルの編集
vim等でpocketmine.ymlファイルを開きます。
`settings`の中の`enable-dev-builds`を**true**に書き換え、保存します。

## server.propertiesファイルの編集
vim等でserver.propertiesファイルを開きます。

```properties
motd=PocketMine-MP Server
server-port=19132
white-list=off
announce-player-achievements=on
spawn-protection=16
max-players=20
allow-flight=off
spawn-animals=on
spawn-mobs=on
gamemode=0
force-gamemode=off
hardcore=off
pvp=on
difficulty=1
generator-settings=
level-name=world
level-seed=
level-type=DEFAULT
enable-query=on
enable-rcon=off
rcon.password=abcd1234
auto-save=on
view-distance=8
xbox-auth=on
```

#### 各種設定の説明
`motd=PocketMine-MP Server`
Motd(サーバー名)の設定

`server-port=19132`
サーバーのポート設定

`white-list=off`
ホワイトリストの有効化設定
これをonにすると`/whitelist add <プレイヤー名>`で追加したプレイヤーしか入れなくなります。

`announce-player-achievements=on`
実績を解除した時にサーバーにいるプレイヤーにお知らせを流すかどうかの設定です。

`spawn-protection=16`
op以外がリスポーン地点からの地形編集が出来ない範囲の設定です。

`max-players=20`
サーバーへ入れる最大人数の設定です。

`allow-flight=off`
FlyKickの有効化設定
onにするとFlyHackの自動Kickを無効化します。

`spawn-animals=on`
動物のスポーンの有効化設定です。

`spawn-mobs=on`
Mobのスポーンの有効化設定です。

`gamemode=0`

|番号|モード|
|:--:|:--:|
|0|サバイバルモード|
|1|クリエイティブモード|
|2|アドベンチャーモード|
|3|スペクテイターモード|

`force-gamemode=off`
このオプションを有効化するとプレイヤーのゲームモードが毎ログイン時に`gamemode=`で設定したゲームモードに変更されます。

`hardcore=off`
ハードコアの有効化設定です。
有効化すると、プレイヤーの死亡時にサーバーからBanされます。

`pvp=on`
PvPを許可するかの設定です。
onにすると他のプレイヤーを攻撃することが可能です。

`difficulty=1`
難易度の設定です。0〜3の値が設定可能です。

`generator-settings=`
ジェネレーターの設定です。

`level-name=world`
デフォルトワールド名の設定です。

`level-seed=`
デフォルトワールドのシード値の設定です。

`level-type=DEFAULT`
新規に生成するワールドのタイプです。
以下のタイプが設定できます。

|タイプ|詳細|
|:-:|:-:|
|DEFAULT / NORMAL|ノーマルな地形|
|FLAT|フラットな地形|
|HELL / NETHER|ネザー|

`enable-query=on`
サーバーのクエリの有効化設定です。
クエリを有効化すると、外部ツールを用いてサーバーにいる人数やバージョン、サーバーにいるプレイヤー名などの情報が取得できます。

`enable-rcon=off`
Rconの有効化設定です。
Rconを有効化すると、外部のサイトやツール等を利用してサーバーの管理を行うことが可能です。

`rcon.password=abcd1234`
Rconのパスワードの設定です。
Rconを有効化する時にのみ設定します。

`view-distance=8`
チャンクの描画距離です。
例 : `view-distance=12`
上記の場合、12チャンク分クライアントに送信されます。

`xbox-auth=on`
サーバ参加時にXBox認証を行うかの設定です。

## ポート解放
今回は、ポート解放に**ufw**を使用します。

```console:ufwのインストール(apt)
$ sudo apt install ufw
```

次に、解放するポートの設定を行います。

```console
$ sudo ufw default deny
$ sudo ufw allow 22
$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo ufw allow 19132/udp
```
特にVPSなどを利用している方は22番ポートの解放を忘れると、**SSH接続が出来なくなる**ので注意が必要です。

最後に、ufwを有効化します。

```console
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
```
**y**と入力し、有効化します。

これで全ての設定が終了です。

## バックグラウンドで動かしたい場合

VPSでサーバーを立てている方は、上の場合、SSH接続が切れた時にマインクラフトのサーバーへ接続できなくなります。
そのような時に便利なのが**screen**です。

```console
$ screen -S pmmp
```

で新しいセッションを作成。

```console
$ screen -r pmmp
```

で作成したセッションにアタッチします。

screenコマンドが無い場合 :

```console:screenのインストール(apt)
$ sudo apt install screen
```

セッションにアタッチした状態でサーバーを起動すると、SSHが切れた場合も継続的にプログラムを動作させることが出来ます。

# 最後に
今回のPocketMine-MPでのサーバー作成はどうでしたか？
この記事を見てPocketMine-MPに少しでも興味を持ってくれたら嬉しいです！