（下書き）最新版マイクラでPythonによる自動建築（マイクラリモコン）をする

すみません、まだぜんぜん下書きですが、公開します。

今までmodでやっていたマイクラリモコンをプラグインに移行する話です。modだとマイクラのバージョン1.12.2と1.16.5にしか対応できていませんでしたが、プラグインで最新版まで対応できたよ、という話。mod開発では、1.13と1.17に壁があったんですよ。

プラグイン方式は、まだリポジトリが未整理です。この記事もどんどん書き換わっていきます。記事の分割、再構成まである。今の所、Windows向けになっていますが、追ってUbuntu、Mac対応も。


## マイクラリモコン？？　ナニソレ
コーディングして自動建築することをマイクラリモコン（minecraft remote）と呼んでいる。mod／プラグインでサーバーを建て、クライアントからつないでコマンドを送り込む仕組み。
マイクラ標準のRcon（Remote console）とは違うので注意。名前も仕組みも似ており実際のところ、ほとんどのことはRconでもできてしまう。ただ、マイクラチャットコマンドそのものなので、色々と都合が悪い。

### マイクラリモコンの歴史
#### 2012-2013年
Bukkitプラグインでスタート。マイクラバージョンは0.6.0あたりから。

https://github.com/zhuowei/RaspberryJuice

#### 2014年
ラズパイ1A（最初のラズパイ1Bの1年後発売）から無償版のマイクラがプリインストールされていたこともあって、古くからPython版、Scratch版のユーザーが多数存在した。マイクラバージョンは0.7.0あたりから始まって1.12.2で対応ストップ。

https://www.stuffaboutcode.com/p/adventures-in-minecraft.html

https://github.com/martinohanlon/mcpi?tab=readme-ov-file

https://github.com/scratch2mcpi/scratch2mcpi


#### 2021年
@panda531 さんによる改造modと改造Scratchによるもので、3年越しで1.12.2からジャンプして1.16.5に対応。しかもScratch3での対応は初めてのことで、「事件」だった。

https://qiita.com/panda531/items/a6dfd87bd68ba2601793

私が、そのmodに対応するPython側を準備したが、1.16.5への対応は世界でも一番早かったはず。ラズパイのMCPE用(MCPI)、Java版(MCJE)1.12.2用、1.16.5用のそれぞれに書かれたコードについて、主要部分はそのまま使えるように環境ごとの差異をなるべく吸収する、という目標で作ったプロジェクトであった。

##### 従来のもの（マインクラフトForge 1.12.2/1.16.5 x Scratch/Python）
https://github.com/Naohiro2g/minecraft_remote/blob/main/README_ja.md

**オマケ Unityで似たようなことをやるプロジェクト　Minecraft Remote for Unity**
    Unity 6でも一応動く。レンダリングのデフォルトが変わった（？）ため、見栄えが良くないのでUnity2022.3でどうぞ。C#によるサーバー／クライアントが動き、C#でマイクラ世界に描けたり、C#/PythonでUnity世界に描けたりするもの。

https://github.com/Naohiro2g/minecraft_remote_unity

#### 2024年

**プラグイン方式に移行してPython版が最新マイクラに対応。Scratch版もぜひ、実装したい。**　Scratchからはlocalhost（自分のPC）にしかつながらないようなので、そのままだと公開サーバーに参加することはできない。Pythonでプロキシサーバーをやるかな。

##### 新しいもの（マインクラフトJavaプラグインサーバー 1.18? - 1.21.4 x Python）
https://github.com/Naohiro2g/minecraft_remote_itkids/releases

自分のPCで動くサーバーでマイクラリモコンできるが、公開サーバーでもマイクラリモコンができるように考えて整備中。ただし、リモコンは「神の手」なので、誰かわからないまま何でもできてしまうという課題あり。

世界に参加しているプレイヤー（＝オンライン）だけがリモコンできる、リモコン内容をログに記録するなど考え中。ただ、根本的には、結果として荒らしのようなことがあったらバックアップからロールバックするしかない。現状は、参加履歴のあるプレイヤーはオフラインでもリモコンできる状態。さらにop権限レベルなどによって制限をつけるのは割と簡単か。あるいはLuckPermsと連携か。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/d357aeb6-3b22-da6e-38e2-025fb77e3500.png)


## 記事の構成

- 自分のPCでプラグインサーバー（PaperMC）を起動する
- （まだ書いてない）プラグインを使ってマイクラリモコンする
　Python開発環境としてVS Code / Git for Windows / pyenv(+ poetry)を設定

## 自分のPCでプラグインサーバー（PaperMC）を起動する

Javaが入れば、あとは割と簡単。普段は、SDKmanによるJavaインストールをガイドするが、ここでは、なるべく素のWindowsからの最短手順バージョンを示す。

### Javaインストール
Java 21 SDK を入れる。

このページから、

https://www.oracle.com/java/technologies/downloads/

JDK21のタブを開き、
**JDK 23　　▶ JDK 21 ◀　　　GraalVM for JDK 23　　GraalVM for JDK 21**

さらにWindowsのタブを開く。
**Linux　　macOS　　▶ Windows ◀**

**x64 Installer**　と書かれた、.exeのファイルをダウンロードして、ダブルクリックでインストール。（ jdk-21_windows-x64_bin.exe ）

（参考）
https://codeforfun.jp/how-to-install-java-jdk-on-windows-and-mac/
インストーラーで環境変数／pathは設定されるはずなので、そこは飛ばして大丈夫。

```
java -version
バージョンが表示されればオッケー。
```

### サーバー用フォルダ準備
PaperMCをダウンロードしてフォルダに収容する。
https://papermc.io/downloads/all  青いビルドの最新版
ファイルを複製し、paper.jarという名前に変える。

```
ドキュメンツ／PaperMC/
　　　　　　　  paper-1.21.4-144.jar  置いとく。使用中バージョンがわかるように。
　　　　　　　  paper.jar             上のファイルをコピペして名前を変える。
　　　　　　　  run.bat               起動スクリプト、あとで自分で作る。
　　　　　　　  eula.txt              あとで生成される。
　　　　　　　  server.properties     あとで生成される。
　　　　　　　  plugins/              あとで生成される。
　　　　　　　  ops.json              あとで生成される。
```

### 起動スクリプト run.bat
以下の2行をメモ帳の新規書類にコピペして「フォルダ構成」の場所にrun.batという名前をつけて保存。搭載メモリーが16GB以上あるなら、4Gを8Gにする。
```
java -Xmx4G -Xms4G -jar paper.jar 
pause
```
run.batのショートカットをデスクトップに作成しておく。

### 初回起動
run.batのショートカットをダブルクリック。
初回起動は必ず失敗するさだめ。黒い窓が開き、警告が出て停止。
```
Failed to load eula.txt
You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
```
#### EULA承諾
メッセージにもあるように起動失敗はEULA（End User License Agreement）への承諾がないためである。サーバーフォルダ内に生成されたeula.txtをメモ帳で開いて編集／保存する。
```
eula=false
↓ 編集
eula=true
```

#### プラグインを入れる（最初は無くてもオッケー）
（この項目は多分、別エントリーに移動します。）

同じくサーバーフォルダ内に生成されたpluginsフォルダを開き、プラグインを入れる。

##### オススメのプラグイン
- ViaVersion　https://modrinth.com/plugin/viaversion/changelog?l=paper
- ViaBackwards https://modrinth.com/plugin/viabackwards/changelog?l=paper
- BlueMap　https://modrinth.com/plugin/bluemap/changelog?l=paper
- WorldEdit　https://modrinth.com/plugin/worldedit/changelog?l=paper
- **マイクラリモコン** juicyraspberrypie-xxx.jar　https://github.com/Naohiro2g/minecraft_remote_itkids/releases/tag/v0.0.1


ViaVersionを入れておくと、クライアントがサーバーより新しいバージョンでもつながる。大概の場合、最新版1.21.5が出たけどサーバーはしばらく1.21.4で運用を続けないと、という期間があるので、そういうときに便利。

ViaBackwardsは、逆パターンで、クライアントがサーバーより古いバージョンでもつながる。何が嬉しいかというと、クライアント側で影modなどを入れたいときなど？

BlueMapは、あとで生成される、plugins/BlueMap/core.confを編集。これもマイクラのEULAの承諾作業。BlueMapはマイクラクライアントとして動いてワールドデータを直接読んで独自のレンダリングをするため。
```
accept-download: false
↓ 編集
accept-download: true
```
ウェブサービスが開始され、ここから見える。http://localhost:8100
**Chromeでタブを開きっぱなしにすると、猛烈にメモリー、CPUパワーを食うので要注意。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/a2c95216-896d-b155-c8cc-99c76e879c4a.png)

2D、3D、スペクテイターモードがあり、スペクテイターモードだと、マイクラのスペクテイターモードにかなり近いレンダリングができる。

https://u.pcloud.link/publink/show?code=XZemkR5Zqlbd6YoBI1FbhsLApw3bIY2LFICX

#### server.propertiesでパラメーター調整

日本語の情報も多いのでググってほしい。
ChatGPT／Copilotも詳しい、と思ったら、全然ウソばっかり。

gamemode=creative　プレイヤーが初めて参加するときの初期値
op-permission-level=2  デフォルトの4でも良いが、管理者以外は2が無難
view-distance=20　　描画距離、デフォルトは10＝160ブロック
描画距離はかなりCPUパワーを使います。マシンの性能に合わせて調節すること。
クライアント側での設定もある。

max-world-size=9984    デフォルトは29999984
ワールドの大きさ。デフォルトは3000万ｘ２＝6000万ブロック四方。
地球表面積の7.1倍で、広すぎるので小さくしている。
公開サーバーを作るときには考慮すべき。


### 2回めの起動

起動に成功すると専用のコンソールが開き、メモリの使用量グラフ、参加プレイヤーリスト、ログ表示を見ることができる。ログ表示の一番下がコマンド入力欄である。
起動のときのコマンドプロンプト画面と同じコンソール。

### クライアント（マイクラアプリ）からの接続

マインクラフトJava版「最新バージョン」（＝バニラ）を起動する。
影modなどクライアントだけに入れるmod入りバージョンでも大丈夫。
ViaBackwardsを入れているときは、使いたいmodが使えるバージョンまで下げても大丈夫。

マルチプレイで、「サーバーを追加」をします。

サーバー名：`ホームサーバー`　`PaperMC` など、自分が見分けるためのラベル

サーバーアドレス：
自分のPCの場合　`localhost`
LAN内の他のPCの場合　`192.168.1.11` のようなIPアドレス
IPアドレスを確認するには、ipconfigコマンドの出力から「IPv4 アドレス」の項目で。

#### コマンド
マイクラクライアントのチャット欄で使うコマンドとほぼ同じだが、「/」なしで。
```
op player_name    管理者設定　これをやらないとtpとかfillもできない。
stop          データ書き込み後、停止する。
reload        使っちゃダメ！　
restart       同じく。
```

**サーバー設定の変更を反映したいときに、reload、restartは使っちゃダメ！**
stopしてrun.batで再起動しよう。
各プラグインの設定変更を反映したい時は、各プラグインのreloadコマンドで。


**（厳重注意）サーバー停止は必ずstopコマンドで。**
サーバーを停止せずにコンソールウィンドウを閉じたり、PCをシャットダウンしたりすると、ワールドが壊れることが多い。