【不動の杖構成アイテム】

はじめに

ここでは「不動の杖」レシピの構成要素となっている以下のアイテムをご紹介します。

▼不動の魔石(customize:immovable_stone)
アイテムスロット上の「不動の魔石」アイコン

▼浮遊の羽(customize:floating_feather)
アイテムスロット上の「浮遊の羽」アイコン


「不動の魔石」の使い方

メインハンドに持った状態で右クリックするとどこでも座る事ができます。

階段ブロックはもちろん座れます。
「不動の魔石」を使って階段ブロックへ座る様子

板ガラスでも座れます。
「不動の魔石」を使って板ガラスで座っている様子

木の上でも座れます。
「不動の魔石」を使って木の上で座っている様子

地面の中でも座れます。
「不動の魔石」を使って地面の中で座っている様子

「浮遊の羽」の使い方

メインハンドに持った状態で右クリックすると少しの間、宙に浮く事ができます。

1回の使用ではこんな感じになります。
「浮遊の羽」の1回の使用で浮遊する距離

効果が切れる前に連続で使用すると、延々と高く浮遊する事ができます。
「浮遊の羽」の連続使用で高く浮遊している様子

浮遊中に移動する事もできます。
「浮遊の羽」を使って空中で移動

「不動の魔石」の取得

ゲーム内では釣りで取得する事ができます。

以下はワールドオーナーやシステム組み込み用としてコマンドで取得する方法です。
「不動の魔石」取得コマンド
「不動の魔石」取得後のアイテムスロット

「浮遊の羽」の取得

ゲーム内では釣り、鶏のドロップ品として取得する事ができます。

以下はワールドオーナーやシステム組み込み用としてコマンドで取得する方法です。
「浮遊の羽」取得コマンド
「浮遊の羽」取得後のアイテムスロット

サーバー側の実装


右クリック時の処理

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

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

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

「不動の魔石」の処理は▶階段チェアの時と同じように搭乗可能なダミーエンティティを召喚してからプレイヤーを搭乗させています。
「浮遊の羽」の方はlevitation(浮遊)のエフェクトコマンドを呼んでいるだけです。

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


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

今回は「いなずまの弓」の処理をそのまま使っているので追加分はありません。


新規実装箇所

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

                // 「浮遊の羽」イベントの場合
                if($p_dat['data']['body']['item']['id'] === 'floating-feather')
                {
                    return CommandQueueEnumForMinecraft::ITEM_USED->value;
                }

            }
            ・
            ・
            ・
        }
    }
}
                    

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

        // 不動の魔石
        if($rcv['data']['body']['item']['id'] === 'immovable_stone')
        {
            // コマンド送信
            $cmd_datas = $p_param->getCommandDataForImmovableStone();
            foreach($cmd_datas as $cmd_data)
            {
                $data =
                [
                    'data' => $cmd_data
                ];
                $p_param->setSendStack($data);
            }

            // 階段チェア着席フラグの設定
            $p_param->setTempBuff(['chair_flag' => true]);

            return null;
        }

        // 浮遊の羽
        if($rcv['data']['body']['item']['id'] === 'floating_feather')
        {
            // コマンド送信
            $cmd_datas = $p_param->getCommandDataForFloatingFeather();
            foreach($cmd_datas as $cmd_data)
            {
                $data =
                [
                    'data' => $cmd_data
                ];
                $p_param->setSendStack($data);
            }

            return null;
        }

        ・
        ・
        ・
    };
}