エンティティファイルの中身の構成解説

サムネイル アドオンチュートリアル編

    はじめに

    今回はエンティティを構成しているファイルの中身について解説します。

    中身と言っても全て解説する訳では無く、全てのエンティティで共通している部分を主に解説します。
    アドオンの入れ方はこちらで解説しております

    共通の決まり事

    アドオンは自由にファイルの中身を書き換えて
    異次元の強さにしたり新しく追加したりする事ができます。しかし、中身の書き方にもしっかりと決まり事があります。今回はchicken.json(ニワトリ)のファイルを元に解説していきます。

    ■ 広告 ■
    {
      "format_version": "1.16.0",
      "minecraft:entity": {
        "description": {
          "identifier": "minecraft:chicken",
          "is_spawnable": true,
          "is_summonable": true,
          "is_experimental": false
        },
        "component_groups": {
          "minecraft:chicken_baby": {
            "minecraft:is_baby": {
            },
            "minecraft:scale": {
              "value":0.5
            },
            "minecraft:ageable": {
              "duration": 1200,
              "feed_items": [
                "wheat_seeds",
                "beetroot_seeds",
                "melon_seeds",
                "pumpkin_seeds"
              ],
              "grow_up": {
                "event": "minecraft:ageable_grow_up",
                "target": "self"
              }
            },
            "minecraft:behavior.follow_parent": {
              "priority": 5,
              "speed_multiplier": 1.1
            }
          },
    
          "minecraft:chicken_adult": {
            "minecraft:experience_reward": {
              "on_bred": "Math.Random(1,7)",
              "on_death": "query.last_hit_by_player ? Math.Random(1,3) : 0"
            },
            "minecraft:loot": {
              "table": "loot_tables/entities/chicken.json"
            },
            "minecraft:breedable": {
              "require_tame": false,
              "breeds_with": {
                "mate_type": "minecraft:chicken",
                "baby_type": "minecraft:chicken",
                "breed_event": {
                  "event": "minecraft:entity_born",
                  "target": "baby"
                }
              },
              "breed_items": [
                "wheat_seeds",
                "beetroot_seeds",
                "melon_seeds",
                "pumpkin_seeds"
              ]
            },
            "minecraft:behavior.breed": {
              "priority": 3,
              "speed_multiplier": 1.0
            },
            "minecraft:rideable": {
              "seat_count": 1,
              "family_types": [
                "zombie"
              ],
              "seats": {
                "position": [ 0.0, 0.4, 0.0 ]
              }
            },
            "minecraft:spawn_entity": {
              "entities": {
                "min_wait_time": 300,
                "max_wait_time": 600,
                "spawn_sound": "plop",
                "spawn_item": "egg",
                "filters": {
                  "test": "rider_count", "subject": "self", "operator": "==", "value": 0
                }
              }
            }
          }
        },
    
        "components": {
          "minecraft:is_hidden_when_invisible": {
          },
          "minecraft:type_family": {
            "family": [ "chicken", "mob" ]
          },
          "minecraft:breathable": {
            "total_supply": 15,
            "suffocate_time": 0
          },
          "minecraft:collision_box": {
            "width": 0.6,
            "height": 0.8
          },
          "minecraft:nameable": {
          },
          "minecraft:health": {
            "value": 4,
            "max": 4
          },
          "minecraft:hurt_on_condition": {
            "damage_conditions": [
              {
                "filters": { "test": "in_lava", "subject": "self", "operator": "==", "value": true },
                "cause": "lava",
                "damage_per_tick": 4
              }
            ]
          },
          "minecraft:movement": {
            "value": 0.25
          },
          "minecraft:damage_sensor": {
            "triggers": {
              "cause": "fall",
              "deals_damage": false
            }
          },
          "minecraft:leashable": {
            "soft_distance": 4.0,
            "hard_distance": 6.0,
            "max_distance": 10.0
          },
          "minecraft:balloonable": {
            "mass": 0.5
          },
          "minecraft:navigation.walk": {
            "can_path_over_water": true,
            "avoid_damage_blocks": true
          },
          "minecraft:movement.basic": {
          },
          "minecraft:jump.static": {
          },
          "minecraft:can_climb": {
          },
          "minecraft:despawn": {
            "despawn_from_distance": {}
          },
          "minecraft:behavior.float": {
            "priority": 0
          },
          "minecraft:behavior.panic": {
            "priority": 1,
            "speed_multiplier": 1.5
          },
          "minecraft:behavior.mount_pathing": {
            "priority": 2,
            "speed_multiplier": 1.5,
            "target_dist": 0.0,
            "track_target": true
          },
          "minecraft:behavior.tempt": {
            "priority": 4,
            "speed_multiplier": 1.0,
            "items": [
              "wheat_seeds",
              "beetroot_seeds",
              "melon_seeds",
              "pumpkin_seeds"
            ]
          },
          "minecraft:behavior.random_stroll": {
            "priority": 6,
            "speed_multiplier": 1.0
          },
          "minecraft:behavior.look_at_player": {
            "priority": 7,
            "look_distance": 6.0,
            "probability": 0.02
          },
          "minecraft:behavior.random_look_around": {
            "priority": 8
          },
          "minecraft:physics": {
          },
          "minecraft:pushable": {
            "is_pushable": true,
            "is_pushable_by_piston": true
          },
          "minecraft:conditional_bandwidth_optimization": {
          },
          "minecraft:game_event_movement_tracking": {
            "emit_flap": true
          }
        },
    
        "events": {
          "from_egg": {
            "add": { "component_groups": [ "minecraft:chicken_baby" ] }
          },
    
          "minecraft:entity_spawned": {
            "randomize": [
              {
                "weight": 95,
                "trigger": "minecraft:spawn_adult"
              },
              {
                "weight": 5,
                "add": {
                  "component_groups": [
                    "minecraft:chicken_baby"
                  ]
                }
              }
            ]
          },
    
          "minecraft:entity_born": {
            "remove": {
            },
            "add": {
              "component_groups": [
                "minecraft:chicken_baby"
              ]
            }
          },
    
          "minecraft:ageable_grow_up": {
            "remove": {
              "component_groups": [
                "minecraft:chicken_baby"
              ]
            },
            "add": {
              "component_groups": [
                "minecraft:chicken_adult"
              ]
            }
          },
    
          "minecraft:spawn_adult": {
            "add": {
              "component_groups": [
                "minecraft:chicken_adult"
              ]
            }
          }
        }
      }
    }
    

    このコードがニワトリがどんなものかを決めているコードになります。めちゃくちゃ長いですが中身を消して側だけにしてみます。

    ■ 広告 ■

    エンティティを構成する外側

    {
      "format_version": "1.16.0",
      "minecraft:entity": {
        "description": {
        },
        "component_groups": {
          "minecraft:chicken_baby": {
          },
    
          "minecraft:chicken_adult": {
          }
        },
    
        "components": {
        },
    
        "events": {
          "from_egg": {
          },
    
          "minecraft:entity_spawned": {
          },
    
          "minecraft:entity_born": {
          },
    
          "minecraft:ageable_grow_up": {
          },
    
          "minecraft:spawn_adult": {
          }
        }
      }
    }
    

    細かい処理や決め事を消すとこうなります。かなりシンプルになりましたね
    部品ごとに色も分けてみました。

    構成の解説

    エンティティは部品の集まりで作られていると思ってください。

    私たちはマインクラフト本体が提供している部品を組み合わせてアドオンを作っていっている訳ですね。

    format_version

    まず黄色い部分の{ “format_version”: “1.16.0”, ですがこの部分は
    どのバージョンの部品を使うか、みたいな認識で良いと思います(私自身詳しい事は知らない)

    このバージョンによっては部品の名前が違ったり、使える部品だったり使えない部品だったりする訳です。ゲーム機の本体を決めているイメージでしょうか。

    プレ○テ4でプ○ステ2のソフトは起動できないようなイメージ?

    environment_sensornなどがフォーマットバージョンによっては中身の書き方が変わりますのでバージョンには気を付けましょう。

    エンティティやアイテムである事の指定

    次に“minecraft:entity”: { の部分ですがこれはエンティティのファイルである事を示しています

    アイテムのファイルの場合ここが”minecraft:item”: { になります。

    description

    次に“description”: { の部分ですがこれはIDを決める際に使われています。(ID以外にも色々な情報が決められています。今はIDを決める部分とだけ覚えておけばいいでしょう。

    そして “component_groups”: { “components”: { }, “events”: { ですが今回はここが一番重要です。

    ここから下はそれぞれコンポーネントグループコンポーネントイベントと書きます。

    ■ 広告 ■

    component

    まずはコンポーネントですがここはエンティティを構成するパーツを全て書き込まれる場所です。核の部分ですね。

    HPの設定や移動速度、攻撃力、当たり判定、プレイヤーを追いかける等ほぼすべての決め事を設定できます。

    component_groups

    そして次にコンポーネントグループですがこれはゾンビが一番わかりやすいです。

    子ゾンビのjsonファイルはありませんがゲーム内には存在しますよね。子ゾンビはゲーム内ではゾンビと同じエンティティなのです。(わかるだろうけど)

    村人ゾンビは別のエンティティです

    コンポーネントの中にゾンビの基本となる情報が書き込まれておりコンポーネントグループに子ゾンビの情報が書かれています。

    チキンのjsonにもminecraft:chicken_babyminecraft:chicken_adultと赤ちゃんの時の情報と成長後の時の情報が書かれているのがわかるかと思います。

    チキンの場合成長後は卵を産むので親のグループも書かれている訳ですね。

    event

    そしてイベントですがこれはグループを管理するためにあります。

    スポーンした時にはコンポーネントグループは持っていません。(多分)

    グループは装備品と思って下さい。ヘルメットです。

    イベントはその装備品を取り換える事ができる機能です。なのでイベントを実行するパーツが必要になる訳です。そのパーツを取り付けれる部分がコンポーネントとコンポーネントグループです。

    ■ 広告 ■

    まとめ

    今までの話からコードを日本語にしてみます。

    バージョン管理
    このファイルはエンティティだ
     ┣コンポーネントグループ
      ┣チキンの赤ちゃん
      ┗チキンの成長後
     ┣コンポーネント
      
     ┗イベント
       ┣赤ちゃんのグループを付けるイベント
       ┗成長後のグループを付けるイベント

    このような形でエンティティが構成されている訳ですね。

    ちなみにコンポーネントグループ、コンポーネント、イベントはそれぞれ順番を変えても問題なく動作したはずですがこの順番で書くことを強く推奨します。(順番を変える意味が無い)

    これさえ覚えておけば詳しい書き方は知らなくてもどういう風にエンティティが構成されているかがわかるかと思います。

    この書き方のルールを覚えていないとイベントの中に性能を管理する部品を置いてしまったりとおかしな書き方になってしまいますので気を付けましょう。

    かなり長くなってしまったので部品の各詳細に関しては別の記事にします。


    コメント