py-mcwsでプレイヤーの頭上でニワトリを召喚してみる

py-mcwsの仕組みを見てみようで触れましたpy-mcwsを使って、ニワトリ(chicken)が空から降ってくるというコードを作成してみます。


チャットとコマンドの画面で$chickenと打ち込み送信したら、



のようにプレイヤーの頭上20ブロック分の位置でニワトリを召喚(summon)するという処理を書いてみます。

※$chickenの前に$を付けることに特別な意味はありません




プレイヤーの頭上でニワトリを召喚する為にはプレイヤーの現在位置(座標)を知る必要があります。

設定画面を開き、



ゲーム設定のワールドの設定で座標を表示をONにすると、




画面左上に現在の座標が表示されるようになります。

座標は左からx座標、y座標、z座標になります。


今回はプレイヤーの頭上にニワトリを召喚するので、二番目の値の64に注目します。




取得した座標を元にコードを作成します。

/home/******(ユーザ名が入る)/workspace/ws-server/main.pyのファイルを下記のように書き換えてみます。

import py_mcws

server = py_mcws.WebsocketServer()

@server.event
async def on_ready(host, port):
    print(f"サーバーを起動しました。\n'/connect {host}:{port}'で接続できます")

@server.event
async def on_connect():
    print("接続しました")

@server.event
async def on_PlayerMessage(event):
    if event["body"]["message"] == "$chicken":
        await server.command("summon chicken -101 84 255")

server.start(host="0.0.0.0", port=19132)

コードが作成できましたら、クロームブックのマインクラフト統合版でプログラミングをしてみるの内容を参考に、サーバを立ち上げ、connectコマンドでマインクラフトとサーバを接続してみます。


マインクラフトの方でチャットとコマンドの画面を開き、$chickenを入力して送信したら、冒頭の動画のようにプレイヤーの頭上でニワトリが召喚され落ちてきます。


今回のコードでは、on_PlayerMessage関数で、マインクラフト側のチャットとコマンドで送信された値をイベントとして拾うことができます。


この時、

if event["body"]["message"] == "$chicken":

にすることで実際に送信された文字列を使用することができます。

※event変数内に格納されたJSONの値が気になる場合は、print(event)で確認することができます。




今回のコードでは、実行する前にプレイヤーの現在位置(座標)を調べるのが大変です。

ここで

@server.event
async def on_PlayerMessage(event):
    if event["body"]["message"] == "$chicken":
        await server.command("summon chicken -101 84 255")

@server.event
async def on_PlayerMessage(event):
    if event["body"]["message"] == "$chicken":
        await server.command("summon chicken ~ ~20 ~")

のように書き換えてみます。


コマンド内の~ですが、プレイヤーの現在の座標を意味していまして、~ ~ ~ であれば、左からx座標、y座標、z座標はすべてプレイヤーの位置を示し、~ ~20 ~ の場合は、y座標のみ20加算した位置を意味します。

※~はチルダと読む


これでマインクラフト側で$chickenの値を送信した時に、常にプレイヤーの頭上でニワトリを召喚することが可能になります。




練習として、$の後に他のエンティティのID(例えば猫のcatやウサギのrabbit等)を続けた場合、指定したエンティティを召喚できるようにしたり、召喚するときにニワトリを100羽召喚してみたりとコードを改修してみましょう。

マインクラフト用ビジュアルエディタを開発しています。
詳しくはinunosinsi/mcws_blockly - githubをご覧ください。