【いなずまの剣(改)】

「いなずまの剣」の使い方

剣をメインハンドに持った状態で右クリックすると以下のように稲妻を放てます。


弓のアニメーションを代用しているので一人称で見るとこんな感じになります。


「いなずまの剣改」の使い方

「いなずまの剣」と同じように稲妻を放つ事もできますが、これに加えてメインハンドに持った状態で「ダッシュ+スニーク」を実行すると以下のように範囲攻撃が発動します。


射程距離は10ブロックで相手に必中で稲妻を落とせます。

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

発動中は無敵状態なのでダメージは受けませんが、その場に居続けると火の影響は受けますので使用後は速やかに退避しましょう。

攻撃力は「いなずまの剣」(ネザライト並み)の2倍近くあるので以下のように羊や牛などは一撃で倒せます。


「いなずまの剣」の取得

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

クラフトする場合

以下は無形レシピのため、アイテムの配置は自由です。
無形レシピの詳細については▶レシピの作り方(無形レシピについて)のページをご覧ください。

・「召雷の魔石」を消費する場合

▼必要な素材


▼レシピパターン


・「いなずまの矢」を消費する場合

▼必要な素材


▼レシピパターン


ショップで購入する場合

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

コマンドで取得する場合

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

「いなずまの剣改」の取得

本環境のビヘイビアパック/リソースパックなどのアドオンパックを適用しておけば、以下の方法でユニークアイテムとして「いなずまの剣改」が手に入ります。

クラフトする場合

以下は無形レシピのため、アイテムの配置は自由です。
無形レシピの詳細については▶レシピの作り方(無形レシピについて)のページをご覧ください。

・「召雷の魔石」を消費する場合

▼必要な素材


▼レシピパターン


・「いなずまの矢」を消費する場合

▼必要な素材


▼レシピパターン


ショップで購入する場合

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

コマンドで取得する場合

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

サーバー側の実装


右クリック時の稲妻の召喚

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

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

今回はデータ値を使用していないのでアイテムID("thunder-sword" or "thunder-sword-revised")を参照してアイテムの使用を判断しています。

稲妻を落とす先の座標を計算するロジックは「いなずまの弓」を実装した時のものをそのまま利用しています。


範囲攻撃時の稲妻の召喚

▶スウィープロッド(範囲攻撃)の実装で使っていた"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の登録

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


新規実装箇所

受信したイベントデータをコマンド名へ変換する処理を以下のコマンドディスパッチャーへ追加します。
※ここではthunder_swordthunder_sword_revisedというアイテム名を検知しています。
※以下の黄色の部分が今回追加したところです。
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'] === 'bow')
                {
                    return CommandQueueEnumForMinecraft::ITEM_USED->value;
                }

                // 矢イベントの場合
                if($p_dat['data']['body']['item']['id'] === 'arrow')
                {
                    return CommandQueueEnumForMinecraft::ITEM_USED->value;
                }


                // 「いなずまの剣」イベントの場合
                if($p_dat['data']['body']['item']['id'] === 'thunder_sword' || $p_dat['data']['body']['item']['id'] === 'thunder_sword_revised')
                {
                    return CommandQueueEnumForMinecraft::ITEM_USED->value;
                }

            }
            ・
            ・
            ・
        }
    }
}
                    

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

        // 受信データの取得
        $rcv = $p_param->getRecvData();

        // ディスパッチャー強制
        $p_param->setForcedDispatcher(true);

        // 弓タイプの設定
        $p_param->setTempBuff(['bow_type' => $rcv['data']['body']['item']['aux']]);


        // 「いなずまの弓」「いなずまの剣(改)」以外
        if(
            $rcv['data']['body']['item']['aux'] !== 401
        &&  $rcv['data']['body']['item']['id'] !== 'thunder_sword'
        &&  $rcv['data']['body']['item']['id'] !== 'thunder_sword_revised'
        )

        {
            return CommandStatusEnumForMinecraft::ARROW->value;
        }

        $x = (float)$rcv['data']['body']['player']['position']['x'];
        $y = (float)$rcv['data']['body']['player']['position']['y'];
        $x = (float)$rcv['data']['body']['player']['position']['z'];
        $y_rot = (float)$rcv['data']['body']['player']['yRot'];
        $y_rot_abs = abs($y_rot);

        // Z座標の計算
        $z = cos(deg2rad($y_rot_abs)) * 5;

        // X座標の計算
        $x = sin(deg2rad($y_rot_abs)) * 5;
        if($y_rot > 0)
        {
            $x = -$x;
        }

        // コマンド送信
        $cmd_data = $p_param->getCommandDataForSummonThunder($x, 0, $z, $rcv['data']['body']['item']['id']);
        $data =
        [
            'data' => $cmd_data
        ];
        $p_param->setSendStack($data);


        if($rcv['data']['body']['item']['aux'] === 401)
        {
            return CommandStatusEnumForMinecraft::ARROW->value;
        }
        return null;

    };
}
                    

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

        // 受信データの取得
        $rcv = $p_param->getRecvData();

        // 「スウィープロッド(範囲攻撃)」実行のコマンド送信
        $cmd_data = $p_param->getCommandDataForSweepRod($rcv['data']['body']['player']['name']);
        $data =
        [
            'data' => $cmd_data
        ];
        $p_param->setSendStack($data);


        // 「いなずまの剣改」実行のコマンド送信
        $cmd_data = $p_param->getCommandDataForThunderSwordRevised($rcv['data']['body']['player']['name']);
        $data =
        [
            'data' => $cmd_data
        ];
        $p_param->setSendStack($data);


        return null;
    };
}
                    

おわりに

鉄の剣やダイヤモンドの剣などのネイティブな武器は▶ルートテーブルの書き方のページでご紹介したようなデータ値は使えませんので今回はリソースパックでアイテムを追加しています。

デザインセンスはひとまず置いておくとして折角リソースパックを触るので、他のアイテムと区別が出来るように見た目も変えています。