docker経由でMinecraft資源(Spigot)サーバーを立てる(2)

[Minecraft]:https://www.minecraft.net/ja-jp
[Multiverse-Portals]:https://dev.bukkit.org/projects/multiverse-portals/
[Multiverse-NetherPortals]:https://dev.bukkit.org/projects/multiverse-netherportals/
[Multiverse-SignPortals]:https://dev.bukkit.org/projects/multiverse-signportals/
[Multiverse-Inventories]:https://dev.bukkit.org/projects/multiverse-inventories/
[Spigot]:https://www.spigotmc.org
[Paper]:https://papermc.io/downloads

どうせ創るのは豆腐ハウスだけどな！

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

関連記事:
[docker経由でMinecraft資源(Spigot)サーバーを立てる](https://qiita.com/dozo/items/c68d1c8d955f04c657fa
)



------------------- ↓ 余談はここから ↓-------------------

[Minecraft]サーバーを建てて実際に運用してみると、
調整事項がいっぱいある。

通常ワールドの難易度、
資源サーバーの天候やモンスターの出現状態、
クリエイティブなら時間状態など。

複数人参加を考えるなら、
コマンド実行権限、行動範囲領域、
そのサーバーは採取可能にするのか、
荒し対策はするのかなどなど。



今回はインストール後の調整事項を列挙していこう。

----
------------------- ↓ 本題はここから ↓-------------------

## 複数ワールド

#### 通常ワールド

configを変更していなければデフォルトの難易度はEASY。
好みの問題かもしれないが難易度はNORMALにしておきたい。
(hardモードって大して面白くない)
ネザーやエンドは設定が別になっているので、
併せて設定を変える。

|設定項目|設定値|詳細|
|:----|:----:|:---|
|difficulty|normal|まぁ、normalで|


```
$ docker exec -i mc rcon-cli
> mv modify set difficulty normal world
§aSuccess!§f Property §bdifficulty§f was set to §anormal
> mv modify set difficulty normal world_nether
§aSuccess!§f Property §bdifficulty§f was set to §anormal
> mv modify set difficulty normal world_the_end
§aSuccess!§f Property §bdifficulty§f was set to §anormal
```


#### 資源サーバーの設置

資源サーバーは基本的にリセットするもの。
リセットすると取ったモノは元に戻り、造ったモノは消える。
となるとポータルとか苦労して造っても消えてしまう。
なんかいい方法はないかな。
(まだ答えは出てない)
(あ、ワープ専用のワールド作ればいいのか)

あと、竹とか雪、海など特定のバイオームがスポーン地帯から近い方がいいので、
シード値も設定しておきたい

設定内容は

|設定項目|設定値|詳細|
|:----|:----:|:---|
|weather|false|天候は晴れのままにしたい|
|monsters|false|モンスターは沸かない方がいい|
|hunger|false|空腹はなしの方向|
|doDaylightCycle|false|時間は固定にしたい|

こんな感じかしら


```
$ docker exec -i mc rcon-cli
> mv create asset NORMAL -s 3116934447057457676
Starting creation of world 'asset'...
Complete!

> mv modify set weather false asset
§aSuccess!§f Property §bweather§f was set to §afalse

> mv modify set hunger false asset
§aSuccess!§f Property §bhunger§f was set to §afalse

> mv modify set monsters false asset
§aSuccess!§f Property §bmonsters§f was set to §afalse

> mvrule doDaylightCycle false asset
§aSuccess!§f Gamerule §bdoDaylightCycle§f was set to §afalse§f.
```


#### 農場サーバーの設置

各種農場、トラップでアイテムを増殖させたいのだが、
通常ワールドにそれがあるとつまらないのと、
mobやエンティティが増えるとサーバーが重くなるので、
ワールドごと別にしたい。
そこでファームサーバーを用意する
(人がいなければ時間が止まるのでそこが悩みどころ)

制作はクリエイティブモードで運用はサバイバルモード。

設定内容は

|設定項目|設定値|詳細|
|:----|:----:|:---|
|gamemode|creative|クリエイティブモードにする|
|difficulty|hard|湧きモンスは多種多様の方がいい|
|weather|false|天候は晴れのままにしたい|
|hunger|false|空腹はなしの方向|
|doDaylightCycle|false|時間は固定にしたい|

こんな感じかしら

```
$ docker exec -i mc rcon-cli
> mv create farm normal
> mv modify set gamemode creative farm
> mv modify set difficulty hard farm
> mv modify set weather false farm
> mv modify set hunger false farm
> mvrule doDaylightCycle false farm
```


#### 実験サーバーの設置

サバイバルで設置する建物や回路を実験するためのサーバーが欲しい。
ローカルでやってもいいけど、
せっかくなので実験サーバーも用意する。

```
$ docker exec -i mc rcon-cli
> mv create test NORMAL -t FLAT
Starting creation of world 'test'...
Complete!
```



#### サーバーインポート

実験サーバーや農場サーバーは新規のワールドごとに作り直すのが面倒なので、
創ったサーバーのワールド情報をインポートする

```
$ cp -R ~/minecraft_data/old_world/test ~/minecraft_data/new_world/
$ docker exec -i mc rcon-cli
> mvimport test NORMAL
Starting import of world 'test '...
§aComplete!
```


#### 行動範囲制限

ご存じの通り遠くに移動すればするほどサーバーのサイズが大きくなる。
これを使って荒らすやつとかもいるようで。
（よー知らんけど）

それはさておき、
無駄にサイズがでかくなるとか、
重くなるとかは避けたいので、
範囲制限だけ付けて様子を見ておく。

以前はプラグインで設置していたようだが、
今は標準コマンドがあるらしい。

```
$ docker exec -i mc rcon-cli
> lp user Dozo permission set minecraft.command.* true
```

マイクラ上で以下のコマンドを実行。
とりあえず1万ブロックにしとくか

```
/worldborder set 10000
```

どのくらいが妥当なのかよーわからん (･ω･)

#### ワールドポータル作成

ワールド間の移動はデフォルトではコマンド入力。
ユーザーがログイン状態の時にコマンドを入力することで行き来できる。
ただ、ユーザー側にコマンド権限を与えるか、
サーバー管理者が都度入力するのは現実的ではないので、
権限を渡さずにユーザーに移動を任せたい。

そんな時に使うのが **[Multiverse-Portals]**

権限を持っているユーザーが実際に[Minecraft]上でネザーゲートのような構造物を建築。
特定のアイテム(デフォルトでは木の斧)でポータルを設定する。

前提としてポータルを作成するユーザーに[Multiverse-Portals]の権限を付与しておく

```
$ docker exec -i mc rcon-cli
> lp user Dozo permission set multiverse.* true
```

資源ワールドをasset, 通常ワールドをworld、ゲートをそれぞれgate_ワールド名とすると。

1. 通常ワールドにてネザーゲートのような形の構造物を作成（素材はなんでもいいが壊されにくい物で）
2. 「/mvp wand」と入力し、木の斧を入手。
3. 木の斧を装備してゲートの角にあたるブロックを左クリック
4. 対角線上反対側のブロックを右クリック
5. 「/mvp create gate_world」でポータルと認識される
6. 資源ワールドに移動して1～4を実行
7. 「/mvp create gate_asset p:gate_world」で通常ワールドと繋がったポータルと認識される
8. 「/mvp select gate_world」と入力
9. 「/mvp modify dest p:gate_world」と入力

(なるほど。わからん。 (･ω･))

行き先は必ずしもゲートにする必要はなく、
ワールド指定すればスポーン地点に移動するし、
座標を指定することもできるようだ。

ワールドを経由すればファストトラベル(ショートカット)も作れそうだな。
やっぱりマリオの土管風に造る感じだろうか。

権限を持っているユーザーは木の斧で木を切れなくなるので注意
権限が外れると使えるようになる。

[クリエイティブモード](https://minecraft-ja.gamepedia.com/%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96)だとブロックを破壊するので、
[サバイバルモード](https://minecraft-ja.gamepedia.com/%E3%82%B5%E3%83%90%E3%82%A4%E3%83%90%E3%83%AB)に切り替えておく。
([スペクテイターモード](https://minecraft-ja.gamepedia.com/%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%86%E3%82%A4%E3%82%BF%E3%83%BC)とかの方がいいのかな？)

参考:
https://w.atwiki.jp/minecraftdevip/pages/31.html

#### ワールド間移動時のインベントリ維持

ワールド移動すると気がつくが、
手持ちの荷物がリセットされている。
これはポータル越しに移動してもそうなっている。

荷物を保持して行き来できなければ資源サーバの意味がない。
そんな時に使うのが **[Multiverse-Inventories]**
手持ちの荷物を保持したまま行き来することができる

プラグインを設置した段階で、
defaultという名称の設定がされていてるので、
追加のサーバーも加えておく。

```
> mvinv addworld asset default
```

※一度ワールドに行ってから設定した方がいい

#### ワールド間のmob移動

##### [Multiverse-NetherPortals]を使う方法(初心者向け)

資源サーバーはモブの移動ができないという思い込みがまかり通っているが、
正確にはmvtpで移動できないというだけのこと。
Multiverse-Portalはmvtpのインタフェースなだけなので友好的Mobや敵対的Mobは移動できないが、
別の方法であれば移動できる

そんな時に使うのが **[Multiverse-NetherPortals]**

これはワールド間の移動をネザーゲートを使って移動するものだが、
通常のネザーゲートと同等の機能を持っている。
友好的にした狼をゲートにくぐらせたり、
中立的mobをリードで引き連れたりもできる。
敵対的mobが勝手にゲートをくぐってくることも普通にあるので注意。

作り方は**[Multiverse-Portals]**よりも簡単

資源ワールドをasset, 通常ワールドをworldとすると

1. 黒曜石と火打石と打ち金でネザーゲートを作る
2. 「/mvnp link world asset」と入力
3. ネザーゲートをくぐる(assetワールドに到着し自動的にネザーゲートができる)
4. assetワールド側で「/mvnp link asset world」と入力しネザーゲートをくぐる

これで双方向に移動ができる

##### [Multiverse-SignPortals]を使う方法(上級者向け)

上記、[Multiverse-NetherPortals]を使う方法を書いたが、
最大の欠点がある。

それは、 **ネザーに行けなくなる** ことだ。

ワールドに設置したネザー(エンド)ゲートすべてが対象になるので、
設定を解除しない限りネザーに行けなくなってしまう。
それを解決するのが**[Multiverse-SignPortals]**
[Multiverse-NetherPortals]と違って扱いが少し難しい

https://github.com/Multiverse/Multiverse-Core/wiki/RedstoneTeleporting-(SignPortals)

[ここ](https://github.com/Multiverse/Multiverse-Core/wiki/RedstoneTeleporting-(SignPortals))に看板を使ったmobの移動方法が書いてあるのだが、
滅茶苦茶わかりにくい(なんか英語も変だし)


以下のようにゲートっぽい枠と看板を設置その横にボタンを配置する
一緒にジャンプするワンちゃんもセット。

![2021-01-19_22.46.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40697/6d6f15b1-3b8b-a8d3-f01e-84a56b2df50a.png)

ボタンを押すと

![2021-01-19_22.47.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40697/ea6877ff-f319-0fd9-0c15-babf84f026f5.png)

めっちゃ雨降っとる( ﾟДﾟ;)

見づらいので帰りの看板を拡大してみると

![2021-01-19_22.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40697/983e8f9c-57b0-5509-c109-089439eeef0f.png)

```text
[ALL:5:DOWN]
[mv]
world
```
と記述してある。
一行目は対象mob:範囲ブロック数:方角
二行目はmvで固定
三行目は目的のワールド名である

ゲートみたいな枠は別に必要なく(わかりやすくしたのと試行錯誤した結果なだけ)
看板があり、レッドストーン信号(ボタンやスイッチなど)が受けられる位置にあればよい。


----
------------------- ↓ 後書はここから ↓-------------------

## [Paper]サーバー

今回使用したdocker image(itzg/minecraft-server, 多分公式)では利用できるサーバーを選択できる

 * [Vanilla](https://www.minecraft.net/ja-jp/download/server)
 * [Bukkit](https://getbukkit.org)/[Spigot]
 * [Paper]
 * [Tuinity](https://github.com/Spottedleaf/Tuinity)
 * [Magma](https://magmafoundation.org/)
 * [Mohist](https://github.com/Mohist-Community/Mohist)
 * [Catserver](http://catserver.moe/)

それぞれどのような特性があるのかよく知らない。

今回使用したのはサーバーは[Spigot]だが、
これの派生で軽量化された[Paper]に切り替えた。
一応[Bukkit](https://getbukkit.org)/[Spigot]のMod、プラグイン類はそのまま適用できるみたい。

```
$ docker run -d -v ~/minecraft_data:/data -p 25565:25565 -e TYPE=PAPER -e EULA=TRUE -e MAX_WORLD_SIZE=10000 -e DIFFICULTY=normal --name mcp itzg/minecraft-server
```

ちなみに全ワールド(ディレクトリまるごと)そのまま移行してみたが、
問題なく動いてるようだ。