【マインクラフト（統合版）】Websocketサーバーと連携できる「召雷の魔石」を作ってみました

# はじめに

このアイテムを手に持って投げる事により、投げたところへ稲妻を落とせます。

▼一人称
![一人称アニメーション](https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/animation1.gif "一人称アニメーション")

▼三人称
![三人称アニメーション](https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/animation3.gif "三人称アニメーション")

今回は投擲アイテムを作ってみたかったという事もありますが、他にも以下２つの目的で実装しました。
<dl>
    <dt>・いなずまの剣（改）のレシピ作成</dt>
    <dt>・エンティティプロパティの検証</dt>
</dl><br />
以降ではその内容を見ていきます。


# 動作環境

<dl>
    <dt>プラットフォーム</dt>
    <dd>Windows10</dd>
    <dt>マインクラフト（統合版）</dt>
    <dd>Bedrock Edition v1.21.51</dd>
    <dt>socket-manager</dt>
    <dd>v1.14.1</dd>
    <dt>言語</dt>
    <dd>PHP v8.2.4（v8.1.0以降）</dd>
</dl>


# いなずまの剣（改）のレシピ

元々いなずまの剣（改）のレシピを作りたいと思っていたので、後付け感はありますが作ってみました。

「召雷の魔石」と「いなずまの矢」を消費するパターンの以下２種類共に無形レシピなので、必要な素材アイテムさえあれば作業台上の配置の仕方は問いません。

無形レシピの作り方については以下のページをご覧ください。

https://qiita.com/glasses_seven/items/6865c9c3ae5d756a2989/

<br />

### いなずまの剣

<br />
<dl>
    <dt>・「召雷の魔石」を消費する場合</dt>
    <dd>
        <br />
        ▼必要な素材<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/material-list-thunder-sword-by-stone.png" /><br /><br />
        ▼レシピパターン<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/recipe-thunder-sword-by-stone.png" /><br />
    </dd>
</dl>
<br />
<dl>
    <dt>・「いなずまの矢」を消費する場合</dt>
    <dd>
        <br />
        ▼必要な素材<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/material-list-thunder-sword-by-arrow.png" /><br /><br />
        ▼レシピパターン<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/recipe-thunder-sword-by-arrow.png" /><br />
    </dd>
</dl>
<br />

### いなずまの剣改

<br />
<dl>
    <dt>・「召雷の魔石」を消費する場合</dt>
    <dd>
        <br />
        ▼必要な素材<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/material-list-thunder-sword-revised-by-stone.png" /><br /><br />
        ▼レシピパターン<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/recipe-thunder-sword-revised-by-stone.png" /><br />
    </dd>
</dl>
<br />
<dl>
    <dt>・「いなずまの矢」を消費する場合</dt>
    <dd>
        <br />
        ▼必要な素材<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/material-list-thunder-sword-revised-by-arrow.png" /><br /><br />
        ▼レシピパターン<br />
        <img src="https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/recipe-thunder-sword-revised-by-arrow.png" /><br />
    </dd>
</dl>

---

▼「いなずまの剣（改）」のご紹介ページはこちら

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

▼「いなずまの矢」のご紹介ページはこちら

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


# エンティティプロパティの検証

今回のアイテムは以下ネットショップのページでご紹介させて頂いたショップで売却できるようにするために、ショップとの接続中に右クリックの機能を無効化できるかどうかが課題でした。

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

色々と理由はありますが、屋内や施設内でショップに接続するケースも考えられるため、アイテムの使用によって周囲の設備が破壊される事を防ぐのが一番の目的です。

「いなずまの剣」や「はやぶさの剣」などの実装では座標を計算する必要があり、イベント処理の実装はWebsocketサーバー側で行っていた関係もあって対応は容易でした。
ところが今回は召雷部分も含めてアイテム投擲後のイベント処理の実装はクライアント（マインクラフト）側で行っています。

そこでショップとの接続を行っている直接のエンティティはプレイヤーになるので、サーバー（ショップ）側と連携させる目的で接続ステータスを表すフラグをプレイヤー側のエンティティプロパティで持たせる事にしました。

フラグメントを制御する処理の流れは次の通り。

<dl>
    <dt>①Websocketサーバーとの接続時にフラグを落とす</dt>
    <dd>
        サーバー接続時にフラグを落とす<code>event</code>コマンドを発行。<br />
        ショップとの接続中にマインクラフト側が強制終了された時の対応です。
    </dd>
    <dt>②ショップへの入店時にフラグを立てる</dt>
    <dd>
        ショップ接続時にフラグを立てる<code>event</code>コマンドを発行。
    </dd>
    <dt>③ショップからの退店時にフラグを落とす</dt>
    <dd>
        ショップ切断時にフラグを落とす<code>event</code>コマンドを発行。
    </dd>
</dl>

上記の一連の処理を行う事で、アイテムイベントが発生した時にプレイヤー側のエンティティプロパティを参照して挙動を変える事ができるようになりました。

以下はショップで売却するイメージです。
（ショップとの接続中は投擲物の発射や召雷の挙動は発生していません）
![売却オペレーション](https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/shop.gif "売却オペレーション")


# 「召雷の魔石」の取得

socket-manager環境のビヘイビアパック／リソースパックなどのアドオンパックを適用しておけば、以下の方法で「召雷の魔石」が手に入ります。

### 釣りで取得

宝物アイテムとして登録しているので「宝釣り」エンチャントで釣れやすくなります。

### ドロップアイテムとして取得

クリーパーのドロップアイテムとして登録していますが火薬を落とす確率よりも低く設定しています。

### コマンドで取得

以下はワールドオーナーやシステム組み込み用としてコマンドで取得する方法です。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/drop-command.png" height="354px" width="500px" />
<img src="https://socket-manager.github.io/document/minecraft-contents/img/thunder-stone/drop-get.png" height="354px" width="500px" />

---

あとはsocket-managerでWebsocketサーバーを起動後、マインクラフトからの接続が完了すれば「召雷の魔石」を含めた各種コンテンツが使えるようになります。

:::note info
socket-managerの導入方法やアドオンパックの所在については以下のページでご紹介していますのでご興味のある方はご覧ください。
:::

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

:::note info
アドオンパックの適用方法については以下のページでご紹介しています。
:::

https://qiita.com/glasses_seven/items/7a174722c9030e669eac


# おわりに

今回の実装でエンティティプロパティが検証できたのは大きな成果だったと思っています。
これでコンテンツのイベント処理全てをサーバー側の実装でこだわらなくても柔軟に対応できそうです。

「召雷の魔石」の実装は以下の作り方を基に応用したものです。

https://qiita.com/glasses_seven/items/1c2dddcea47e8fd531a0/

エンティティプロパティの使い方については以下のページをご覧ください。

https://qiita.com/glasses_seven/items/5553772d3fa8edd09cc0/

また、今回の実装で発射物としてカスタムエンティティも作成していますが、詳しい作り方については以下のページをご覧ください。

https://qiita.com/glasses_seven/items/6bcd386abd74db01e450/