【はやぶさの剣】

瞬間移動

剣をメインハンドに持った状態で右クリックすると前方へ瞬間移動します。


ウインドチャージの爆発力を利用しているので周囲の相手を蹴散らしつつ移動する事ができます。
そして移動中は無敵状態のため回避行動として利用する事もできます。
水中を歩く時もこれを使った方が断然早く移動できます。



はやぶさ斬り

剣をメインハンドに持った状態にして「ダッシュ+スニーク」で発動できます。


発動したら相手の背後に周りつつ大ダメージ(15ポイント)を与えます。
攻撃力はダイアモンドの剣並みなので、装備を身に着けていないハスク相手であれば発動後の一振りで倒せます。
射程距離は少し長めの15ブロックなので範囲攻撃が使える「いなずまの剣改」を持った対人戦であっても瞬間移動を交えつつカウンターが狙えます。

以下のように瞬間移動とのコンボ発動も可能です。


タイミングを合わせるのが少し難しいですが、「はやぶさ斬り」で大ダメージを与えつつ二撃目の「瞬間移動」の爆発力で距離を取りながらダメージを与え、宙に浮かせた後の落下ダメージでトドメを刺す事ができます。

「ダッシュ+スニーク」で発動する範囲攻撃のイベント処理は以下ページの「スウィープロッド(範囲攻撃)」で実装したものをそのまま使っています。
▶スウィープロッド(範囲攻撃)


「はやぶさの剣」の取得

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

クラフトする場合

▼必要な素材


▼レシピパターン


ショップで購入する場合

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

コマンドで取得する場合

以下はワールドオーナーやシステム組み込み用としてコマンドで取得する方法です。

瞬間移動の杖

この杖はゾンビやハスクが持っている事があるのでドロップ品として手に入ります。
以下のショップでも購入できます。
▶ネットショップ

弓で矢を放つ時と同様に右クリックのチャージ時間の長さに比例して移動距離が長くなりますので移動手段としても使えます。


使い方

チャージが短い時


チャージが長い時


きのこの上に移動


サーバー側の実装


右クリック時の瞬間移動

今まで実装したアイテムと同様に今回の実装でも"ItemUsed"というサブスクライブイベントを使用しています。
マインクラフト上でアイテムを使ったと認識されると発生するイベントのようで、フレームワークを使って以下の内容を実装しています。

※サブスクライブイベントの処理内容については>> こちらでご紹介しています。
「はやぶさの剣」を使った時に発生するイベントデータの形式
{
    "body":
    {
        "count":<数字>,
        "item":
        {
            "aux":<数字>,
            "id":"hayabusa-sword",
            "namespace":"customize"
        },
        "player":
        {
            "color":<16進数?>,
            "dimension":<数字>,
            "id":<数字>,
            "name":<文字列>,
            "position":
            {
                "x":<数字>,
                "y":<数字>,
                "z":<数字>
            },
            "type":<文字列>,
            "variant":<数字>,
            "yRot":<数字>
        },
        "useMethod":<数字>
    },
    "header":
    {
        "eventName":"ItemUsed",
        "messagePurpose":<文字列>,
        "version":<数字>
    }
}
                    
今回はデータ値を使用していないのでアイテムID("hayabusa-sword")を参照してアイテムの使用を判断しています。

瞬間移動発動時の処理の流れは以下の通りです。
1)プレイヤーの背後にテレポート先となるダミーエンティティの召喚
召喚と同時にマインクラフトアカウント名を基にしたnameタグを付与
2)召喚したダミーエンティティの背後にウインドチャージを召喚
ダミーエンティティに触れるように召喚する事で爆発を促す
3)爆風で飛ばしたダミーエンティティの位置へテレポート
ダミーエンティティのnameタグをセレクターとしてテレポート
4)ダミーエンティティのデスポーン
ダミーエンティティのnameタグをセレクターとしてkill

範囲攻撃時のはやぶさ斬り

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

スニーク or ダッシュ時に発生するイベントデータの形式
{
    "body":
    {
        "isUnderwater":<ブール値>,
        "metersTravelled":<数字>,
        "newBiome":<数字>,
        "player":
        {
            "color":<16進数?>,
            "dimension":<数字>,
            "id":<数字>,
            "name":<文字列>,
            "position":
            {
                "x":<数字>,
                "y":<数字>,
                "z":<数字>
            },
            "type":<文字列>,
            "variant":<数字>,
            "yRot":<数字>
        },
        "travelMethod":7(スニーク) or 8(ダッシュ)
    },
    "header":
    {
        "eventName":"PlayerTravelled",
        "messagePurpose":<文字列>,
        "version":<数字>
    }
}
                    

▶いなずまの弓実装時と同様「瞬間移動」のダミーエンティティの配置や、「はやぶさ斬り」発動時の相手の背後へ廻る時の処理は、ヨー角を基にした全方位型の座標計算ロジックを使っています。

以上の事を踏まえて今回は以下のように実装しています。


キューとステータスUNITの登録

今回は「いなずまの弓」と「スウィープロッド(範囲攻撃)」の処理をそのまま使っているので追加分はありません。


新規実装箇所

受信したイベントデータをコマンド名へ変換する処理を以下のコマンドディスパッチャーへ追加します。
※ここではhayabusa_swordというアイテム名を検知しています。
※以下の黄色の部分が今回追加したところです。
app/InitClass/InitForMinecraft.php
public function getCommandDispatcher()
{
    return function(ParameterForMinecraft $p_param, $p_dat): ?string
    {
        $minecraft = $p_param->isMinecraft();
        if($minecraft === true)
        {
            ・
            ・
            ・
            if(isset($p_dat['data']['header']['eventName']) && $p_dat['data']['header']['eventName'] === 'ItemUsed')
            {
                ・
                ・
                ・

                // 「はやぶさの剣」イベントの場合
                if($p_dat['data']['body']['item']['id'] === 'hayabusa_sword')
                {
                    return CommandQueueEnumForMinecraft::ITEM_USED->value;
                }

            }
            ・
            ・
            ・
        }
    }
}
                    

「いなずまの弓」を実装した時のUNIT処理を以下のように修正しています。
※以下の黄色の部分が今回追加したところです。
app/CommandUnits/CommandForMinecraft.php
protected function getItemUsedStart()
{
    return function(ParameterForMinecraft $p_param): ?string
    {
        ・
        ・
        ・

        if($rcv['data']['body']['item']['id'] === 'hayabusa_sword')
        {
            // コマンド送信
            $cmd_datas = $p_param->getCommandDataForHayabusaSwordUse(
                $rcv['data']['body']['player']['position']['x'],
                $rcv['data']['body']['player']['position']['y'],
                $rcv['data']['body']['player']['position']['z'],
                $rcv['data']['body']['player']['yRot']
            );
            foreach($cmd_datas as $cmd_data)
            {
                $data =
                [
                    'data' => $cmd_data
                ];
                $p_param->setSendStack($data);
            }

            return null;
        }

        ・
        ・
        ・
    };
}
                    

範囲攻撃実行のUNIT処理を以下のように修正しています。
※以下の黄色の部分が今回追加したところです。
app/CommandUnits/CommandForMinecraft.php
protected function getMinecraftPlayerDashStart()
{
    return function(ParameterForMinecraft $p_param): ?string
    {
        ・
        ・
        ・

        // 「はやぶさの剣」コマンド送信(持ち物検査)
        $cmd_data = $p_param->getCommandDataForHayabusaSwordMainhandTest($rcv['data']['body']['player']['name']);
        $data =
        [
            'data' => $cmd_data
        ];
        $p_param->setSendStack($data);

        ・
        ・
        ・
    };
}