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

# はじめに

今回実装したものはウインドチャージを使っているので、繰気弾ならぬ繰風弾の杖として作成しています。
このアイテムは杖を使って繰風弾をコントロールできるのが特徴です。

Websocketサーバーと連携して「スウィープロッド」を実装した時に使っていた「ダッシュ＋スニーク」を実行する事で、以下のように繰風弾を頭上に召喚する事ができます。
![繰風弾の召喚](https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/summon.gif "繰風弾の召喚")

https://qiita.com/glasses_seven/items/3c86bf82b5e7b09cfc79/

ブロックが破壊できないのはそのままですが、通常のウインドチャージに加えて爆発によるダメージを付与する事で威力を上げています。


# 動作環境

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


# 繰風弾の制御方法

以下のようにプレイヤーが杖を振った方向へ繰風弾をコントロールする事ができます。
![繰風弾の左右移動](https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/single-control.gif "繰風弾の左右移動")

ブロック単位で動かせるので、ある程度の細かいコントロールは可能です。

しゃがんだ状態で杖を振ると下降し、地中に潜らせる事もできます。
また、杖を持った状態でスニーク移動すると上昇します。
![繰風弾の上下移動](https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/under-control.gif "繰風弾の上下移動")

以下のように複数の繰風弾をコントロールする事もできます。
![複数の繰風弾コントロール](https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/multi-control.gif "複数の繰風弾コントロール")


# 繰風弾の処理方法

自身で処理する場合は、以下のように繰風弾の核を叩けば一撃で倒す事ができます。
![通常攻撃による撃墜](https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/self-kill.gif "通常攻撃による撃墜")

これは相対する側にとっても同様で、核を叩く事で被害から免れる事ができます。

「はやぶさの剣」の射程距離内であれば、相手が空中であっても「はやぶさ斬り」を使って必中で倒す事もできます。
![はやぶさの剣による撃墜](https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/hayabusa-kill.gif "はやぶさの剣による撃墜")

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


# 「繰風弾の杖」の取得

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

### クラフトする場合

▼必要な素材
![必要な素材](https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/recipe-material.png "必要な素材")

▼レシピパターン
<img src="https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/recipe.png" />　<img src="https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/recipe-left.png" />　<img src="https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/recipe-right.png" />

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

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

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

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

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


# サーバーサイドの処理

今回の実装では「ダッシュ＋スニーク」時の召喚処理も含めて、杖による繰風弾のコントロールをサーバーサイドがメインで行っています。
また、「Websocketサーバーのイベントデータ」のページでご紹介させて頂いたイベントデータを使って、以下の方法で繰風弾の移動先の座標を計算しています。

<br />
<dl>
    <dt>前後左右方向のコントロール</dt>
    <dd><code>ItemUsed</code>イベント受信後、「いなずまの弓」実装時に利用した計算方法で移動先の座標を算出。</dd>
    <dt>下方向のコントロール</dt>
    <dd>プレイヤーがしゃがんだ状態を<code>ItemUsed</code>イベントのバリアント値で検知するようにして現在位置の下の座標を算出。</dd>
    <dt>上方向のコントロール</dt>
    <dd><code>PlayerTravelled</code>イベントでスニーク移動を検知した時に現在位置の上の座標を算出。</dd>
</dl>
<br />

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

<br />
なお、繰風弾の召喚時にマインクラフトユーザー名をタグとして付与しているので、他のプレイヤーと競合する事はありません。


# おわりに

実際に動く相手を杖でコントロールしながら当てようとすると思いのほか難しいので、今回の実装でヤムチャの偉大さを改めて感じさせられましたｗ

実用的な方法としては繰風弾で弾幕を張りながら相手に当てるか、以下のように壁や地中に潜らせておいて相手が通りかかったら攻撃をしかけるのがいいでしょう。
![地中からの攻撃](https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/ground-attack.gif "地中からの攻撃")
![壁からの攻撃](https://socket-manager.github.io/document/minecraft-contents/img/wind-control-rod/wall-attack.gif "壁からの攻撃")

ちなみに、一度に召喚できる繰風弾の数に制限はありません。

今回は「発射アイテム」としての杖を実装後、「ダミーエンティティ」を作成して「発射体エンティティ」として発射する事で、サーバーサイドでのイベント検知を行っています。

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

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

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