【はかいの矢】

はじめに

以下のように矢を放った場所が爆発します。
二段ジャンプの様子

ちなみに先に作っていた「いなずまの弓」とコンボするとこんなイメージ。
いなずまの弓とのコンボ発動の様子

あまり使い過ぎるとワールド地形が悲惨な事になるので注意しましょう。

「はかいの矢」の取得

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

ショップで購入する場合

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

コマンドで取得する場合

以下はワールドオーナーやシステム組み込み用としてコマンドで取得する方法です。
「はかいの矢」取得コマンド
「はかいの矢」取得後のアイテムスロット
以下のようにスロットを置き換える事で「いなずまの矢」と使い分けができます。
いなずまの弓とのコンボ発動の様子

スロット番号は以下のように左から順番に割り振られています。アイテム使用時は若い数字の方が優先されます。
アイテムスロットの割り当て番号
※スロット番号についてはインベントリの詳細も含めて>> こちらのページで詳しく説明されています。

サーバー側の実装

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

※サブスクライブイベントの処理内容については>> こちらでご紹介しています。
{
    "body":
    {
        "count":<数字>,
        "item":
        {
            "aux":421,
            "id":"arrow",
            "namespace":<文字列>
        },
        "player":
        {
            "color":<16進数?>,
            "dimension":<数字>,
            "id":<数字>,
            "name":<文字列>,
            "position":
            {
                "x":<数字>,
                "y":<数字>,
                "z":<数字>
            },
            "type":<文字列>,
            "variant":<数字>,
            "yRot":<数字>
        },
        "useMethod":<数字>
    },
    "header":
    {
        "eventName":"ItemUsed",
        "messagePurpose":<文字列>,
        "version":<数字>
    }
}
                    

今回の実装は「いなずまの矢」とほとんど同じです。
「いなずまの矢」の場合は最後にsummonコマンドで雷を呼び出していましたが、今回はエンドクリスタルを呼び出しています。

以上の事を踏まえて今回は「いなずまの矢」の実装時に追加したUNIT処理へ以下の処理を追加しています。

※以下の黄色の部分が今回追加したところです。
※ここでは2つ目のItemUsedイベントを受信(aux=421)した時にマインクラフトへfunctionコマンドを送信(getCommandDataForExplodeArrowメソッドでコマンド文字列を生成)しています。
protected function getItemUsedArrow()
{
    return function(ParameterForMinecraft $p_param): ?string
    {
        $p_param->logWriter('debug', ['MINECRAFT ITEM_USED:ARROW' => 'START']);

        $sta = $p_param->getStatusName();

        // 受信データの取得
        $rcv = $p_param->getRecvData();
        if($rcv === null)
        {
            // ディスパッチャー強制
            $p_param->setForcedDispatcher(true);
            return $sta;
        }

        // ItemUsed以外のイベントの判定
        if(!(isset($rcv['data']['header']['eventName']) && $rcv['data']['header']['eventName'] === 'ItemUsed'))
        {
            return $sta;
        }

        // 弓タイプの取得
        $bow_type = $p_param->getTempBuff(['bow_type']);

        // 通常の矢の場合
        if($rcv['data']['body']['item']['aux'] === 0)
        {
            // コマンド送信
            $cmd_data = $p_param->getCommandDataForArrowTagNormal($rcv['data']['body']['player']['name']);
            $data =
            [
                'data' => $cmd_data
            ];
            $p_param->setSendStack($data);
            return null;
        }

        // コマンド送信
        $cmd_data = $p_param->getCommandDataForArrowTagCheat($rcv['data']['body']['player']['name']);
        $data =
        [
            'data' => $cmd_data
        ];
        $p_param->setSendStack($data);

        // コマンドデータの取得
        if($rcv['data']['body']['item']['aux'] === 411)
        {
            // いなずまの矢
            $cmd_data = $p_param->getCommandDataForThunderArrow($rcv['data']['body']['player']['name']);
        }

        else
        if($rcv['data']['body']['item']['aux'] === 421)
        {
            // はかいの矢
            $cmd_data = $p_param->getCommandDataForExplodeArrow($rcv['data']['body']['player']['name']);
        }


        // コマンド送信
        $data =
        [
            'data' => $cmd_data
        ];
        $p_param->setSendStack($data);

        return null;
    };
}