【チート級】Pythonでマイクラの世界を支配する。最強ライブラリ「bedrockpy」がヤバイ。 – 概要とスクリプトを徹底解説!


はじめに

マインクラフトで面倒な作業を自動化したい」「チャットコマンド一つで、仲間全員に最強装備を配りたい

そう思うこと、少なくないと思います。

Character
そのための「コマンド」では?

この意見も尤もでしょう。コマンドを使えば大抵のことはできるので、これで解決するように思えます。しかし、マイクラのコマンドシステムはプログラミング的アプローチをとらないので、各種制御構文(繰り返し・条件分岐)が苦手というデメリットがあります。

Character
100回何かの処理をしたかったら、100回コマンドを書かなきゃいけない…(泣)

そこで「ScriptAPI」を連想したあなたは鋭いです。端的に言えば、これはJavaScriptというプログラミング言語を用いてマインクラフトを制御できるシステムのことであり、当然各種制御構文は使用可能なのでこうした問題は解決する。そのように思えます。

しかし、それも万能ではありません

ScriptAPIは所詮、アドオンの一機能です。すなわち、公式がサポートしていないことや、外部のライブラリを使用したことをしようとすると、ScriptAPIというのはあまりに力不足なんです。

Character
勿論ScriptAPIも優秀ではあるんですけどね?

そこで登場するのが、プログラミング言語の1つである、Pythonです。

Character
え?マイクラ関係なくない?

一見するとそう思えるでしょう。しかし、実はPythonでMinecraftに干渉できるライブラリが存在するのです。その名こそ、今回紹介する「bedrockpy」。これを使えば、マインクラフト統合版とPythonスクリプトを接続し、ゲーム内で起こる様々なイベントをトリガーにすることで、チート級の自動操作が可能になります。この記事では、その概要から具体的な使い方までを、初心者にも分かりやすく解説します。


本記事の内容について解説した動画を作成しました。こちらより視聴できます:

Pythonとは?

そもそも「Python(パイソン)」とは何か。Pythonは、世界中で広く使われているプログラミング言語の一種です。その最大の特徴は、文法がシンプルで、人間にとって読みやすく書きやすいこと。そのため、プログラミングの入門者が最初に学ぶ言語として非常に人気があります。Webサイト制作から、AI開発、データ分析まで、ありとあらゆる分野で活躍している万能言語ですが、今回はこのPythonを使って、マインクラフトの世界を「ハック」していきます。

Character
プログラミング界隈にいれば一度は名前を聞いたことがあるでしょう

学校の情報の授業で触ることも多いみたいですね。


Bedrockpy

「bedrockpy」とは、Pythonでマインクラフト統合版を操作するために作られた、有志開発のライブラリです。ゲームクライアントとWebSocketを使って通信することにより、「プレイヤーがブロックを壊した」「チャットで特定の言葉を発した」といったゲーム内の出来事をPython側で検知し、それに応じて「コマンドを実行する」といった操作を自動で行えるようになります

ただし、利用には重要な注意点があります。公式資料によると、bedrockpy公式にサポートされたツールではなく、現在は開発・メンテナンスも行われていません。マイクラの開発者向けテスト機能を間借りしている状態なので、将来のアップデートで使えなくなる可能性があります。あくまで自己責任で楽しむ、実験的なツールとして捉えるのが良いかと思います。

Character
楽しければいいじゃないですか~(笑)

Pythonでマイクラを操作して、何が楽しいの?

では、これを使って一体どんな面白いことができるのでしょうか?可能性は無限大ですが、例えば以下のようなことが考えられます。

  • 最強のカスタムコマンド作成
  • イベントの自動化
  • ミニゲームのルール作り
  • 現実世界との連携

要するに、もっと具体的な例でいうならば、

  • チャットで「?最強装備」と打つだけで、コマンドを実行したプレイヤーにエンチャント済みのネザライト装備一式を配布
  • ダイヤモンド鉱石が壊されたら、全プレイヤーに「〇〇さんがダイヤモンドを発見しました!」と自動で通知。
  • 特定のアイテムを使うと、プレイヤーを別の場所にテレポートさせる、といった独自のミニゲームをプログラムで制御。
  • Pythonの外部ライブラリと連携し、「ゲーム内で松明を置いたら、あなたの部屋のスマート電球が点灯する」といった、ゲームと現実をリンクさせる遊びも。

このように、サーバープラグインやアドオンだけでは実現が難しい、あるいはもっと手軽に実装したいアイデアを形にできるのが最大の魅力です。上3つはScriptAPIでできなくもないですが、最後のものはこの手の技術を使わないと実装が難しいですね。

Character
投稿者自身、これを使ったプロジェクトを2つほど考えています


環境構築

続いて、bedrockpyを動かすための環境構築について解説します。

Pythonのインストール

PythonのインストールまだPCにPythonが入っていない場合、Python公式サイトから最新版をダウンロードしてインストールする必要があります。ダウンロードはこちら:

https://www.python.org/downloads

インストーラーの最初の画面で、「Add Python to PATH」のチェックボックスに必ずチェックを入れてください。

ライブラリのインストール

bedrockpyのインストールWindowsなら「コマンドプロンプト」、Macなら「ターミナル」を開き、以下のコマンドを一行入力してエンターキーを押します:

Copied!
pip install bedrockpy

これだけで、必要なライブラリのインストールは完了です。


最小構成

以下がbedrockpyを動かすための最低限のコードです。テキストエディタ(メモ帳でもOK)に以下の内容をコピーし、script.pyのような名前で保存してください。

Python
Copied!
from bedrock.server import Server

# Serverオブジェクトを作成
app = Server()

# ここにイベント処理を書いていく

# サーバーを起動
app.start("localhost", 6464) 

その後、これを実行してみましょう。pythonの実行は、VSCodeの場合F5キーを押すことで実行できるほか、コマンドプロンプト・パワーシェルを開いて

Python
Copied!
python (Pythonファイルのパス)

というコマンドを実行することで実行できます。

この時点ではまだ何も起きませんが、これが全ての基本形となります。

Character
サーバーを起動するだけのスクリプトです。

基本的なスクリプト

では、実際にマイクラ内でイベントを検知してコマンドを実行するスクリプトを組んでみましょう。先ほどの最小構成コードの「# ここにイベント処理を書いていく」の部分に、以下のコードを追加してみてください。

Python
Copied!
@app.game_event
async def block_broken(ctx):
    player = ctx.data["player"]["name"]
    block = ctx.id
    await ctx.server.run(f"say {player}は{block}を壊しました")

これは、ブロックを破壊したときに破壊したプレイヤーと破壊されたブロックをそれぞれ取得し、sayコマンドをマイクラ内で発火することによってそれらを出力する例です。

Character
ctx.data[“player”][“name”]でplayerを、ctx.idでブロックをそれぞれ取得できます。取得の方法は後述。

続いて、このライブラリはWebSockeによる通信を用いているため、メニュー画面の設定→一般より、「Websocket」を有効にしておく必要があります。忘れずに有効化しておきましょう:

このスクリプトファイルを実行した状態でマイクラを起動し、ワールドに入ってチャット欄で、

Python
Copied!
/connect localhost:6464

と入力し、connectコマンドを実行します(エラーが出る場合、WebSocketを有効化してください)。

すると、ブロックを破壊するとプレイヤー名が出力されることが分かるでしょうか:

このようにして、マイクラ内の何らかの行動をトリガーしてコマンド実行などの形でそれを出力する、ということが可能になります。

他の行動もトリガーしてみましょう:

Python
Copied!
@app.game_event
async def player_message(ctx):
    # プレイヤーがチャットで発したメッセージを取得
    message = ctx.message

    # もしメッセージが「?diamond」だったら
    if message == "?diamond":
        # ダイヤモンドを1個、全員に配布するコマンドを実行
        await ctx.server.run(f"give @a diamond 1")

これは、プレイヤーのメッセージを監視し、それが「?diamond」である場合の処理を定義するものです。言い換えれば、「?diamond」という新規のコマンドを定義している、と言い換えることもできますね。この場合、「ctx.message」でメッセージを取得できます。

実際に「?diamond」というメッセージを入力してみましょう。ダイアモンドた1つ与えられることが分かるでしょうか:

最後に、アイテムの使用もトリガーしてみましょう:

Python
Copied!
@app.game_event
async def item_used(ctx):
    item = ctx.data["item"]["id"]
    player = ctx.data["player"]["name"]
    await ctx.server.run(f"say {player}は{item}を使いました")

ctx.data[“item”][“id”]で使用したアイテムを、ctx.data[“player”][“name”]でアイテムを使用したプレイヤーをそれぞれ取得することで、使用したときの処理を定義しています。この状態で食べ物や使用可能なアイテムを右クリックしてみましょう:

このようにして、アイテムの使用をトリガーできます。


print(ctx.data)の活用

スクリプトを組んでいると、「このイベントでは、どんな情報が取得できるのか」と疑問に思う時があります。例えば使用したアイテムを取得するのに「ctx.data[“player”][“name”]」を使えばいいなんて、何の情報もなければ分かりませんよね?

そんな時に役立つのがprint(ctx.data)です。各イベント処理の関数の中にこの一行を追加するだけで、そのイベントで取得可能な全てのデータがPythonの実行画面(黒い画面)に表示されます:

これは、item_used関数においてこれを用いた例です。

プレイヤーの座標、使ったアイテム、プレイヤーの名前など、Object形式で保存されていることが分かりますね。新しいイベントを試す際は、積極的にこれを活用すると良いかもしれません。


公式リファレンス

bedrockpyの情報は残念ながらネット上に殆どありません。そのため、公式リファレンスが大きな役割を果たします:

https://bedrockpy.readthedocs.io/en/latest/api.html

特に、bedrock.consts.GAME_EVENTSに関するリファレンスは非常に参考になり、「何がトリガーできるのか」が一目で分かるため目を通してみると良いかもしれません:

他にもブロックの設置とか、プレイヤーの参加とか、多くのことがトリガーできるようです。


おしまい

bedrockpyは、マイクラの遊び方を根底から変えてしまう可能性を秘めた、非常に刺激的なライブラリです。公式サポートがなく不安定という側面はありますが、それを補って余りあるほどのパワーと楽しさがあります。

Character
PythonでMinecraftを動かせるということ自体がビックリですね(笑)

興味のある方は、試してみてはいかがでしょうか?

最新情報をチェックしよう!