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

はじめに

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

▼不動の魔石(customize:immovable_stone)


▼浮遊の羽(customize:floating_feather)



「不動の魔石」の使い方

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

階段ブロックはもちろん座れます。


板ガラスでも座れます。


木の上でも座れます。


地面の中でも座れます。


「浮遊の羽」の使い方

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

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というアイテム名を検知しています。
※以下の黄色の部分が今回追加したところです。
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'] === 'immovable-stone')
                {
                    return CommandQueueEnumForMinecraft::ITEM_USED->value;
                }

                // 「浮遊の羽」イベントの場合
                if($p_dat['data']['body']['item']['id'] === 'floating-feather')
                {
                    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']);
        ・
        ・
        ・

        // 不動の魔石
        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;
        }

        ・
        ・
        ・
    };
}