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

# はじめに

剣を装備した状態で右クリックするとライトバレット（光の弾丸）を発射できます。
![ライトバレットの発射（昼間）](http://socket-manager.github.io/document/minecraft-contents/img/light-sword/shoot-daytime.gif "ライトバレットの発射（昼間）")

動画データが間引きされているので少しわかりにくいですが、キーの押しっぱなしで機関銃のように連射できます（威力は矢と同等）。
「風の杖」の実装時にご紹介した補充アイテム要らずの無限打ちの実装を行っているので弾切れの心配もありません。

https://qiita.com/glasses_seven/items/3135aab823428dcc708e/

![ライトバレットの発射（夜間）](http://socket-manager.github.io/document/minecraft-contents/img/light-sword/shoot-night.gif "ライトバレットの発射（夜間）")

ライトバレットは発光しているので、夜間や暗闇でも視認する事ができます。


# 動作環境

<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>


# モード切替

「暴風の杖」の実装時と同じように、Websocketサーバーと連携する事で「スウィープロッド」の実装時に使っていた「ダッシュ＋スニーク」を実行して、モード切替（バレットモード／シールドモード）が可能です。

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

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

### 切替時のメッセージ

モード切替を行うとウィスパーを通して以下のように天の声が流れてきます。

▼バレットモード⇒シールドモード
<img src="https://socket-manager.github.io/document/minecraft-contents/img/light-sword/shield-from-bullet.png" height="333px" width="500px" />

▼シールドモード⇒バレットモード
<img src="https://socket-manager.github.io/document/minecraft-contents/img/light-sword/bullet-from-shield.png" height="333px" width="500px" />


# シールドモードでの使い方

剣を装備した状態で右クリックすると、目の前に２ブロック分のライトシールド（光の盾）が展開されます。
フレーム部分以外は透明なので、反対側の様子を伺いながら戦う事も可能です。
![シールドの展開](http://socket-manager.github.io/document/minecraft-contents/img/light-sword/shield-summon.gif "シールドの展開")

上の画面のように、このシールドはバリアブロックと同じ性質を持つのでサバイバルモードでは壊す事ができませんが、時間制限（３０秒）があるのでタイムアウトと同時に消滅します。
ちなみに同時に展開できる回数に制限はありません。

以下のように「いかずちの杖」や「はかいのつるぎ」でシールドに向かって攻撃されても手前で威力を無力化できます。
![いかずちの杖による攻撃](http://socket-manager.github.io/document/minecraft-contents/img/light-sword/thunder-rod-attack.gif "いかずちの杖による攻撃")
![はかいのつるぎによる攻撃](http://socket-manager.github.io/document/minecraft-contents/img/light-sword/explode-sword-attack.gif "はかいのつるぎによる攻撃")

光源は松明と同様のレベル１５なので、夜間や洞窟などでも周りを明るく照らしてくれます。
また、周りに敵がいると、以下のようにオートでライトバレットを発射してくれます。
![シールドからのライトバレット発射](http://socket-manager.github.io/document/minecraft-contents/img/light-sword/shield-bullet.gif "シールドからのライトバレット発射")

シールドからターゲットを検知してライトバレットを発射するしくみは、透明な無敵のエンティティを立ててマインクラフトに内臓されているAI機能を利用しています。


# ブロックモードでの使い方

シールドモード時にしゃがんだ状態で右クリックすると、ライトシールドをブロックモードで設置可能、かつ時間制限もないので松明代わりに使えます。
ちなみに素手で簡単に壊す事ができますが、以下のようにブロック内は素通りできますので通行の邪魔になる事もありません。
![ブロックモードでの設置](http://socket-manager.github.io/document/minecraft-contents/img/light-sword/through-block.gif "ブロックモードでの設置")

素手で壊すとドロップはしませんがシルクタッチを使うと回収できますので、松明代わりに手元でストックしておいたり、建築材料としても使えます。
但し光の剣で設置する場合とは異なり、ドロップしたブロックを設置すると通り抜けはできませんので、発光するところ以外は通常のガラスと同じ性質になります。

▼建築材料として利用
<img src="https://socket-manager.github.io/document/minecraft-contents/img/light-sword/window-use.png" height="333px" width="500px" />

窓に使用するとかなりの明るさがあるので、松明などの余計な照明を設置する必要もなくなってすっきりします。

▼内装
<img src="http://socket-manager.github.io/document/minecraft-contents/img/light-sword/indoor.png" height="333px" width="500px" />

天井照明は邪魔にならないようにダウンライト風にしています。


# 「光の剣」の取得

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

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

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

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

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

以下はワールドオーナーやシステム組み込み用としてコマンドで取得する方法です。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/light-sword/get-item-command.png" height="333px" width="500px" />
<img src="https://socket-manager.github.io/document/minecraft-contents/img/light-sword/get-item-light-sword.png" height="333px" 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サーバーのイベントデータ」のページでご紹介させて頂いたイベントデータを使って、以下の方法で設置先の座標を計算しています。

<dl>
    <dt>シールドの設置</dt>
    <dd><code>ItemUsed</code>イベント受信後、「いなずまの弓」実装時に利用した計算方法で設置先の前方座標を算出。</dd>
    <dt>ブロックモードでの設置</dt>
    <dd>プレイヤーがしゃがんだ状態を<code>ItemUsed</code>イベントのバリアント値で検知するようにして設置先の前方座標を算出。</dd>
</dl>

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


# おわりに

「召雷の魔石」実装時と同じようにWebsocketサーバーを介したネットショップとの接続中は発射できないようにしています。

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

<br />
また、「ダッシュ＋スニーク」によるモード切替もサーバー側で行っていますが、いずれも「エンティティプロパティ」を使ってスイッチングを行っています。

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

<br />
今回のアイテムの実装は「発射アイテム」の作り方を基に応用したものです。

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

<br />
発射体エンティティの作り方については以下のページをご覧ください。

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

カスタムブロックの作り方については以下のページをご覧ください。

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

シールドモードで使えるブロックの種類は以下のページでもご紹介しています。

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