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

# 動作環境

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


# 「不動の杖」の使い方

杖をメインハンドに持った状態で右クリックすると以下のように範囲内の相手を動けないようにします。
牛のモーションがないので少し分かり辛いですが強制的に座らせて足止めしています。
![足止め発動](https://socket-manager.github.io/document/minecraft-contents/img/immovable-rod/immovable.gif "足止め発動")

その状態で以下のように「ダッシュ＋スニーク」を実行すると術中の相手を浮遊させる事ができます。
![浮遊発動](https://socket-manager.github.io/document/minecraft-contents/img/immovable-rod/floating.gif "浮遊発動")

「ダッシュ＋スニーク」で発動する範囲発動型の処理は以下ページの「スウィープロッド（範囲攻撃）」で実装したものをそのまま使っています。

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

そしてある程度の高さになってからもう一度杖を使うと浮遊状態が解除されますので、以下のように落下ダメージで倒す事ができます。
![浮遊解除](https://socket-manager.github.io/document/minecraft-contents/img/immovable-rod/release.gif "浮遊解除")

攻撃力は鉄の剣並みなので、以下のように足止めした状態でも比較的サクっと倒せます。
![攻撃](https://socket-manager.github.io/document/minecraft-contents/img/immovable-rod/attack.gif "攻撃")

足止め（右クリック）と浮遊発動（ダッシュ＋スニーク）の射程距離は共に１０ブロックですが、浮遊解除の射程制限はありません。


# 「不動の杖」の取得

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

### クラフトする場合

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

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

構成アイテムの詳細とカスタムレシピの作り方は以下のページでご紹介しています。

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

https://qiita.com/glasses_seven/items/0529d05f2b833a9f9cae/

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

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

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

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

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


# サーバー側の実装

### 右クリック時の足止め

今まで実装したアイテムと同様に今回の実装でも"ItemUsed"というサブスクライブイベントを使用しています。
また、以下の実装で使っていたモブの搭乗が可能なダミーエンティティをコントロールしています。

https://qiita.com/glasses_seven/items/876eb47c3e38828428e4/

足止め発動時の処理の流れは以下の通りです。

<dl>
    <dt>1)召喚済みのダミーエンティティを消去（デスポーン）</dt>
    <dd>タグをセレクターとして<code>kill</code>コマンドを発行</dd>
    <dt>2)モブが搭乗可能なダミーエンティティを足元へ召喚</dt>
    <dd>サーバーから１０ブロックの範囲指定で<code>summon</code>コマンドを発行</dd>
    <dt>3)召喚したダミーエンティティへタグを付与</dt>
    <dd>サーバーから<code>tag</code>コマンドを発行</dd>
</dl>

1)のデスポーンの処理には以下の２つの意味があります。<br />

<dl>
    <dt>ダミーエンティティの数の制限</dt>
    <dd>範囲指定なしでデスポーンする事によりワールド上で一定以上増えないようにする</dd>
    <dt>浮遊解除</dt>
    <dd>範囲指定なしでデスポーンする事により浮遊中の相手の浮遊状態を解除できる</dd>
</dl>

:::note info
ダミーエンティティの作り方は以下のページでご紹介しています。
:::

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

https://qiita.com/glasses_seven/items/0670face6b1f3b93969a/

### 「ダッシュ＋スニーク」時の浮遊発動

「スウィープロッド（範囲攻撃）」の実装で使っていた"PlayerTravelled"というサブスクライブイベントを使用しています。
`travelMethod`の値（7:スニーク、8:ダッシュ）をみてそのイベントがスニークなのかダッシュなのかを判断できるようになっています。

ダミーエンティティには物理法則を適用していないので、上記のイベントを受信した時に`damage`コマンドでノックバックを発動させる事により、慣性による浮遊状態が働いています。

---

サブスクライブイベントの処理内容については以下の記事をご覧ください。

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

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

https://socket-manager.github.io/document/minecraft-contents/immovable-rod

# おわりに

今回のタグ付けはプレイヤーのマインクラフトアカウント名を使って付与しているので、基本的に他のプレイヤーと被る事はありませんが、同時使用で発動領域が被る時には先勝ち発動となります。
ダミーエンティティをデスポーンする時もユニークタグをセレクターとしているので、他のプレイヤーが使用中にデスポーンさせられる心配もありません。
発動領域が被って先勝ち発動したとしても足止めや浮遊の目的で使用するので大きな問題になる事はないでしょう。

:::note info
カスタムアイテムの作り方は以下のページでご紹介しています。
:::

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

https://qiita.com/glasses_seven/items/633a9c4a3ad9c4b13d21/

https://qiita.com/glasses_seven/items/93ffdf68edb5e1f806bc/

https://qiita.com/glasses_seven/items/8d87b5f6b8ccea706dce/