【マインクラフト（統合版）】Websocketサーバーを使って「機雷の弓」を作ってみました

# はじめに

このアイテムは単体では機能しませんが、例えばこれを使うと以下の様な事ができます。
![いなずま砲](https://socket-manager.github.io/document/minecraft-contents/img/bow-mine/thunder_cannon.gif "いなずま砲")

このように複数の特殊機能の矢を同時発動させるしくみです。


# 動作環境

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


# 使い方

「機雷の弓」で放った矢は機雷化します。
そして「いなずまの矢」や「はかいの矢」が起爆装置の代わりになります。

例えば先に「機雷の弓」を使って以下の赤枠のように矢を横に並べて放っていたとします。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/bow-mine/thunder_gatling.png" height="600px" width="728px">

そこに「いなずまの矢」を打ち込むと．．．
![いなずまガトリング](https://socket-manager.github.io/document/minecraft-contents/img/bow-mine/thunder_gatling.gif "いなずまガトリング")
冒頭の画面では機雷化した矢を一箇所に集中させていましたが横に並べる事で範囲を拡げています。

:::note info
「いなずまの矢」や「はかいの矢」については以下のページでご紹介しています。
:::

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

https://qiita.com/glasses_seven/items/98ea8e43b406f75c41df/


# 「機雷の弓」の取得

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

### ショップで購入する場合

以下のショップで購入できます。

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

### コマンドで取得する場合

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

<img src="https://socket-manager.github.io/document/minecraft-contents/img/bow-mine/get_bow.png" height="600px" width="728px">
あとはsocket-managerでWebsocketサーバーを起動後、マインクラフトからの接続が完了すれば「機雷の弓」を含めた各種コンテンツが使えるようになります。

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

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

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

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


# サーバー側の実装

今回も他の弓矢のアイテムと同様に"ItemUsed"というサブスクライブイベントを使用しています。
マインクラフト上でアイテムを使ったと認識されると発生するイベントのようです。

:::note info
サブスクライブイベントの処理内容については以下のページでご紹介しています。
:::

https://socket-manager.github.io/document/extra-minecraft.html

このアイテムは機能を発動するタイプではありませんので、以下の「タグの付与について」の項でも触れていますが、他の特殊機能の矢とは異なりタグを付与するのみで処理を終了しています。

実装内容の詳細は他のコンテンツも含めて以下のページでご紹介していますのでご興味のある方はご覧ください。

https://socket-manager.github.io/document/minecraft-contents/bow-mine.html


# タグの付与について

この環境の矢にはターゲットセレクタを機能させるために以下のような特徴を持っています。

<dl>
    <dt>■前提条件</dt>
    <dd>同じワールド内の全マルチプレイユーザーがWebsocketサーバーに接続済で、ワールド内の全ての矢のエンティティには何等かのタグが付与されている</dd>
    <dt>■"normal"タグの付与</dt>
    <dd>通常の矢には"normal"タグを付与する</dd>
    <dt>■"cheat"タグの付与</dt>
    <dd>特殊な機能を持つ矢には"cheat"タグを付与する</dd>
</dl>

弓矢を使った時点でWebsokectサーバーが感知してタグを付与するので、全ての矢のエンティティには何等かのタグが付与されている状態になっています。
その為、矢を放った時点のエンティティにはタグが付与されていないので、既にスポーン済の矢と区別ができるようになります。

但し同時に矢を放った相手がいる場合はプレイヤーの区別ができない為完璧とはいきませんが、この場合は先に放った方が先勝ちとなり矢の機能が発動します。

「いなずまの矢」や「はかいの矢」の場合は`cheat`タグの付与後すぐに機能を発動させていますが「機雷の弓」の場合はタグを付与するだけで終了しているところが異なります。
また「機雷の弓」を使って敢えて同じ`cheat`タグを付与する事で、その後使用する起爆装置によって機能を切り替えられるようにしています。

Java版の場合はプレイヤーから一定距離内の矢を検知してタグを付与する方法が使われる事がありますが、近くに別のプレイヤーがいる状況でゲームチックのタイミングによっては付与対象となる矢を見誤る事があるのでこれも完璧とはいきません。故に今回はこの部分の対応を見送っています。


# おわりに

機雷化した矢を複数使った方が威力も上がるようです。
例えば「はかいの矢」を１回使うと以下のような感じですが．．．
![はかい砲（単発）](https://socket-manager.github.io/document/minecraft-contents/img/bow-mine/explode_cannon_single.gif "はかい砲（単発）")

機雷化した矢を一箇所に集中させて起爆すると以下のように破壊力が上がっています。
![はかい砲](https://socket-manager.github.io/document/minecraft-contents/img/bow-mine/explode_cannon.gif "はかい砲")