{
  "title": "Tree Feature",
  "description": "'minecraft:tree_feature' will place a tree in the world. A tree consists of a column that is anchored to a base block with set parameters for what it can be placed on and canopy that extends from the column. Trees support multiple types of canopies, trunks, and roots.",
  "type": "object",
  "additionalProperties": false,
  "required": ["description"],
  "definitions": {
    "branch_canopy": {
      "title": "Branch Canopy",
      "description": "Configuration object for the canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "acacia_canopy": {
          "title": "Acacia Canopy",
          "description": "Configuration object for the acacia canopy.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "canopy_size": {
              "title": "Canopy Size",
              "description": "The size of the canopy.",
              "type": "integer",
              "minimum": 1
            },
            "leaf_block": {
              "$ref": "#/definitions/leaf_block"
            },
            "simplify_canopy": {
              "$ref": "#/definitions/simplify_canopy"
            }
          }
        },
        "canopy": {
          "title": "Canopy",
          "description": "Configuration object for the normal canopy.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "canopy_offset": {
              "title": "Canopy Offset",
              "description": "Canopy position offset relative to the block above the trunk.",
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "min": {
                  "title": "Min",
                  "description": "Min canopy position offset.",
                  "type": "integer"
                },
                "max": {
                  "title": "Max",
                  "description": "Max canopy position offset.",
                  "type": "integer"
                }
              }
            },
            "min_width": {
              "title": "Min Width",
              "description": "Min width for the canopy.",
              "type": "integer",
              "minimum": 0
            },
            "canopy_slope": {
              "title": "Canopy Slope",
              "description": "Configuration object for the canopy slope.",
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "rise": {
                  "title": "Rise",
                  "description": "The numerator for the slope fraction.",
                  "type": "integer",
                  "minimum": 1
                },
                "run": {
                  "title": "Run",
                  "description": "The denominator for the slope fraction.",
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "variation_chance": {
              "title": "Variation Chance",
              "description": "Determines the chance of creating leaf blocks for every layer of the canopy. Larger numbers create a denser tree.",
              "oneOf": [
                { "$ref": "../types/chance_information.json" },
                {
                  "type": "array",
                  "items": {
                    "$ref": "../types/chance_information.json"
                  }
                }
              ]
            },
            "leaf_block": {
              "$ref": "#/definitions/leaf_block"
            },
            "canopy_decoration": {
              "title": "Canopy Decoration",
              "description": "Configuration object for the canopy decoration.",
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "decoration_chance": {
                  "title": "Decoration Chance",
                  "description": "Probability of decorating the trunk.",
                  "$ref": "../types/chance_information.json"
                },
                "decoration_block": {
                  "title": "Decoration Block",
                  "description": "The block used for decorating the trunk.",
                  "type": "string",
                  "$ref": "../../../general/block/identifier.json"
                },
                "num_steps": {
                  "title": "Num Steps",
                  "description": "Number of decoration blocks to place.",
                  "type": "integer",
                  "minimum": 0
                },
                "step_direction": {
                  "title": "Step Direction",
                  "description": "Directions to spread decoration blocks.",
                  "type": "string",
                  "enum": ["down", "up", "out", "away"]
                }
              }
            }
          }
        },
        "cherry_canopy": {
          "title": "Cherry Canopy",
          "description": "Configuration object for the cherry canopy.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "leaf_block": {
              "$ref": "#/definitions/leaf_block"
            },
            "height": {
              "$ref": "#/definitions/height"
            },
            "radius": {
              "$ref": "#/definitions/radius"
            },
            "trunk_width": {
              "$ref": "#/definitions/trunk_width"
            },
            "wide_bottom_layer_hole_chance": {
              "title": "Wide Bottom Layer Hole Chance",
              "description": "Probability of the canopy having a hole in the bottom layer.",
              "$ref": "../types/chance_information.json"
            },
            "corner_hole_chance": {
              "title": "Corner Hole Chance",
              "description": "Probability of the canopy having a hole in the corner.",
              "$ref": "../types/chance_information.json"
            },
            "hanging_leaves_chance": {
              "title": "Hanging Leaves Chance",
              "description": "Probability of the canopy having hanging leaves",
              "$ref": "../types/chance_information.json"
            },
            "hanging_leaves_extension_chance": {
              "title": "Hanging Leaves Extension Chance",
              "description": "Probability of hanging leaves extending further down",
              "$ref": "../types/chance_information.json"
            }
          }
        },
        "fancy_canopy": {
          "title": "Fancy Canopy",
          "description": "Configuration object for the fancy canopy.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "height": {
              "$ref": "#/definitions/height"
            },
            "radius": {
              "$ref": "#/definitions/radius"
            },
            "leaf_block": {
              "$ref": "#/definitions/leaf_block"
            }
          }
        },
        "mangrove_canopy": {
          "title": "Mangrove Canopy",
          "description": "Configuration object for the mangrove canopy.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "canopy_height": {
              "$ref": "#/definitions/height"
            },
            "canopy_radius": {
              "$ref": "#/definitions/radius"
            },
            "leaf_placement_attempts": {
              "title": "Leaf Placement Attempts",
              "description": "Max number of attempts to create leaf blocks.",
              "type": "integer", 
              "minimum": 1
            },
            "leaf_blocks": {
              "title": "Leaf Blocks",
              "description": "The blocks that form the canopy of the tree",
              "type": "array",
              "minItems": 1,
              "items": [ 
                  {
                    "$ref": "#/definitions/leaf_block"
                  }, 
                  {
                    "title": "Weight",
                    "description": "Weight used in random selection. Value is relative to other weights in the collection.",
                    "type": "number", 
                    "minimum": 0
                  }
              ]
            },
            "canopy_decoration": {
              "$ref": "#/definitions/decoration"
            },
            "hanging_block": {
              "title": "Hanging Block",
              "description": "The block to be used as a hanging block.",
              "$ref": "../../../general/block/identifier.json"
            },
            "hanging_block_placement_chance": {
              "title": "Hanging Block Placement Chance",
              "description": "Probability of creating a hanging leaf block.",
              "$ref": "../types/chance_information.json"
            }
          }
        },
        "mega_canopy": {
          "title": "Mega Canopy",
          "description": "Configuration object for the mega canopy.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "canopy_height": {
              "$ref": "#/definitions/height"
            },
            "base_radius": {
              "$ref": "#/definitions/radius"
            },
            "core_width": {
              "title": "Core Width",
              "description": "Width of the tree trunk.",
              "type": "number",
              "minimum": 1
            },
            "simplify_canopy": {
              "$ref": "#/definitions/simplify_canopy"
            },
            "leaf_block": {
              "$ref": "#/definitions/leaf_block"
            }
          }
        },
        "mega_pine_canopy": {
          "title": "Mega Pine Canopy",
          "description": "Configuration object for the mega pine canopy.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "canopy_height": {
              "$ref": "#/definitions/height"
            },
            "base_radius": {
              "$ref": "#/definitions/radius",
              "minimum": 0
            },
            "radius_step_modifier": {
              "title": "Radius Step Modifier",
              "description": "Modifier for the base radius of the canopy.",
              "type": "number", 
              "minimum": 0
            },
            "core_width": {
              "title": "Core Width",
              "description": "Width of the tree trunk.",
              "type": "number",
              "minimum": 1
            },
            "leaf_block": {
              "$ref": "#/definitions/leaf_block"
            }
          }
        },
        "pine_canopy": {
          "title": "Pine Canopy",
          "description": "Configuration object for the pine canopy.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "height": {
              "$ref": "#/definitions/height"
            },
            "radius": {
              "$ref": "#/definitions/radius"
            },
            "leaf_block": {
              "$ref": "#/definitions/leaf_block"
            }
          }
        },
        "roofed_canopy": {
          "title": "Roofed Canopy",
          "description": "Configuration object for the roofed canopy.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "canopy_height": {
              "title": "Canopy Height",
              "description": "Roofed canopies feature a base and a top layer, and an extra cap layer on some occasions, this value controls the number of layers in the middle.",
              "type": "integer",
              "minimum": 3
            },
            "core_width": {
              "title": "Core Width",
              "description": "Width of the tree trunk.",
              "type": "integer",
              "minimum": 1
            },
            "outer_radius": {
              "title": "Outer Radius",
              "description": "Radius used for the base and top layers.",
              "type": "integer",
              "minimum": 0
            },
            "inner_radius": {
              "title": "Inner Radius",
              "description": "Radius used for the middle layers.",
              "type": "integer",
              "minimum": 0
            },
            "leaf_block": {
              "$ref": "#/definitions/leaf_block"
            }
          }
        },
        "spruce_canopy": {
          "title": "Spruce Canopy",
          "description": "Configuration object for the spruce canopy.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "lower_offset": {
              "title": "Lower Offset",
              "description": "Min canopy position offset.",
              "type": "integer",
              "minimum": 0
            },
            "upper_offset": {
              "title": "Upper Offset",
              "description": "Max canopy position offset.",
              "type": "integer",
              "minimum": 0
            },
            "max_radius": {
              "title": "Max Radius",
              "description": "Max radius of the canopy.",
              "type": "integer",
              "minimum": 0
            },
            "leaf_block": {
              "$ref": "#/definitions/leaf_block"
            }
          }
        }
      }
    },
    "leaf_block": {
      "title": "Leaf Block",
      "description": "The block thata forms the canopy of the tree.",
      "type": "string",
      "$ref": "../../../general/block/identifier.json"
    },
    "trunk_width": {
      "title": "Trunk Width",
      "description": "The width of the tree trunk.",
      "type": "integer",
      "minimum": 1
    },
    "height": {
      "title": "Height",
      "description": "Number of layers for the canopy.",
      "type": "integer", 
      "minimum": 1
    },
    "radius": {
      "title": "Radius",
      "description": "The radius of the canopy.",
      "type": "integer", 
      "minimum": 1
    },
    "decoration": {
      "title": "Decoration",
      "description": "Configuration object for the decoration.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "decoration_chance": {
          "title": "Decoration Chance",
          "description": "Probability of decorating the trunk.",
          "$ref": "../types/chance_information.json"
        },
        "decoration_block": {
          "title": "Decoration Block",
          "description": "The block used for decorating the trunk.",
          "type": "string",
          "$ref": "../../../general/block/identifier.json"
        },
        "num_steps": {
          "title": "Num Steps",
          "description": "Number of decoration blocks to place.",
          "type": "integer",
          "minimum": 0
        },
        "step_direction": {
          "title": "Step Direction",
          "description": "Directions to spread decoration blocks.",
          "type": "string",
          "enum": ["down", "up", "out", "away"]
        }
      }
    },
    "simplify_canopy": {
      "title": "Simplify Canopy",
      "description": "If true the canopy uses a simple pattern.",
      "type": "boolean"
    },
    "trunk_block": {
      "title": "Trunk Block",
      "description": "The block that forms the tree trunk.",
      "type": "string",
      "$ref": "../../../general/block/identifier.json"
    }
  },
  "properties": {
    "description": {
      "$ref": "../types/description.json"
    },
    "base_block": {
      "title": "Base Block",
      "oneOf": [
        { "$ref": "../../../general/block/identifier.json" },
        {
          "type": "array",
          "items": { "title": "Block", "$ref": "../../../general/block/identifier.json" }
        }
      ]
    },
    "base_cluster": {
      "title": "Base Cluster",
      "description": "Allows you to define a number of clusters for the base of the tree. Used to generate mega tree variants.",
      "type": "object",
      "additionalProperties": false,
      "required": ["may_replace", "num_clusters", "cluster_radius"],
      "properties": {
        "may_replace": {
          "title": "May Replace",
          "description": "List of blocks that the base cluster of a tree can replace.",
          "type": "array",
          "items": {
            "$ref": "../../../general/block/identifier.json"
          }
        },
        "num_clusters": {
          "title": "Num Clusters",
          "description": "Number of clusters that can be generated.",
          "type": "integer",
          "minimum": 1
        },
        "cluster_radius": {
          "title": "Clusters Radius",
          "description": "Radius where the clusters that can be generated.",
          "type": "integer",
          "minimum": 0
        }
      }
    },
    "may_grow_on": {
      "title": "May Grow On",
      "description": "List of blocks where a tree can grow on.",
      "type": "array",
      "items": {
        "$ref": "../../../general/block/identifier.json"
      }
    },
    "may_replace": {
      "title": "May Reaplce",
      "description": "List of blocks that a tree can replace.",
      "type": "array",
      "items": {
        "$ref": "../../../general/block/identifier.json"
      }
    },
    "may_grow_through": {
      "title": "May Grow Through",
      "description": "List of blocks that a tree can grow through.",
      "type": "array",
      "items": {
        "$ref": "../../../general/block/identifier.json"
      }
    },
    "acacia_trunk": {
      "title": "Acacia Trunk",
      "description": "Configutarion for the acacia trunk.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "trunk_width": {
          "$ref": "#/definitions/trunk_width"
        },
        "trunk_height": {
          "title": "Trunk Height",
          "description": "Configuration object for the trunk height.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "base": {
              "title": "Base",
              "description": "Min height for the trunk.",
              "type": "integer",
              "minimum": 1
            },
            "intervals": {
              "title": "Intervals",
              "description": "Intervals used to randomize the trunk height, the value of each interval will create a random number where (0 <= rand < interval)), and will be added to the height.",
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "integer",
                "minimum": 1
              }
            },
            "min_height_for_canopy": {
              "title": "Minimum Height For Canopy",
              "description": "Min height where the canopy can be placed.",
              "type": "integer",
              "minimum": 1
            }
          }
        },
        "trunk_lean": {
          "title": "Trunk Lean",
          "description": "Configuration object for diagonal branches.",
          "type": "object", 
          "additionalProperties": false,
          "properties": {
            "allow_diagonal_growth": {
              "title": "Allow Diagonal Growth",
              "description": "If true, diagonal branches will be created.",
              "type": "boolean"
            },
            "lean_height": {
              "title": "Lean Height",
              "description": "Number of blocks below the tree height at which diagonal branches can be created.",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "lean_steps": {
              "title": "Lean Steps",
              "description": "Number of steps taken in X/Z direction while creating a diagonal branch.",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "lean_length": {
              "title": "Lean Length",
              "description": "Length for the diagonal branch in the Y axis.",
              "$ref": "../../entities/format/types/range_number_type.json"
            }
          }
        },
        "trunk_block": {
          "$ref": "#/definitions/trunk_block"
        },
        "branches": {
          "title": "Branches",
          "description": "Configuration object for branches.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "branch_length": {
              "title": "Branch Length",
              "description": "Length for the branch in the Y axis.",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "branch_position": {
              "title": "Branch Position",
              "description": "Starting Y position for the branch.",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "branch_chance": {
              "title": "Branch Chance",
              "description": "Probability of creating a branch.",
              "$ref": "../types/chance_information.json"
            },
            "branch_canopy": {
              "$ref": "#/definitions/branch_canopy"
            },
            "trunk_decoration": {
              "$ref": "#/definitions/decoration"
            }
          }
        }
      }
    },
    "cherry_trunk": {
      "title": "Cherry Trunk",
      "description": "Configutarion for the cherry trunk.",
      "type": "object", 
      "additionalProperties": false,
      "properties": {
        "trunk_block": {
          "$ref": "#/definitions/trunk_block"
        },
        "trunk_height": {
          "title": "Trunk Height",
          "description": "Configuration object for the trunk height.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "base": {
              "title": "Base",
              "description": "Min height for the trunk.",
              "type": "integer",
              "minimum": 2
            },
            "intervals": {
              "title": "Intervals",
              "description": "Intervals used to randomize the trunk height, the value of each interval will create a random number where (0 <= rand < interval)), and will be added to the height.",
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "integer",
                "minimum": 1
              }
            }
          }
        },
        "branches": {
          "title": "Branches",
          "description": "Configuration object for branches.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "tree_type_weights": {
              "title": "Tree Type Weights",
              "description": "Configuration object to pick a tree variant based on a weighted random number",
              "type": "object", 
              "additionalProperties": false,
              "properties": {
                "one_branch": {
                  "title": "One Branch",
                  "description": "Tree variant with one branch.",
                  "type": "integer", 
                  "minimum": 0
                },
                "two_branches": {
                  "title": "Two Branches",
                  "description": "Tree variant with two branches.",
                  "type": "integer", 
                  "minimum": 0
                },
                "two_branches_and_trunk": {
                  "title": "Two Branches And Trunk",
                  "description": "Tree variant with three branch.",
                  "type": "integer", 
                  "minimum": 0
                }
              }
            },
            "branch_horizontal_length": {
              "title": "Branch Horizontal Length",
              "description": "Branch length in X/Z axis.",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "branch_start_offset_from_top": {
              "title": "Branch Start Offset From Top",
              "description": "Branch starting position relative to the top of the tree",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "branch_end_offset_from_top": {
              "title": "Branch End Offset From Top",
              "description": "Branch end position relative to the top of the tree",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "branch_chance": {
              "title": "Branch Chance",
              "description": "Probability of creating a branch.",
              "$ref": "../types/chance_information.json"
            },
            "branch_canopy": {
              "$ref": "#/definitions/branch_canopy"
            }
          }
        }
      }
    },
    "fallen_trunk": {
      "title": "Fallen Trunk",
      "description": "Configutarion for the fallen trunk.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "log_length": {
          "title": "Log Length",
          "description": "Length of the fallen log.",
          "type": "integer",
          "minimum": 0
        },
        "stump_height": {
          "title": "Stump Height",
          "description": "height of the stump.",
          "type": "integer",
          "minimum": 0
        },
        "height_modifier": {
          "title": "Height Modifier",
          "description": "Modifier for the length of the fallen log.",
          "type": "integer",
          "minimum": 0
        },
        "trunk_block": {
          "$ref": "#/definitions/trunk_block"
        },
        "log_decoration_feature": {
          "title": "Log Decoration Feature",
          "description": "Feature that can be used to decorate the fallen log.",
          "type": "string",
          "$ref": "../../../general/feature/identifier.json"
        },
        "trunk_decoration": {
          "$ref": "#/definitions/decoration"
        }
      }
    },
    "fancy_trunk": {
      "title": "Fancy Trunk",
      "description": "Configutarion for the fancy trunk.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "trunk_height": {
          "title": "Trunk Height",
          "description": "Configuration object for the trunk height.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "base": {
              "title": "Base",
              "description": "Min height for the trunk.",
              "type": "integer",
              "minimum": 1
            },
            "variance": {
              "title": "Variance",
              "description": "Modifier for the trunk height.",
              "type": "integer",
              "minimum": 1
            },
            "scale": {
              "title": "Scale",
              "description": "Final tree height is multiplied by this scale.",
              "type": "number",
              "maximum": 1
            }
          }
        },
        "trunk_width": {
          "$ref": "#/definitions/trunk_width"
        },
        "branches": {
          "title": "Branches",
          "description": "Configuration object for branches.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "slope": {
              "title": "Slope",
              "description": "Slope for the branch, where 0 is horizontal and 1 is vertical.",
              "type": "number",
              "minimum": 0,
              "maximum": 1
            },
            "density": {
              "title": "Density",
              "description": "Density of foliage.",
              "type": "number"
            },
            "min_altitude_factor": {
              "title": "Min Altitude Factor",
              "description": "Min height for branches. Represented by a percentage of the tree height.",
              "type": "number",
              "minimum": 0.0,
              "maximum": 1.0
            }
          }
        },
        "trunk_block": {
          "$ref": "#/definitions/trunk_block"
        },
        "width_scale": {
          "title": "Width Scale",
          "description": "Scale modifier for the tree radius.",
          "type": "number",
          "minimum": 0.0
        },
        "foliage_altitude_factor": {
          "title": "Foliage Altitude Factor",
          "description": "Min height for foliage. Represented by a percentage of the tree height.",
          "type": "number",
          "minimum": 0.0,
          "maximum": 1.0
        }
      }
    },
    "mangrove_trunk": {
      "title": "Mangrove Trunk",
      "description": "Configutarion for the mangrove trunk.",
      "type": "object", 
      "additionalProperties": false,
      "properties": {
        "trunk_width": {
          "$ref": "#/definitions/trunk_width"
        },
        "trunk_height": {
          "title": "Trunk Height",
          "description": "Configuration object for the trunk height.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "base": {
              "title": "Base",
              "description": "Min height for the trunk.",
              "type": "integer",
              "minimum": 1
            },
            "height_rand_a": {
              "title": "Height Rand A",
              "description": "Tree height modifier A.",
              "type": "integer",
              "minimum": 1
            },
            "height_rand_b": {
              "title": "Height Rand B",
              "description": "Tree height modifier B.",
              "type": "integer",
              "minimum": 1
            }
          }
        },
        "trunk_block": {
          "$ref": "#/definitions/trunk_block"
        },
        "branches": {
          "title": "Branches",
          "description": "Configuration object for branches.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "branch_length": {
              "title": "Branch Length",
              "description": "Length for the branch in the Y axis.",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "branch_steps": {
              "title": "Branch Steps",
              "description": "Number of branches to place.",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "branch_chance": {
              "title": "Branch Chance",
              "description": "Probability of creating a branch.",
              "$ref": "../types/chance_information.json"
            }
          }
        },
        "trunk_decoration": {
          "$ref": "#/definitions/decoration"
        }
      }
    },
    "mega_trunk": {
      "title": "Mega Trunk",
      "description": "Configutarion for the mega trunk.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "trunk_width": {
          "$ref": "#/definitions/trunk_width"
        },
        "trunk_height": {
          "title": "Trunk Height",
          "description": "Configuration object for the trunk height.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "base": {
              "title": "Base",
              "description": "Min height for the trunk.",
              "type": "integer",
              "minimum": 1
            },
            "intervals": {
              "title": "Intervals",
              "description": "Intervals used to randomize the trunk height, the value of each interval will create a random number where (0 <= rand < interval)), and will be added to the height.",
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "integer",
                "minimum": 1
              }
            },
            "min_height_for_canopy": {
              "title": "Minimum Height For Canopy",
              "description": "Min height where the canopy can be placed.",
              "type": "integer",
              "minimum": 1
            }
          }
        },
        "trunk_block": {
          "$ref": "#/definitions/trunk_block"
        },
        "trunk_decoration": {
          "$ref": "#/definitions/decoration"
        },
        "branches": {
          "title": "Branches",
          "description": "Configuration object for branches.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "branch_length": {
              "title": "Branch Length",
              "description": "Length for the branch.",
              "type": "integer",
              "minimum": 1
            },
            "branch_slope": {
              "title": "Branch Slope",
              "description": "Slope for the branch, where 0 is horizontal and 1 is vertical.",
              "type": "number",
              "minimum": 0,
              "maximum": 1
            },
            "branch_interval": { 
              "title": "Branch Interval", 
              "description": "Randomized distance between branches.",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "branch_altitude_factor": {
              "title": "Branch Altitude Factor",
              "description": "Altitude at which branches can spawn, relative to the tree height.",
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "min": {
                  "title": "Min",
                  "description": "Min altitude where branches can spawn.",
                  "type": "number",
                  "minimum": 0.0,
                  "maximum": 1.0
                },
                "max": {
                  "title": "Max",
                  "description": "Max altitude where branches can spawn.",
                  "type": "number",
                  "minimum": 0.0,
                  "maximum": 1.0
                }
              }
            },
            "branch_canopy": {
              "$ref": "#/definitions/branch_canopy"
            }
          }
        }
      }
    },
    "trunk": {
      "title": "Trunk",
      "description": "Configutarion for the normal trunk.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "trunk_height": {
          "title": "Trunk Height",
          "description": "Defines the height of the trunk.",
          "$ref": "../../entities/format/types/range_number_type.json"
        },
        "height_modifier": {
          "title": "Height Modifier",
          "description": "Modifier for the height of the trunk.",
          "$ref": "../../entities/format/types/range_number_type.json"
        },
        "can_be_submerged": {
          "title": "Can Be Submerged",
          "description": "Specifies if the trunk can be submerged.",
          "oneOf": [
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "max_depth": {
                  "title": "Max Depth",
                  "description": "Defines the max depth at which the trunk can be submerged.",
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            {
              "type": "boolean"
            }
          ]
        },
        "trunk_block": {
          "$ref": "#/definitions/trunk_block"
        },
        "trunk_decoration": {
          "$ref": "#/definitions/decoration"
        }
      }
    },
    "acacia_canopy": {
      "title": "Acacia Canopy",
      "description": "Configuration object for the acacia canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "canopy_size": {
          "title": "Canopy Size",
          "description": "The size of the canopy.",
          "type": "integer",
          "minimum": 1
        },
        "leaf_block": {
          "$ref": "#/definitions/leaf_block"
        },
        "simplify_canopy": {
          "$ref": "#/definitions/simplify_canopy"
        }
      }
    },
    "canopy": {
      "title": "Canopy",
      "description": "Configuration object for the normal canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "canopy_offset": {
          "title": "Canopy Offset",
          "description": "Canopy position offset relative to the block above the trunk.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "min": {
              "title": "Min",
              "description": "Min canopy position offset.",
              "type": "integer"
            },
            "max": {
              "title": "Max",
              "description": "Max canopy position offset.",
              "type": "integer"
            }
          }
        },
        "min_width": {
          "title": "Min Width",
          "description": "Min width for the canopy.",
          "type": "integer",
          "minimum": 0
        },
        "canopy_slope": {
          "title": "Canopy Slope",
          "description": "Configuration object for the canopy slope.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "rise": {
              "title": "Rise",
              "description": "The numerator for the slope fraction.",
              "type": "integer",
              "minimum": 1
            },
            "run": {
              "title": "Run",
              "description": "The denominator for the slope fraction.",
              "type": "integer",
              "minimum": 1
            }
          }
        },
        "variation_chance": {
          "title": "Variation Chance",
          "description": "Determines the chance of creating leaf blocks for every layer of the canopy. Larger numbers create a denser tree.",
          "oneOf": [
            { "$ref": "../types/chance_information.json" },
            {
              "type": "array",
              "items": {
                "$ref": "../types/chance_information.json"
              }
            }
          ]
        },
        "leaf_block": {
          "$ref": "#/definitions/leaf_block"
        },
        "canopy_decoration": {
          "title": "Canopy Decoration",
          "description": "Configuration object for the canopy decoration.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "decoration_chance": {
              "title": "Decoration Chance",
              "description": "Probability of decorating the trunk.",
              "$ref": "../types/chance_information.json"
            },
            "decoration_block": {
              "title": "Decoration Block",
              "description": "The block used for decorating the trunk.",
              "type": "string",
              "$ref": "../../../general/block/identifier.json"
            },
            "num_steps": {
              "title": "Num Steps",
              "description": "Number of decoration blocks to place.",
              "type": "integer",
              "minimum": 0
            },
            "step_direction": {
              "title": "Step Direction",
              "description": "Directions to spread decoration blocks.",
              "type": "string",
              "enum": ["down", "up", "out", "away"]
            }
          }
        }
      }
    },
    "cherry_canopy": {
      "title": "Cherry Canopy",
      "description": "Configuration object for the cherry canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "leaf_block": {
          "$ref": "#/definitions/leaf_block"
        },
        "height": {
          "$ref": "#/definitions/height"
        },
        "radius": {
          "$ref": "#/definitions/radius"
        },
        "trunk_width": {
          "$ref": "#/definitions/trunk_width"
        },
        "wide_bottom_layer_hole_chance": {
          "title": "Wide Bottom Layer Hole Chance",
          "description": "Probability of the canopy having a hole in the bottom layer.",
          "$ref": "../types/chance_information.json"
        },
        "corner_hole_chance": {
          "title": "Corner Hole Chance",
          "description": "Probability of the canopy having a hole in the corner.",
          "$ref": "../types/chance_information.json"
        },
        "hanging_leaves_chance": {
          "title": "Hanging Leaves Chance",
          "description": "Probability of the canopy having hanging leaves",
          "$ref": "../types/chance_information.json"
        },
        "hanging_leaves_extension_chance": {
          "title": "Hanging Leaves Extension Chance",
          "description": "Probability of hanging leaves extending further down",
          "$ref": "../types/chance_information.json"
        }
      }
    },
    "fancy_canopy": {
      "title": "Fancy Canopy",
      "description": "Configuration object for the fancy canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "height": {
          "$ref": "#/definitions/height"
        },
        "radius": {
          "$ref": "#/definitions/radius"
        },
        "leaf_block": {
          "$ref": "#/definitions/leaf_block"
        }
      }
    },
    "mangrove_canopy": {
      "title": "Mangrove Canopy",
      "description": "Configuration object for the mangrove canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "canopy_height": {
          "$ref": "#/definitions/height"
        },
        "canopy_radius": {
          "$ref": "#/definitions/radius"
        },
        "leaf_placement_attempts": {
          "title": "Leaf Placement Attempts",
          "description": "Max number of attempts to create leaf blocks.",
          "type": "integer", 
          "minimum": 1
        },
        "leaf_blocks": {
          "title": "Leaf Blocks",
          "description": "The blocks that form the canopy of the tree",
          "type": "array",
          "minItems": 1,
          "items": [ 
              {
                "$ref": "#/definitions/leaf_block"
              }, 
              {
                "title": "Weight",
                "description": "Weight used in random selection. Value is relative to other weights in the collection.",
                "type": "number", 
                "minimum": 0
              }
          ]
        },
        "canopy_decoration": {
          "$ref": "#/definitions/decoration"
        },
        "hanging_block": {
          "title": "Hanging Block",
          "description": "The block to be used as a hanging block.",
          "$ref": "../../../general/block/identifier.json"
        },
        "hanging_block_placement_chance": {
          "title": "Hanging Block Placement Chance",
          "description": "Probability of creating a hanging leaf block.",
          "$ref": "../types/chance_information.json"
        }
      }
    },
    "mega_canopy": {
      "title": "Mega Canopy",
      "description": "Configuration object for the mega canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "canopy_height": {
          "$ref": "#/definitions/height"
        },
        "base_radius": {
          "$ref": "#/definitions/radius"
        },
        "core_width": {
          "title": "Core Width",
          "description": "Width of the tree trunk.",
          "type": "number",
          "minimum": 1
        },
        "simplify_canopy": {
          "$ref": "#/definitions/simplify_canopy"
        },
        "leaf_block": {
          "$ref": "#/definitions/leaf_block"
        }
      }
    },
    "mega_pine_canopy": {
      "title": "Mega Pine Canopy",
      "description": "Configuration object for the mega pine canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "canopy_height": {
          "$ref": "#/definitions/height"
        },
        "base_radius": {
          "$ref": "#/definitions/radius",
          "minimum": 0
        },
        "radius_step_modifier": {
          "title": "Radius Step Modifier",
          "description": "Modifier for the base radius of the canopy.",
          "type": "number", 
          "minimum": 0
        },
        "core_width": {
          "title": "Core Width",
          "description": "Width of the tree trunk.",
          "type": "number",
          "minimum": 1
        },
        "leaf_block": {
          "$ref": "#/definitions/leaf_block"
        }
      }
    },
    "pine_canopy": {
      "title": "Pine Canopy",
      "description": "Configuration object for the pine canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "height": {
          "$ref": "#/definitions/height"
        },
        "radius": {
          "$ref": "#/definitions/radius"
        },
        "leaf_block": {
          "$ref": "#/definitions/leaf_block"
        }
      }
    },
    "roofed_canopy": {
      "title": "Roofed Canopy",
      "description": "Configuration object for the roofed canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "canopy_height": {
          "title": "Canopy Height",
          "description": "Roofed canopies feature a base and a top layer, and an extra cap layer on some occasions, this value controls the number of layers in the middle.",
          "type": "integer",
          "minimum": 3
        },
        "core_width": {
          "title": "Core Width",
          "description": "Width of the tree trunk.",
          "type": "integer",
          "minimum": 1
        },
        "outer_radius": {
          "title": "Outer Radius",
          "description": "Radius used for the base and top layers.",
          "type": "integer",
          "minimum": 0
        },
        "inner_radius": {
          "title": "Inner Radius",
          "description": "Radius used for the middle layers.",
          "type": "integer",
          "minimum": 0
        },
        "leaf_block": {
          "$ref": "#/definitions/leaf_block"
        }
      }
    },
    "spruce_canopy": {
      "title": "Spruce Canopy",
      "description": "Configuration object for the spruce canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "lower_offset": {
          "title": "Lower Offset",
          "description": "Min canopy position offset.",
          "type": "integer",
          "minimum": 0
        },
        "upper_offset": {
          "title": "Upper Offset",
          "description": "Max canopy position offset.",
          "type": "integer",
          "minimum": 0
        },
        "max_radius": {
          "title": "Max Radius",
          "description": "Max radius of the canopy.",
          "type": "integer",
          "minimum": 0
        },
        "leaf_block": {
          "$ref": "#/definitions/leaf_block"
        }
      }
    },
    "random_spread_canopy": {
      "title": "Random Spread Canopy",
      "description": "Configuration object for the random spread canopy.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "canopy_height": {
          "$ref": "#/definitions/height"
        },
        "canopy_radius": {
          "$ref": "#/definitions/radius"
        },
        "leaf_placement_attempts": {
          "title": "Leaf Placement Attempts",
          "description": "Max number of attempts to create leaf blocks.",
          "type": "integer",
          "minimum": 1
        },
        "leaf_blocks": {
          "title": "Leaf Blocks",
          "description": "The blocks that form the canopy of the tree",
          "type": "array",
          "minItems": 1,
          "items": [ 
              {
                "$ref": "#/definitions/leaf_block"
              }, 
              {
                "title": "Weight",
                "description": "Weight used in random selection. Value is relative to other weights in the collection.",
                "type": "number", 
                "minimum": 0
              }
          ]
        }
      }
    },
    "mangrove_roots": {
      "title": "Mangrove Roots",
      "description": "Configuration for mangrove roots",
      "type": "object", 
      "additionalProperties": false,
      "properties": {
        "max_root_width": {
          "title": "Max Root Width",
          "description": "Max width that the roots can occupy. The width increases up to the max width while moving downwards. When a max width is reached, roots will grow vertically",
          "type": "integer", 
          "minimum": 1
        },
        "max_root_length": {
          "title": "Max Root Length",
          "description": "Max length that the roots can occupy.",
          "type": "integer", 
          "minimum": 1
        },
        "root_block": {
          "title": "Root Block",
          "description": "Block used for roots.",
          "type": "string",
          "$ref": "../../../general/block/identifier.json"
        },
        "above_root": {
          "title": "Above Root",
          "description": "Configuration object for blocks decorating the top of the roots",
          "type": "object", 
          "additionalProperties": false,
          "properties": {
            "above_root_chance": {
              "title": "Above Root Chance",
              "description": "Probability of creating a block above the root",
              "$ref": "../types/chance_information.json"
            },
            "above_root_block": {
              "title": "Above Root Block",
              "description": "The block placed on the top of the roots.",
              "type": "string",
              "$ref": "../../../general/block/identifier.json"
            },
            "muddy_root_block": {
              "title": "Muddy Root Block",
              "description": "The block used for muddy roots.",
              "type": "string",
              "$ref": "../../../general/block/identifier.json"
            },
            "mud_block": {
              "title": "Mud Block",
              "description": "The block used to determine if a muddy root should be placed.",
              "type": "string",
              "$ref": "../../../general/block/identifier.json"
            },
            "y_offset": {
              "title": "Y Offset",
              "description": "Root offset from the trunk",
              "$ref": "../../entities/format/types/range_number_type.json"
            },
            "roots_may_grow_through": {
              "title": "Roots May Grow Through",
              "description": "List of blocks that a root can grow through.",
              "type": "array",
              "items": {
                "$ref": "../../../general/block/identifier.json"
              }
            },
            "root_decoration": {
              "$ref": "#/definitions/decoration"
            }
          }
        }
      }
    }
  }
}