装備やタグの検知ができる万能コンポーネントenvironment_sensorの解説

環境センサー アドオン中級編

はじめに

今回はエンティティの状態(環境)によってコマンドを実行したりする事ができるコンポーネント。

environment_sensorについて解説をしていきます。

今回はプレイヤーに特定のタグが付いていたらHPの最大値が変わるようにするのを目標にします。

また、エンティティファイルの構成を知らない場合こちらの記事を先に読む事をおススメします

(この記事で言う部品の詳細を今回は解説します)

エンティティの中身の共通の決まりに関して解説しています

難易度:簡単

player.jsonの作成

まずはplayer.jsonの作成を行います。BP->entitiesのフォルダにplayer.jsonのファイルが無かったら作成しましょう。

作成したら今回は以下のコードをコピペして貼り付けましょう。長いですが全て載せているのでコピペするだけで大丈夫です。コードの詳細は後に解説します。

{
    "format_version": "1.18.20",
    "minecraft:entity": {
        "description": {
            "identifier": "minecraft:player",
            "is_spawnable": false,
            "is_summonable": false,
            "is_experimental": false
        },
        "component_groups": {
            "power_up": {
                "minecraft:movement": {
                    "value": 1
                },
                "minecraft:attack": {
                    "damage": 50
                },
                "minecraft:health": {
                    "value": 80,
                    "max": 80
                }
            },
            "default": {
                "minecraft:movement": {
                    "value": 0.1
                },
                "minecraft:attack": {
                    "damage": 1
                },
                "minecraft:health": {
                    "value": 20,
                    "max": 20
                }
            }
        },
        "components": {
            "minecraft:experience_reward": {
                "on_death": "Math.Min(query.player_level * 7, 100)"
            },
            "minecraft:type_family": {
                "family": [
                    "player"
                ]
            },
            "minecraft:is_hidden_when_invisible": {},
            "minecraft:loot": {
                "table": "loot_tables/empty.json"
            },
            "minecraft:collision_box": {
                "width": 0.6,
                "height": 1.8
            },
            "minecraft:can_climb": {},
            "minecraft:movement": {
                "value": 0.1
            },
            "minecraft:attack": {
                "damage": 1
            },
            "minecraft:hurt_on_condition": {
                "damage_conditions": [
                    {
                        "filters": {
                            "test": "in_lava",
                            "subject": "self",
                            "operator": "==",
                            "value": true
                        },
                        "cause": "lava",
                        "damage_per_tick": 4
                    }
                ]
            },
            "minecraft:exhaustion_values": {
                "heal": 6,
                "jump": 0.05,
                "sprint_jump": 0.2,
                "mine": 0.005,
                "attack": 0.1,
                "damage": 0.1,
                "walk": 0,
                "sprint": 0.01,
                "swim": 0.01
            },
            "minecraft:player.saturation": {
                "value": 5,
                "max": 20
            },
            "minecraft:player.exhaustion": {
                "value": 0,
                "max": 20
            },
            "minecraft:player.level": {
                "value": 0,
                "max": 24791
            },
            "minecraft:player.experience": {
                "value": 0,
                "max": 1
            },
            "minecraft:breathable": {
                "total_supply": 15,
                "suffocate_time": -1,
                "inhale_time": 3.75,
                "generates_bubbles": false
            },
            "minecraft:nameable": {
                "always_show": true,
                "allow_name_tag_renaming": false
            },
            "minecraft:physics": {},
            "minecraft:pushable": {
                "is_pushable": false,
                "is_pushable_by_piston": true
            },
            "minecraft:insomnia": {
                "days_until_insomnia": 3
            },
            "minecraft:rideable": {
                "seat_count": 2,
                "family_types": [
                    "parrot_tame"
                ],
                "pull_in_entities": true,
                "seats": [
                    {
                        "position": [0.4,-0.2,-0.1],
                        "min_rider_count": 0,
                        "max_rider_count": 0,
                        "lock_rider_rotation": 0
                    },
                    {
                        "position": [-0.4,-0.2,-0.1],
                        "min_rider_count": 1,
                        "max_rider_count": 2,
                        "lock_rider_rotation": 0
                    }
                ]
            },
            "minecraft:conditional_bandwidth_optimization": {},
            "minecraft:block_climber": {},
            "minecraft:environment_sensor": {
                "triggers": [
                    {
                        "filters": {
                            "all_of": [
                                {
                                    "test": "has_tag",
                                    "subject": "self",
                                    "operator": "==",
                                    "value": "p"
                                }
                            ]
                        },
                        "event": "power_up_event"
                    },
                    {
                        "filters": {
                            "all_of": [
                                {
                                    "test": "has_tag",
                                    "subject": "self",
                                    "operator": "!=",
                                    "value": "p"
                                }
                            ]
                        },
                        "event": "default_event"
                    }
                ]
            }
        },
        "events": {
            "power_up_event": {
                "add": {
                    "component_groups": [
                        "power_up"
                    ]
                }
            },
            "default_event": {
                "add": {
                    "component_groups": [
                        "default"
                    ]
                }
            }
        }
    }
}

コードのコピペが完了したら保存しましょう。

■ 広告 ■

詳細の解説

今回解説する内容はcomponent内にあるenvironment_sensorの部分です。

 "minecraft:environment_sensor": {
                "triggers": [
                    {
                        "filters": {
                            "all_of": [
                                {
                                    "test": "has_tag",
                                    "subject": "self",
                                    "operator": "==",
                                    "value": "p"
                                }
                            ]
                        },
                        "event": "power_up_event"
                    },
                    {
                        "filters": {
                            "all_of": [
                                {
                                    "test": "has_tag",
                                    "subject": "self",
                                    "operator": "!=",
                                    "value": "p"
                                }
                            ]
                        },
                        "event": "default_event"
                    }
                ]
            }

一つだけの条件にする場合またカッコの種類や位置が変わるのですが基本1つしか使わない事は無いと思いますので2つ上の時の解説を行います。

一番重要なのはの部分になります。赤と青の部分は条件以外共通なので赤の場合を掘り進めます。

                    {
                        "filters": {
                            "all_of": [
                                {
                                    "test": "has_tag",
                                    "subject": "self",
                                    "operator": "==",
                                    "value": "p"
                                }
                            ]
                        },
                        "event": "power_up_event"
                    },

細かく色分けを行いました。順番に解説します。

紫のカッコ内で一つのenvironment_sensor(環境センサー)となります。個数を増やしたい場合紫のかっこを含む中身をコピペすれば良い訳ですね

filters は条件を書く箱です。

ANDもしくはOR

all_of は水色の条件に一致する場合にする呪文です。ちなみに水色の部分は複数書く事ができ、複数追加するとそれらの条件全てに一致する場合になります。

そしてall_ofともう一つany_ofという物があります。any_ofはいずれかの条件に一致した場合になります。

                 "all_of": [
                                {
                                    "test": "has_tag",
                                    "subject": "self",
                                    "operator": "==",
                                    "value": "p"
                                },
                                {
                                    "test": "has_tag",
                                    "subject": "self",
                                    "operator": "==",
                                    "value": "A"
                                }
                            ]

この場合pのタグを持っていて更にAのタグを持っていた場合になります。

                "any_of": [
                                {
                                    "test": "has_tag",
                                    "subject": "self",
                                    "operator": "==",
                                    "value": "p"
                                },
                                {
                                    "test": "has_tag",
                                    "subject": "self",
                                    "operator": "==",
                                    "value": "A"
                                }
                            ]

any_ofにした場合pのタグまたはAのタグを持っている場合になります。

例えばall_ofなんかは複数の装備を着ている時場合などにできセット装備なんかが作れます

水色の部分は飛ばして黄色い部分に行きます

“event”: “power_up_event”

これは条件に一致した場合power_up_eventというイベントを実行するといった物になります。これがいわゆる部品(component_groups)を交換する命令ですね。

フィルターの内容

次に水色の部分ですがここで詳細な条件を決定しています。

                               {
                                    "test": "has_tag",
                                    "subject": "self",
                                    "operator": "==",
                                    "value": "p"
                                },
  • test:何を指定するか(タグや装備(has_equipment)、Familyなど)
  • subject:誰を対象にするか(ここでいうotherが誰を指すのか知らないためself(自分自身)にしておくのが無難でしょう
  • operator:一致するか、または不一致かなど,==で一致、!=で不一致
  • value:値。タグの場合タグの名前、装備の場合装備の名前など

filterに関して詳しく知りたい場合公式ドキュメントを見るのが一番でしょう

■ 広告 ■

イベントの内容

一応イベントの中身も確認しておきます

  "power_up_event": {
                "add": {
                    "component_groups": [
                        "power_up"
                    ]
                }
            },

power_up_eventという名前でpower_upというcomponent_groupsを追加するようなイベントになっています。イベント内でコマンドを使いたい場合はこう書きます

"power_up_event": {
      "run_command": {
             "command": [
            "kill @e[type=!player,r=15]",
            "say ALL DELETE !!!!"
             ]
       }
 },

環境センサーでの条件に一致している間15m以内のプレイヤー以外のモブを全てキルし続けてALLDELETE!!!!と叫び続ける狂気のコマンドですね

装備を着ている間コマンドを使いたい場合これを使うのが手っ取り早いですね。

ただ一つの装備を着ている時ならhasitemとかの方が楽な事もあるかもしれませんがall_ofがあるおかげでセット装備効果なんかを作る時は役立つと思います。

グループの内容

本文に戻ります。条件に一致するとpower_upのコンポーネントグループが付くらしいのでグループの中を見てみましょう

   "power_up": {
                "minecraft:movement": {
                    "value": 1
                },
                "minecraft:attack": {
                    "damage": 50
                },
                "minecraft:health": {
                    "value": 80,
                    "max": 80
                }
            },
            "default": {
                "minecraft:movement": {
                    "value": 0.1
                },
                "minecraft:attack": {
                    "damage": 1
                },
                "minecraft:health": {
                    "value": 20,
                    "max": 20
                }
            }

赤の時と青の時の環境センサーの条件を思い出して下さい。

赤の場合(pのタグを持っていたら)power_upグループが付くのでこの場合攻撃50,HP80スピード1の状態になる訳です。赤のコード単体だとデフォルトの状態に戻れなくなるので青のイベントが書いてあります。

青のdefaultグループはデフォルトのステータスになります。

グループにあるコンポーネントは現在のコンポーネントを上書きする仕様があります。

なのでpower_upのグループを外す場合上書きする場合の2種類のやり方ができます。私は上書きする方が好きなのでこう書いていますが外す場合にするなら条件をpのタグを持っていない時にすると良いでしょう

■ 広告 ■

まとめ

今回はenvironment_sensorについて解説いたしました。装備を付けている時に簡単にコマンドを実行できるのは楽で良いです。また、直接能力値を弄れるので特殊な防具も簡単に作れるので使いこなせるようになると何でも作れると言っても過言ではないレベルで汎用性の高いコンポーネントです。


コメント