らずぱい３で、MinecraftPEサーバ + Wifi-AP

![MinecraftPE-v1.1.0.PNG](https://qiita-image-store.s3.amazonaws.com/0/75594/3980983a-b107-a2e1-dcbb-5d8c5eac579d.png)

\# pmmp.ioのコードをgit cloneして使ってるので、うまいpharがでたら、記事をちょいと直します。

## 概要
- Raspberry Pi 3に
    - Pocketmine-MPベースのMCPEサーバソフトを入れ、
    - 無線アクセスポイントにしてしまう<br>=> 直接、ラズパイにつなぐ
- 無線アクセスポイントにするのに、pi-holeを使って、dhcpサーバをさせる
=> 広告除去付 Wifi-APになる!
- もしかして、バッテリー駆動させれば、モバイルMCPE鯖になる???(未確認)　... ちゃんとシャットダウン処理しないと、データおかしくなるよな。

- サイト
    - [PMMP](https://pmmp.io/) - Server software for Minecraft Pocket Edition written in PHP
    - [ BlueLight](http://bluelight.cf/)はMinecraft: Pocket Editionサーバーソフトウェアです
- pmmp.ioは、最新のもの(1.6.2dev-110)で `Minecraft: PE server version v1.1.0.55`となったが、エラー(`[Server thread/CRITICAL]: InvalidArgumentException: "Inventory slot index "255" is out of range" (EXCEPTION) in "/src/pocketmine/inventory/PlayerInventory" at line 117`)でログインできなかったりして、
- BlueLight (v1.0.9)をインストールが、こっちもだめ、、
- pmmp.ioのgithubのコードが[修正された](https://github.com/pmmp/PocketMine-MP/commit/31e2c1d26c4333fc9e60b9bdbe08a1d45dfec3fa)ので、これを使用する。

## 環境
- サーバ
    - Raspberry Pi 3
    - Raspbian : `2017-04-10-raspbian-jessie-lite`
    - Wifiはアクセスポイントに使うので、有線側がインターネットにアクセスできて(ファイルとかダウンロードする)、おうちのPCからsshログインできるようにしておこう.
- クライアント
    - iOS: Minecraft Pocket Edition (通称:MCPE) `v1.0.9`
    - Windows 10: Minecraft: Windows 10 Edition 

## 手順
### 下準備
- [いつも通り](http://qiita.com/mt08/items/edefa35a7cefc726379e)に、RaspbianイメージをSDに焼いて、`ssh`ファイルを作成し、ラズパイに挿して、起動。
- sshでログインして、こぴぺとか多いので、設定すると、らくかも。(ToDo: 一発スクリプトをつくる...)

### PocketMine-MP のインストール
1. インストール

    ```bash:コピペ
DIR_PMMP=/home/pi/pocketmine
mkdir -p $DIR_PMMP
cd $DIR_PMMP
sudo apt update && sudo apt install -y build-essential git autoconf libtool-bin && curl -sL https://get.pmmp.io | sed -e 's@BCM270\[89\]@BCM@' | bash -s -
#
```

    ```bash:pmmp.ioのコードをクローン
DIR_PMMP=/home/pi/pocketmine
if [ -d $HOME/PocketMine-MP/.git ] ; then sh -c 'cd $HOME/PocketMine-MP && git pull && git submodule update'; else sh -c 'cd $HOME && git clone https://github.com/pmmp/PocketMine-MP && cd $HOME/PocketMine-MP && git submodule update --init'; fi
cp -r $HOME/PocketMine-MP/src $DIR_PMMP
#
```

    ```bash:BlueLightをダウンロード
# BlueLightもダウンロード (Build#770は、v1.0.9)
# curl -L -O http://jenkins.haniokasai.com/job/BlueLight-PMMP/770/artifact/artifacts/BlueLight-PHP7.phar
# 最新ビルドは
curl -L -O http://jenkins.haniokasai.com/job/BlueLight-PMMP/lastSuccessfulBuild/artifact/artifacts/BlueLight-PHP7.phar
#
```


2. 初回起動: `./start.sh`
初回起動時、いろいろ聞かれるので、うまく設定していく。 

    ```bash
DIR_PMMP=/home/pi/pocketmine
cd $DIR_PMMP
# git cloneしたヤツを使う
./start.sh -f src/pocketmine/PocketMine.php
# 普通の PocketMine-MP.phar使用時は、
# ./start.sh 
# Bluelightを使用する場合
#./start.sh -f BlueLight-PHP7.phar
```
    - または

    ```bash:または、以下コピペして、30秒くらいしたら、Ctrl-Cを押して抜ける.19132の次の行の0を1にすると、クリエイティブモード
./start.sh -f src/pocketmine/PocketMine.php << EOF 
jpn
y
n
Minecraft: PE Server
19132
0
20
y
OPeratorPlayerName
n
n
n

    EOF
#
```
3. 設定後の起動

    ```bash:こぴぺ
cd /home/pi/pocketmine
./start.sh -f src/pocketmine/PocketMine.php
# ./start.sh 
# Bluelightを使用する場合
#./start.sh -f BlueLight-PHP7.phar
#
```

3. サービスとして登録する場合(電源ONで自動起動. サーバのコンソールは使えない)

    ```bash:以下コピペ
	DIR_PMMP=/home/pi/pocketmine
	PMMP_EXEC=src/pocketmine/PocketMine.php
	#PMMP_EXEC=PocketMine-MP.phar
	#PMMP_EXEC=BlueLight-PHP7.phar
	cat << EOF | sudo tee /etc/systemd/system/pocketmine.service
	[Unit]
	Description=PocketMine-MP MCPE Server

	[Service]
	User=pi
	# ExecStart=$DIR_PMMP/start.sh 1>/dev/null 2>&1
	# BlueLightを使うときはこっち.
	ExecStart=${DIR_PMMP}/start.sh -f ${DIR_PMMP}/${PMMP_EXEC} 1>/dev/null 2>&1
	WorkingDirectory=/home/pi
	Restart=always
	RestartSec=5s

	[Install]
	WantedBy=multi-user.target
	EOF

	sudo systemctl enable pocketmine
	sudo systemctl status pocketmine
	sudo systemctl daemon-reload
	sudo systemctl restart pocketmine
	sudo systemctl status pocketmine
#
```

	```bash:サービス登録をやめるとき
	sudo systemctl status pocketmine
	sudo systemctl stop pocketmine
	sudo systemctl disable pocketmine
	sudo systemctl status pocketmine
#
```

### Wifi-AP + DHCPサーバ(Pi-hole使用)
[コレ](http://qiita.com/mt08/items/ea3a5357c0c9c4ae121b)にそって設定する。

1. hostapdをインストール

    ```bash
sudo su -c 'apt update && apt upgrade -y && apt install hostapd -y'
```


2. wlan0 を固定IPに (192.168.42.1)、 hostapd と ip-forwarding　設定をして、再起動。
SSIDとPassphraseの設定(`WIFI_SSID`と`WIFI_PASS`)をして、こぴぺ。

	```bash:コピペ。一回だけだよ
	# SSIDとPassphraseの設定
	WIFI_SSID=Pi3-AP
	WIFI_PASS=raspberry
	###
	# Make sure hostapd is installed :)
	# sudo apt install hostapd -y 

	###
	# Unmanage: wlan0 by DHCPCD
	echo denyinterfaces wlan0 | sudo tee -a /etc/dhcpcd.conf

	###
	# Modify: /etc/network/interfaces
	sudo sed -i \
	-e 's/allow-hotplug wlan0/#allow-hotplug wlan0/g' \
	-e 's/iface wlan0 inet manual/#iface wlan0 inet manual/g' \
	-e 's@    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf@#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf@'  \
	/etc/network/interfaces

	cat <<EOF | sudo tee -a /etc/network/interfaces
	#
	# wlan0 - static IP 
	allow-hotplug wlan0 
	iface wlan0 inet static 
		address 192.168.42.1
		netmask 255.255.255.0
		network 192.168.42.0
		broadcast 192.168.42.255
	EOF


	###
	# Create: /etc/hostapd/hostapd.conf
	#  ssid/wpa_passphrase = Pi3-AP/raspberry
	#  you may modify them.
	cat <<EOF | sudo tee /etc/hostapd/hostapd.conf
	interface=wlan0
	driver=nl80211
	#driver=rtl871xdrv
	hw_mode=g
	channel=6
	ieee80211n=1
	wmm_enabled=1
	ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
	macaddr_acl=0
	auth_algs=1
	ignore_broadcast_ssid=0
	wpa=2
	wpa_key_mgmt=WPA-PSK
	rsn_pairwise=CCMP
	ssid=${WIFI_SSID}
	wpa_passphrase=${WIFI_PASS}
	EOF

	##
	# Edit: /etc/default/hostapd
	echo DAEMON_CONF=\"/etc/hostapd/hostapd.conf\" | sudo tee -a /etc/default/hostapd

	##
	# Setting: IP Forward
	sudo sed -i -e 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g'  /etc/sysctl.conf
	#
	sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
	sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
	sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
	sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
	#
	echo 'iptables-restore < /etc/iptables.ipv4.nat' | sudo tee /lib/dhcpcd/dhcpcd-hooks/70-ipv4-nat

	##
	# Reboot! 
	sudo reboot
	## 
	```
3. [pi-hole](https://pi-hole.net/)のインストール

    ```bash:こぴぺ。待つと、設定の画面が出てくる。
curl -L https://install.pi-hole.net | bash
```

4. \[Enter\] => \[Enter\] => \[Enter\] => ↓矢印キー => スペースキー => \[Tab\] => \[Enter\] と押して、`(*) wlan0 available`を選択<br>![PiHole04.png](https://qiita-image-store.s3.amazonaws.com/0/75594/5eed7ee2-e7d9-bfd7-75b7-d3b3aa50956b.png)
5. 適当なDNSプロバイダーを選んで、OK<br>![PiHole05.png](https://qiita-image-store.s3.amazonaws.com/0/75594/aa782304-4e8c-1322-f2b2-cb8b099152ce.png)
6. IPv6のチェックをはずして、OK<br>![PiHole06.png](https://qiita-image-store.s3.amazonaws.com/0/75594/5b6068fb-4534-4b1e-6d2a-70a4cbc6e543.png)
7. 有線側の設定がでてくるので、`<No>`を選ぶ。<br>![PiHole07.png](https://qiita-image-store.s3.amazonaws.com/0/75594/52acb573-7a38-af6e-204d-31a7607b9764.png)
8. `192.168.42.1/24` といれる<br>![PiHole08.png](https://qiita-image-store.s3.amazonaws.com/0/75594/20757572-8f0c-00a2-7f96-2f6984adbf44.png)
9. `192.168.42.1`と入れる<br>![PiHole09.png](https://qiita-image-store.s3.amazonaws.com/0/75594/19250b2e-4dec-3c46-0162-e54058b4632a.png)
10. 確認したら、`<Yes>`<br>![PiHole10.png](https://qiita-image-store.s3.amazonaws.com/0/75594/e42f8c61-5136-c934-882a-27552453f6f5.png)
11. あとは、`<Ok>` => `<Ok>` => `<Ok>` と進める。
12. コマンドプロンプトに戻ってきたら、`pihole -a -p` とやって、パスワードを設定する。<br>![PiHole15.png](https://qiita-image-store.s3.amazonaws.com/0/75594/a9501f96-79c8-15bc-eb5b-711bf3a34561.png)
13. 有線経由で、ラズパイにアクセスする。ブラウザを開いて、`http://<らずぱいのIPアドレス>/admin/settings.php`にアクセスする、パスワード聞かれるので、さっきのを入れる。<br>![PiHole16.png](https://qiita-image-store.s3.amazonaws.com/0/75594/a219a837-2ee2-1a7d-f743-fed8a7e4fb5c.png)

14. 開いたら、Pi-Hole DHCP Serverのとこで、 [v] DHCP server Enabled にチェックを入れて、\[Save\]を押す。<br>
![PiHole17.png](https://qiita-image-store.s3.amazonaws.com/0/75594/d268bb8c-f052-f8bb-3915-a10f23cb8b77.png)

15. 再起動: `sudo reboot`


### 接続
1. 再起動後、スマホなどのWifiへ接続する設定で、SSIDが見えるはず、なのでつなぐ。(例: SSID:`Pi3-AP` / パスワード:`raspberry`)
2. PocketMine-MPが自動起動するようになってなければ、手動で、起動させる。
3. Minecraft起動して、Friendsのとこから、LAN Gamesのとこに、サーバが出てくるはず<br>![MinecraftPE-v1.1.0.PNG](https://qiita-image-store.s3.amazonaws.com/0/75594/3980983a-b107-a2e1-dcbb-5d8c5eac579d.png)



## メンテナンス (TODO: そのうち...) 
1. pi-holeのアップデート
2. PocketMine-MPのアップデート

## トラブル??
1. なんかおかしい
    1. クライアントのバージョンが上がると、おかしくなった<br>=>今回も、記事を書いてる最中、おかしくなりました..(v1.0.9 => v1.1.0)
    2. サーバのバージョンが上がると、おかしくなった<br>=>今回も、記事を書いてる最中、おかしk...

    => 自動起動をやめて、コンソール開いて、そこから、サーバを起動させると、いろいろメッセージがみれるかと...

2. pluginがバージョンチェックではじかれる..
	- gitでクローンしたのを使ってるなら、version checkを無効に...(ぉ. いいのか?!

	```diff:src/pocketmine/plugin/PluginManager.php
	$ diff -uprN src/pocketmine/plugin/PluginManager.php{.org,}
	--- src/pocketmine/plugin/PluginManager.php.org	2017-06-01 19:35:42.594662156 -0700
	+++ src/pocketmine/plugin/PluginManager.php	2017-06-01 23:06:13.641016261 -0700
	@@ -246,7 +246,7 @@ class PluginManager{
									break;
								}
	 
	-							if($compatible === false){
	+							if(0 && $compatible === false){
									$this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.loadError", [$name, "%pocketmine.plugin.incompatibleAPI"]));
									continue;
								}
	$ 
	```


## その他
1. ピストンブロックとか、使えないよね。
2. (メモ)swap消して、/var/log/あたりをtmpfsにしてる場合

    ```shell-session:cronを使って、起動時にlighttpdのフォルダ作成
$ sudo crontab -l | grep reboot
@reboot /home/pi/atstartup.sh
$ cat /home/pi/atstartup.sh 
#!/bin/bash
mkdir /var/log/lighttpd
chown www-data:www-data /var/log/lighttpd
```

3. (メモ) shutdown/rebootさせるURLみたいなの。セキュリティ無し。

	```bash:こぴぺ
	# メインページ
	echo '<html><a href="shutdown-h.php">Shutdown</a><br><br><br><a href="shutdown-r.php">Reboot</a></html>' | sudo tee /var/www/html/shutdown.html
	# shutdown スクリプト
	echo "<?php system('sudo /sbin/shutdown -h now'); ?>" | sudo tee /var/www/html/shutdown-h.php
	echo "<?php system('sudo /sbin/shutdown -r now'); ?>" | sudo tee /var/www/html/shutdown-r.php
	#
	# www-dataにsudo shutdownを使えるようにする
	echo 'www-data ALL = NOPASSWD: /sbin/shutdown' | sudo tee /etc/sudoers.d/www-shutdown
	# 
	```
	- wifi-APに接続してるなら、`http://192.168.42.1/shutdown.html` にアクセス