ScratchからJava版Minecraftを操作できる拡張機能作った

# 2025/5/6 追加

マイクラのバージョン1.20.1に対応したScratchとModを公開しました！

Scratchはこちら
https://takecx.github.io/scratch-gui/1-20-1/

Modはこちら
https://www.curseforge.com/minecraft/mc-mods/remote-controller/files/6498737

# はじめに

2020年度から小学校でプログラミング教育が必修化になり、私の子供もChromebookが配布されてプログラミング教育が始まるようです。
巷ではScratchとMinecraftを連携させたプログラミング塾のようなものが溢れているようですが、自分でも作れそうだったので作りました（我が子が喜んでくれれば満足です:joy:）
Java版のマイクラ（3000円）さえあれば誰でも無料で使えますのでぜひ使ってみてください:blush:
(統合版であれば[Code Connection for Minecraft](https://www.microsoft.com/ja-jp/p/code-connection-for-minecraft/9ppfpg2fg2qb?activetab=pivot:overviewtab)を使って同じようなことができそうですが、Java版で同様のことが実現できるはずです)

# 概要

- ScratchからMinecraftを操作できる拡張機能を作成した
- [GitHub Pages](https://takecx.github.io/scratch-gui/)で公開した
- Scratchから操作するためのModを開発して公開した

# マインクラフトの対応バージョン
- 1.12.2
- 1.16.5
- 1.20.1(new!)

# How to use（使い方）

1. Minecraft Java版の購入  
  MinecraftにはJava版と統合版というものが存在しています。  
  今回はJava版が必要なので、以下のリンクの内容を参考にしてJava版をインストールしてください。  
  [マインクラフトPC版のダウンロード方法!値段と購入方法を解説!](https://hinatanchi.com/minecraft-pc-kounyuu/)
1. `Forge`をインストール  
  今回はScratchからMinecraftを操作するために、Modを使用します。  
  Modを動作させるための前提としてForgeというものをインストールする必要があるのでインストールします。  
  インストールの詳細な方法については以下のページを参考にしてください。  
  [https://nj-clucker.com/games/minecraft-forge-mod-install/](https://nj-clucker.com/games/minecraft-forge-mod-install/)
1. `Remote Controller Mod`をインストール  
  以下のページで公開している`Remote Controller Mod`をインストールします。  
  [Remote Control Mod](https://www.curseforge.com/minecraft/mc-mods/remote-controller/files)
  1. 下図の`Download`ボタンをクリック
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/3294dc3f-5bc8-4f28-db32-64fee46229a9.png)
  1. ダウンロードされた`.jar`ファイルをForgeをインストールした後に作成したゲームフォルダの下にある`mods`フォルダに置く（※Forgeインストール後に一度もMinecraftを起動していない場合は`mods`フォルダが存在しないので、一度Minecraftを起動するか`mods`フォルダを作成してください）
  1. インストール確認  
  （Forgeが有効になっているMinecraftを起動して`Mods`をクリック）
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/ffeebce7-f0a9-b091-3586-52970e9377f7.png)
  （`Remote Controller`が表示されればOK）  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/a9de6850-19ea-62e2-091b-1cb57604e4ee.png)
1. [Scratch](https://takecx.github.io/scratch-gui/)にアクセスする  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/38268ca7-0803-64ab-e581-6bd066582e9d.png)
1. `Minecraft`用の拡張機能を追加する  
  （左下の`click here!`と表示されている部分をクリック）
  ![add_extension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/9eb84eef-e1d9-cbae-99b3-c94091a53b35.png)
  （最下部の`Minecraft`用の拡張機能を選択する）  
  ![choose_extension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/2ddc40e1-0515-02fc-9330-b1aaf48af8c6.png)  
  (下図のような表示になればOK)  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/edbc70a4-0601-3ac7-00cb-a2d4d5512f49.png)

1. あとは好きなようにブロックを追加して遊んでください:blush:


# できること

- チャット機能  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/138f5458-8d95-29d0-9117-5168fde5f48a.png)

  ![スクリーンショット 2021-03-29 10.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/9a11c319-3e9c-0eb4-0795-086ec2d0c9a2.png)

- ブロックを一つ置く（相対座標OK）  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/418f92ae-08b0-ca38-f774-ee43084e6a79.png)

  (before)
  ![2021-03-29_10.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/02238e84-6c61-51f8-c670-f3a4eaa76e47.png)

  (after)
  ![2021-03-29_10.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/32213947-36b8-b660-aac8-abb8c193c089.png)

  ※すべてのScratchブロックについて、座標を入力できる箇所には相対座標を入力することもできます。  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/f8a92e53-740e-e987-d0b9-fef53d1d38d5.png)

  ![2021-03-29_10.58.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/fd6f08a4-5050-758f-b9be-cdf8dd9ace75.png)

- ブロックを複数置く（相対座標OK）  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/6087f585-28f7-ed2e-ce3a-5ee501d74418.png)

  (before)
  ![2021-03-29_10.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/02238e84-6c61-51f8-c670-f3a4eaa76e47.png)

  (after)
  ![2021-03-29_11.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/9db23fe4-6d7f-ee33-2558-5977b52dc461.png)

- 周辺をリセットする
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/115cde33-387d-a08b-b392-b9b5b8828e4a.png)

  (before)
  ![2021-03-30_22.47.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/6c063c9d-788c-80ee-1383-187d32f6399d.png)

  (after)
  ![2021-03-30_22.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/6e6d522e-79dc-c22e-43da-b6e90ceb60ec.png)


- Mobを召喚する（相対座標OK）  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/d1fbe401-0c55-e05b-2a05-36889e446525.png)

  (before)
  ![2021-03-29_10.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/02238e84-6c61-51f8-c670-f3a4eaa76e47.png)

  (after)
  ![2021-03-29_11.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/148174bc-ee46-b613-040b-73657f44aadb.png)

- 現在位置を調べる  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/e43e152b-4446-31bf-0164-31677a279293.png)

  Minecraftにおけるプレイヤーの現在位置を調べてScratch上に表示することができます。

  (before)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/5adf0954-08c0-2156-f156-386e1afda7da.png)

  (after)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/f76dfd5c-0543-67f5-bf51-e913af049300.png)

  ※Scratch上に現在位置を表示するには、Scratch画面上の以下のチェックボックスにチェックを入れる必要があります。  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/02dd3d86-ee10-822d-b367-10b9bc05d95a.png)

- テレポート（相対座標OK）  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/e28e73d9-9065-1790-1f63-2d943bd46e73.png)

- 特定位置のブロックを調べる（相対座標OK）
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/b2fb1518-65a2-655f-b1ea-1e6856b67283.png)

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/27079c8d-d600-7f07-b6e6-7356dabffec2.png)

  ※Scratch上に現在位置を表示するには、Scratch画面上の以下のチェックボックスにチェックを入れる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/5d335c21-f448-932e-c70f-f8f12b55ae9b.png)

  ※特定位置のブロックを調べたあと、以下のScratchブロックを使って調べたブロックに従って条件分岐させることができます。  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/94890465-8aea-a601-8625-fd65c6696e60.png)

  (石の上を通ったら雨を降らせる例)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/14a25fe8-e8b1-20ae-af32-104ce239ad6a.png)

- 天気変更  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/7b3f5841-078f-d937-455d-73b79a0b30c5.png)

  (before)
  ![2021-03-30_22.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/6e6d522e-79dc-c22e-43da-b6e90ceb60ec.png)

  (after)
  ![2021-03-31_08.55.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/89a38dfa-d634-5802-34c8-7c3da2af63bf.png)

- ゲームモード変更  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/880aa5fd-1836-e4e4-bf02-845dd1c3b547.png)

  (before)
  ![2021-03-30_22.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/6e6d522e-79dc-c22e-43da-b6e90ceb60ec.png)

  (after)
  ![2021-03-31_08.57.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/3781cc76-0e8e-b988-f5ae-dfe916fb8a3a.png)

- 難易度変更  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/02a55238-c53b-70bd-8447-0326e821cc62.png)

  (before)
  ![2021-03-30_22.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/6e6d522e-79dc-c22e-43da-b6e90ceb60ec.png)

  (after)
  ![2021-03-31_08.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/e212f88b-4b5f-07fd-ccd1-520311f4a950.png)

- エンチャント付与  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/2a11da11-402d-e3be-d110-cb24f7e73b18.png)

  (before)
  ![2021-03-31_09.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/b160f84a-ff44-6be7-6f7a-a1070f911f36.png)

  (after)
  ![2021-03-31_09.02.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/b3b2f3e2-0ae4-ca7b-b7ab-1583a70b288d.png)

- パーティクル出現（相対座標OK）  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/ded95f38-161e-bde6-f113-098cbb6350fe.png)

  (before)
  ![2021-03-30_22.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/6e6d522e-79dc-c22e-43da-b6e90ceb60ec.png)

  (after)
  ![2021-03-31_09.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/c645d212-57b2-f65f-1f2d-0a495fd348d9.png)

- 接続先変更（IPアドレス指定）  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/70d933fe-a572-a797-e360-4c998e8cce4b.png)

  サーバーで遊んでいる場合などに使えると思います。（すみませんテストしてません:sweat_smile:）
  サーバーに接続する際には14711ポートを開放してください。

- インベントリアイテム  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/c8bf8402-dcf5-b133-17a9-5de87fa038c3.png)
  
  「E」キーを押した際に表示されるカテゴリ毎にアイテムを選択できるようにしました。  
  ![2021-03-31_09.20.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/53d9ff78-13ef-e9bd-2857-e5c4739def36.png)

# さいごに
基本的な動作はできるようになっているので、Scratchの制御構文と組み合わせるとかなりいろんなことができるんじゃないかなと思います。
追加で欲しい機能などがあればぜひコメントください！
[リポジトリ](https://github.com/takecx/RemoteControllerMod)にissue立ててもらってもOKです！👌 

# 2025/04/25 追記
頂いたコメントを受けて、「溶岩流」「溶岩」「流水」「水」を設置できるように修正しました！🎉
（Scratch側のみの修正のためModの更新は不要です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/1e62c486-9166-49b7-b665-703a2c02018e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245628/9ebb698d-2943-4cf3-a861-c0f42630cd30.png)


# 2021/06/22 追記
ソケット通信を用いた通信ができるようにしたバージョンを[リリース](https://www.curseforge.com/minecraft/mc-mods/remote-controller/files/3359903)しました！
ポート番号14712で接続して通信することが可能です。
例えばPythonから以下のようにして通信することが可能です。

```python
import socket

ip = 'localhost'
port = 14712
server = (ip, port)

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect(server)
socket.send(b'chat.post(socket test)')
```

ドキュメントはまだ作成していないので、実行可能なコマンドの詳細については以下のファイルを参照してください :bow:  
[APIHandler.java](https://github.com/takecx/RemoteControllerMod/blob/master/src/main/java/com/github/takecx/remotecontrollermod/APIHandler.java)

```java
    // Commands
    protected static final String WORLDGETPLAYERIDS = "world.getPlayerIds";
    protected static final String GETBLOCKWITHDATA = "world.getBlockWithData";
    protected static final String SETBLOCK = "world.setBlock";
    protected static final String SETBLOCKS = "world.setBlocks";
    protected static final String WORLDSPAWNENTITY = "world.spawnEntity";
    protected static final String WORLDCHANGEWEATHER = "world.changeWeather";
    protected static final String WORLDCHANGEGAMEMODE = "world.changeGameMode";
    protected static final String WORLDCHANGEDIFFICULTY = "world.changeDifficulty";
    protected static final String WORLDSPAWNPARTICLE = "world.spawnParticle";
    protected static final String ENTITYGETPOS = "entity.getPos";
    protected static final String ENTITYSETPOS = "entity.setPos";
    protected static final String CHAT = "chat.post";
    protected static final String GIVEENCHANT = "giveEnchant";
```

# 2021/06/20 追記
`1.16.5`版について、以下の不具合がありました :bow: 
- Minecraftのワールドを開く前にScratchのMinecraft拡張機能をロードすると、ScratchからMinecraftへの通信ができない
- ScratchのMinecraft拡張機能をロードしている状態でワールドから出て再度入ると、ScratchからMinecraftへの通信ができない

上記問題を修正したバージョンのmodを以下にアップロードしました。
https://www.curseforge.com/minecraft/mc-mods/remote-controller/files/3357426

# 2021/06/05 追記
マインクラフトのバージョン`1.16.5`に対応しました！
[CurseForge](https://www.curseforge.com/minecraft/mc-mods/remote-controller)から1.16.5用のmodファイルをダウンロードしてください。
また、Scratch自体も`1.16.5`と`1.12.2`で以下のように別々で公開しました。
- `1.16.5`：[https://takecx.github.io/scratch-gui/1-16-5/](https://takecx.github.io/scratch-gui/1-16-5/)
- `1.12.2`：[https://takecx.github.io/scratch-gui/1-12-2/](https://takecx.github.io/scratch-gui/1-12-2/)（`1.12.2`については[もともとのURL](https://takecx.github.io/scratch-gui/)でも引き続き公開しています）