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

[Minecraft]:https://www.minecraft.net/ja-jp

WSL2の真骨頂

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

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


[Minecraft]触るのは何年ぶりだろう。
(ボートがぶつかるとすぐ壊れてた頃)
創った建築物をクリーパーに破壊されて辞めたのは覚えてる。

久々に触ってみようということになり、
どうせなら複数サーバーでサーバー間移動できるようにしておきたいと、
[Minecraft]サーバーを立てる遊びを始める
(なにやってんねん (･ω･) )

折角WSL2が入ってるし、
Linux上にインストールしてみよう。
ビルドがいるらしいからdocker使おう。
MODも使えるようにしよう。
サーバーも複数立てれるようにしよう。
と仕様が欲張りになり、
時間だけが過ぎていくことに。

なんとか形になったからここに残す。


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

## 事前準備

[Minecraft]をインストールするのは当然。
Java Edition(Windows版)でいいと思う。
(無料じゃないよ!)

WSL2とUbuntu、dockerが入ってるのが前提
この辺でも見て入れといて。

[WSL2+docker+PHPのWindows開発環境構築(1) WSL2編](https://qiita.com/dozo/items/9d9e958d4acefffb3fb8)
[WSL2+docker+PHPのWindows開発環境構築(2) docker編](https://qiita.com/dozo/items/17d0ebfb05bb4446caed)


PowerShellから以下のようにコマンドが通れば成功

```shell-session
PS C:\> wsl -d Ubuntu-20.04
$ docker --version
Docker version 19.03.13, build 4484c46d9d
```

データ保存用にディレクトリを切っておく

```
$ mkdir ~/minecraft_data
```

## dockerからコンテナ生成

SpigotというサーバーMODがあるそうな。
（よくわかってない）
spigotのdockerは別のが見つかるが、
よく使われる方にパラメータだけで設定できそうだからこちらを採用

[itzg/minecraft-server](https://hub.docker.com/r/itzg/minecraft-server)

```
$ docker run -d -v ~/minecraft_data:/data -p 25565:25565 -e TYPE=SPIGOT -e EULA=TRUE --name mc itzg/minecraft-server
# プラグイン指定 -e MODS=http://hogehoge.com/plugin01.jar,http://hogehoge.com/plugin02.jar
# シード値指定 -e SEED=7314490960418706833
```

起動はすぐだけど、
追加のダウンロードとかバイオーム生成とか諸々かかるので、
3分ぐらい待つ
( ˘ω˘ )ｽﾔｧ…

## 起動確認

[Minecraft]を起動してMultiplayerから「Direct Connection」で接続を試す。

![Minecraft 1.16.3 2020_10_09 9_04_25_r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40697/40a4c470-077e-f025-697f-7fac23679b2d.png)

![Minecraft 1.16.3 2020_10_09 9_04_13_r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40697/84e8c5e9-92e4-8b0c-5363-bd5e66dbad8d.png)

![Minecraft 1.16.3 2020_10_09 9_14_31_r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40697/f521a875-3a3b-6d41-1b02-5907ded90453.png)


接続を確認してみる。

![Minecraft 1.16.3 - Multiplayer (3rd-party Server) 2020_10_09 15_32_31_r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40697/97c59a13-8778-cbf5-cf65-86a814ff7fff.png)


よしログインでけた (`・ω・´)ｷﾘｯ

## 別ワールド生成

### プラグイン追加

プラグインに関する詳細説明は後書きにするとして、
ここでは必要な分だけ書いておこう。

```
$ docker stop mc
$ cd ~/minecraft_data/plugins
$ wget http://ci.onarandombox.com/job/Multiverse-Core/Release%20Build/artifact/target/Multiverse-Core-4.2.2.jar # マルチワールド管理
$ wget http://ci.onarandombox.com/job/Multiverse-Portals/Release%20Build/artifact/target/Multiverse-Portals-4.2.0.jar # ワールド間移動
$ wget https://ci.lucko.me/job/LuckPerms/lastStableBuild/artifact/bukkit/build/libs/LuckPerms-Bukkit-5.1.107.jar # プラグイン権限管理
$ docker start mc
```

( ˘ω˘ )ｽﾔｧ…

( ﾟдﾟ)ﾊｯ!

### プラグイン権限調整

ユーザー名をDozoとすると

```
$ docker exec -i mc rcon-cli
> lp user Dozo permission set luckperms.* true
> lp user Dozo permission set minecraft.command.* true
> lp user Dozo permission set multiverse.* true
> ^C (ctrl+c)
```

コンソールからは無反応だがユーザー名さえ間違ってなければこれでよい

マイクラにログインして以下のコマンドを実行

```
/gamerule doDaylightCycle false
```
実行できていれば成功
これは時間停止コマンドで作業中に夜が来てゾンビにやられることを防げる


### ワールド生成

すべての準備ができたのでワールド生成といこう。
rcon-cli上でも生成はできるが、
実感が薄いのでマイクラ上で行う

```
/mv create asset NORMAL
Starting creation of world 'asset'...
Complete!
```

これでassetという名称の新しいワールドが生成された
移動は以下のコマンド

```
/mvtp asset
```

試しにネザーを創って移動してみると

![Minecraft 1.16.3 - Multiplayer (3rd-party Server) 2020_10_10 12_58_03_r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40697/08449923-9af3-fd48-2d1a-ae86da782497.png)

よし！成功だ！ (`・ω・´)ｷﾘｯ


とりあえず形にはなったので、
あとは細かい設定だけだな。

[docker経由でMinecraft資源(Spigot)サーバーを立てる(2)](https://qiita.com/dozo/items/392fceb255ac55ce501b)




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

## プラグイン設定

保存用ディレクトリにpluginsというのがあるが、
ここにビルド済みのプラグインファイル(jar)を置くことで、
プラグインを追加することができる
記事の頭の方にちょろっとあった**データ保存用ディレクトリ**がここで利いてくる。

cloneしてmavenでビルドという流れだが、
ビルド済みなものを直接使う方が簡単でいい。

書くプラグイン製作者はJenkinsを公開しているようで、
そちらから拝借しよう。
その際、最新のビルドではなく***安定のビルド***から取得

![Multiverse-Core [Jenkins] - Vivaldi 2020_10_09 12_43_58_rr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40697/3d7a82f1-445a-1913-72a3-42a1533dc967.png)


#### マルチワールド
Multiverse

>Multiverse was created at the dawn of Bukkit multiworld support. It has since then grown into a complete world management solution including special treatment of your nether worlds with Multiverse NetherPortals.

>In the second delivery of Multiverse, we've broken it up into several smaller plugins that are each feature packed but not bloated! Multiverse provides the easiest to use world management solution for your Minecraft server, big or small, and with great addons like Portals and NetherPortals, what's not to love!

> Multiverse is here and works for the latest server build! Is your server a Multiverse?
> https://dev.bukkit.org/projects/multiverse-core/

複数のサーバーを管理するプラグイン。ワールドの作成、再生成、サーバー間の移動など複数サーバーによるメリットを享受することができる。
各種プラグインは

|名称|詳細|Jenkins URL|
|:-----------|:------------|:------------|
|Multiverse-core|マルチサーバーのコアシステム|http://ci.onarandombox.com/view/Multiverse/job/Multiverse-Core/|
|Multiverse-Portals|サーバー間移動のポータルを構築|http://ci.onarandombox.com/view/Multiverse/job/Multiverse-Portals/|
|Multiverse-NetherPortals|ネザーゲートを使ったサーバー間移動|http://ci.onarandombox.com/view/Multiverse/job/Multiverse-NetherPortals/|
|Multiverse-SignPortals|看板を使ったサーバー間移動|http://ci.onarandombox.com/view/Multiverse/job/Multiverse-SignPortals/|
|Multiverse-Inventories|サーバー間のインベントリ管理|http://ci.onarandombox.com/view/Multiverse/job/Multiverse-Inventories/|

どうせなら全部入れとくか。

```
$ cd ~/minecraft_data/plugins
$ wget http://ci.onarandombox.com/job/Multiverse-Core/Release%20Build/artifact/target/Multiverse-Core-4.2.2.jar
$ wget http://ci.onarandombox.com/job/Multiverse-Portals/Release%20Build/artifact/target/Multiverse-Portals-4.2.0.jar
$ wget http://ci.onarandombox.com/job/Multiverse-NetherPortals/Release%20Build/artifact/target/Multiverse-NetherPortals-4.2.1.jar
$ wget http://ci.onarandombox.com/job/Multiverse-Inventories/Release%20Build/artifact/target/Multiverse-Inventories-4.2.1.jar
```

ワールド生成のパラメータはこちら
https://github.com/Multiverse/Multiverse-Core/wiki/World-properties

コマンドはマイクラ上かRCON上で。

```shell
$  docker exec -i mc rcon-cli
> mvlist
§d====[ Multiverse World List ]====
§fworld§f§f - §aNORMAL
§fworld_the_end§f§f - §bTHE_END
§fworld_nether§f§f - §cNETHER

> mv create asset NORMAL
Starting creation of world 'asset'...
Complete!

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

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

> mv modify add creeper monsters asset
§aSuccess! §bcreeper§f was §cremoved from §amonsters

> mv create farm NORMAL -t FLAT
Starting creation of world 'farm'...
Complete!

> mv modify set gamemode creative farm
§aSuccess!§f Property §bgamemode§f was set to §acreative

> mv modify set difficulty hard farm
§aSuccess!§f Property §bdifficulty§f was set to §ahard

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

#### サーバー管理

LuckPerms

>LuckPerms is a permissions plugin for Minecraft servers. It allows server admins to control what features players can use by creating groups and assigning permissions.
>https://luckperms.net

サーバーの権限などを管理するプラグイン

|名称|詳細|Jenkins URL|
|:-----------|:------------|:------------|
|LuckPerms||https://ci.lucko.me/job/LuckPerms/|



```
$ cd ~/minecraft_data/plugins
$ wget https://ci.lucko.me/job/LuckPerms/lastStableBuild/artifact/bukkit/build/libs/LuckPerms-Bukkit-5.1.107.jar
```

LuckPermsプラグインはデフォルトで管理ユーザーを設定していないので、
再起動後、minecraftコンソールにアクセスしてユーザー登録をする。
ユーザー名をDozoとすると

```
$ docker restart mc
$ docker exec -i mc rcon-cli
> lp user Dozo permission set luckperms.* true
ctrl+C
```
バグなのかわからないが入力しても反応はないが、
ちゃんと機能はしている。
動作確認をするためクライアントで接続する

```
/lp editor
```
![Minecraft 1.16.3 - Multiplayer (3rd-party Server) 2020_10_09 20_50_45_r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40697/11f4be55-277d-17b5-25f2-3a360ab1b7f6.png)

記載のURLをクリックしてアクセスするとパーミッション変更のWeb UIに移動するので、
各種設定を行うことができる。
とりあえずこのぐらい設定して微調整という感じで。

|グループ名|権限|
|:-----------|:-----------|
|Admin|minecraft.command.ban minecraft.command.pardon some.cool.admin.perm someplugin.vanish|
|Mod|minecraft.command.mute minecraft.command.unmute some.cool.mod.perm chatcolor.bold|
|Default|minecraft.command.say minecraft.command.me|


参考:
[Using WSL2 in a Docker Linux container on Windows to run a Minecraft Java Edition](
https://techcommunity.microsoft.com/t5/windows-dev-appconsult/using-wsl2-in-a-docker-linux-container-on-windows-to-run-a/ba-p/1482133)