【マインクラフト（統合版）】Websocketサーバーのイベントデータまとめ

# はじめに

ここではWebsocketサーバーのイベントデータについて、以下の環境で使用している内容を中心にご紹介します。

https://qiita.com/glasses_seven/items/433ac9d9fcbdb72c6d18/

<br />
本環境で扱っているのは以下の３種類です。

<dl>
    <dt>・<a href="#PlayerMessage">PlayerMessage</a></dt>
    <dt>・<a href="#ItemUsed">ItemUsed</a></dt>
    <dt>・<a href="#PlayerTravelled">PlayerTravelled</a></dt>
</dl>


# PlayerMessage

チャットやウィスパーに関するイベントデータを受信する時のフォーマットです。

```json:受信するイベントデータの形式
{
    "body":{
        "message":<文字列>,
        "receiver":<文字列>,
        "sender":<文字列>,
        "type":<文字列>
    },
    "header":{
        "eventName":"PlayerMessage",
        "messagePurpose":"event",
        "version":<数値>
    }
}
```

## ・body

<dl>
    <dt>message</dt>
    <dd>チャットメッセージ</dd>
    <dt>receiver</dt>
    <dd>メッセージの受信ユーザー名</dd>
    <dt>sender</dt>
    <dd>メッセージの送信ユーザー名。Websocketサーバーからの送信時は固定で<code>外部</code>になる。</dd>
    <dt>type</dt>
    <dd>
        以下の種類が存在する。
        <dl>
            <dt>chat</dt>
            <dd>
                コマンドラインで<code>/</code>（スラッシュ）なしの入力、あるいは<code>say</code>コマンドによる入力時
            </dd>
            <dt>tell</dt>
            <dd>
                <code>tell</code>、<code>tellraw</code>、<code>msg</code>、<code>w</code>コマンド（いわゆるウィスパー）による入力時
            </dd>
        </dl>
    </dd>
</dl>


# ItemUsed

アイテム使用時のイベントデータを受信する時のフォーマットです。

```json:受信するイベントデータの形式
{
    "body":{
        "count":<数値（今のところ1固定）>,
        "item":{
            "aux":<数値>,
            "id":<文字列>,
            "namespace":<文字列>
        },
        "player":{
            "color":<文字列>,
            "dimension":<数値>,
            "id":<数値>,
            "name":<文字列>,
            "position":{
                "x":<浮動小数点数>,
                "y":<浮動小数点数>,
                "z":<浮動小数点数>
            },
            "type":"minecraft:player",
            "variant":<数値>,
            "yRot":<浮動小数点数>
        },
        "useMethod":<数値>
    },
    "header":{
        "eventName":"ItemUsed",
        "messagePurpose":"event",
        "version":<数値>
    }
}
```

## ・body

<dl>
    <dt>item</dt>
    <dd>
        <dl>
            <dt>aux</dt>
            <dd>
                アイテムのAUX（データ）値。<br />
                使い方については<a href="https://qiita.com/glasses_seven/items/f0e745f9715e6ac34560/">&gt;&gt; ルートテーブルの書き方</a>（set_data関数）で説明しています。
            </dd>
            <dt>id</dt>
            <dd>アイテムID。例えばウインドチャージの場合<code>wind_charge</code>になる。</dd>
            <dt>namespace</dt>
            <dd>アイテムのネームスペース名。ネイティブなアイテムの場合は<code>minecraft</code>になる。</dd>
        </dl>
    </dd>
    <dt>player</dt>
    <dd>
        <dl>
            <dt>color</dt>
            <dd>
                カラーコード文字列。<br />
                統合版ではチーム機能はないが、Java版ではチーム色を指定する項目があるので、恐らくそのリザーブ項目ではないかと思われる。<br />
                ちなみにプレイヤーエンティティの項目を変更して試してみたが、現状ではこの項目へは反映されない模様。
            </dd>
            <dt>dimension</dt>
            <dd>
                プレイヤーが存在するワールドの種類。<br />
                0:オーバーワールド<br />
                1:ネザー<br />
                2:エンド<br />
            </dd>
            <dt>id</dt>
            <dd>プレイヤーのID</dd>
            <dt>name</dt>
            <dd>マインクラフトユーザー名</dd>
            <dt>position</dt>
            <dd>
                <dl>
                    <dt>x</dt>
                    <dd>プレイヤーのX座標位置</dd>
                    <dt>y</dt>
                    <dd>プレイヤーのY座標位置</dd>
                    <dt>z</dt>
                    <dd>プレイヤーのZ座標位置</dd>
                </dl>
            </dd>
            <dt>variant</dt>
            <dd>プレイヤーエンティティのバリアント値</dd>
            <dt>yRot</dt>
            <dd>プレイヤーが向いている角度（ヨー角）</dd>
        </dl>
    </dd>
    <dt>useMethod</dt>
    <dd>
        値は次の通り。<br />
        1:食料アイテム<br />
        3:飲料アイテム<br />
        4:投擲アイテム<br />
        5:発射アイテム<br />
        6:ベッド設置<br />
        10:その他アイテムの使用（火打石と打ち金／ヤギの角笛／望遠鏡など）
    </dd>
</dl>


# PlayerTravelled

プレイヤーの移動種類のイベントデータを受信する時のフォーマットです。

```json:受信するイベントデータの形式
{
    "body":{
        "isUnderwater":<ブール値>,
        "metersTravelled":<浮動小数点数>,
        "newBiome":<数値>,
        "player":{
            "color":<文字列>,
            "dimension":<数値>,
            "id":<数値>,
            "name":<文字列>,
            "position":{
                "x":<浮動小数点数>,
                "y":<浮動小数点数>,
                "z":<浮動小数点数>
            },
            "type":"minecraft:player",
            "variant":<数値>,
            "yRot":<浮動小数点数>
        },
        "travelMethod":<数値>
    },
    "header":{
        "eventName":"PlayerTravelled",
        "messagePurpose":"event",
        "version":<数値>
    }
}
```

## ・body

<dl>
    <dt>isUnderwater</dt>
    <dd>
        値は次の通り。<br />
        true:プレイヤーが水中に潜っている時<br />
        false:プレイヤーが陸に上がっている時<br />
        ※プレイヤーが下半身だけ浸かっている時はfalseになる。
    </dd>
    <dt>metersTravelled</dt>
    <dd>前回検知した位置からの移動距離（ｍ）</dd>
    <dt>newBiome</dt>
    <dd>使途不明</dd>
    <dt>player</dt>
    <dd>
        <dl>
            <dt>color</dt>
            <dd>
                カラーコード文字列。<br />
                統合版ではチーム機能はないが、Java版ではチーム色を指定する項目があるので、恐らくそのリザーブ項目ではないかと思われる。<br />
                ちなみにプレイヤーエンティティの項目を変更して試してみたが、現状ではこの項目へは反映されない模様。
            </dd>
            <dt>dimension</dt>
            <dd>
                プレイヤーが存在するワールドの種類。<br />
                0:オーバーワールド<br />
                1:ネザー<br />
                2:エンド<br />
            </dd>
            <dt>id</dt>
            <dd>プレイヤーのID</dd>
            <dt>name</dt>
            <dd>マインクラフトユーザー名</dd>
            <dt>position</dt>
            <dd>
                <dl>
                    <dt>x</dt>
                    <dd>プレイヤーのX座標位置</dd>
                    <dt>y</dt>
                    <dd>プレイヤーのY座標位置</dd>
                    <dt>z</dt>
                    <dd>プレイヤーのZ座標位置</dd>
                </dl>
            </dd>
            <dt>variant</dt>
            <dd>プレイヤーエンティティのバリアント値</dd>
            <dt>yRot</dt>
            <dd>プレイヤーが向いている角度（ヨー角）</dd>
        </dl>
    </dd>
    <dt>travelMethod</dt>
    <dd>
        値は次の通り。<br />
        0:地上での移動（歩行）<br />
        1:水中での移動（歩行／上昇／下降／水泳）<br />
        2:落下運動の要因になる移動（ジャンプ／エリトラで滑空など）<br />
        3:はしごでの移動<br />
        4:溶岩中での移動<br />
        5:クリエイティブで飛行中の移動（上昇／下降／通常移動／加速移動／テレポート）<br />
        6:エンティティでの馬乗りによる移動<br />
        7:スニーク移動<br />
        8:加速移動（ダッシュ／エリトラで加速）<br />
        9:弾むブロック上での歩行移動（ベッド／スライムブロックなど）<br />
        11:テレポート（クリエイティブで飛行中以外）
    </dd>
</dl>

:::note info
`travelMethod`の０番の項目については`1.21.60`のバージョンで一時的に２番へ統合されていましたが`1.21.61`のバージョンで元通りに修正して下さったようです。
:::


# おわりに

`ItemUsed`や`PlayerTravelled`のイベントデータ内にはプレイヤーエンティティのバリアント値が含まれていますが、本環境では`ItemUsed`イベントのバリアント値をプレイヤーの状態コードとして以下のコンテンツで利用しています。

https://qiita.com/glasses_seven/items/556927227356043752a2/

https://qiita.com/glasses_seven/items/e3cf4ae07ce1c67383e1/

https://qiita.com/glasses_seven/items/690f46f3ac6181d91ebc/

エンティティのバリアント値は、本来猫やシュルカーボックスなどのスキン違いのエンティティを区別する値として利用されていますが、プレイヤーエンティティを含めカスタムエンティティでは自由に使えるようです。