{
  "$id": "minecraft.behavior.biomes.1.12.0.components.minecraft.forced_features",
  "title": "Forced Features",
  "description": "Force specific decorative features (trees, plants, etc.) to appear in this Biome, regardless of normal decoration rules.",
  "type": "object",
  "minProperties": 0,
  "maxProperties": 11,
  "additionalProperties": false,
  "definitions": {
    "coordinate": {
      "oneOf": [
        {
          "type": "string",
          "$ref": "../../../molang/number.json",
          "description": "Expression for the coordinate (evaluated each iteration).  Mutually exclusive with random distribution object below."
        },
        {
          "type": "number",
          "description": "Expression for the coordinate (evaluated each iteration).  Mutually exclusive with random distribution object below."
        },
        {
          "type": "object",
          "description": "Distribution for the coordinate (evaluated each iteration). Mutually exclusive with Molang expression above.",
          "additionalProperties": false,
          "required": ["distribution", "extent"],
          "properties": {
            "distribution": {
              "title": "Distribution",
              "description": "Type of distribution - uniform random, gaussian (centered in the range), or grid (either fixed-step or jittered).",
              "type": "string",
              "enum": ["uniform", "gaussian", "inverse_gaussian", "triangle", "fixed_grid", "jittered_grid"]
            },
            "extent": {
              "title": "Extent",
              "description": "UNDOCUMENTED.",
              "$comment": "UNDOCUMENTED",
              "type": "array",
              "items": [
                {
                  "title": "Lower Bound",
                  "description": "Lower bound (inclusive) of the scatter range, as an offset from the input point to scatter around.",
                  "$ref": "../../../molang/number.json"
                },
                {
                  "title": "Upper Bound",
                  "description": "Upper bound (inclusive) of the scatter range, as an offset from the input point to scatter around.",
                  "$ref": "../../../molang/number.json"
                }
              ]
            },
            "grid_offset": {
              "title": "Step Size",
              "description": "When the distribution type is grid, defines the offset along this axis.",
              "type": "integer",
              "minimum": 0
            },
            "step_size": {
              "title": "Step Size",
              "description": "When the distribution type is grid, defines the distance between steps along this axis.",
              "type": "integer",
              "minimum": 1
            }
          }
        }
      ]
    },
    "iteration": {
      "title": "Iteration",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "additionalProperties": false,
      "type": "object",
      "required": ["iterations", "places_feature", "identifier"],
      "properties": {
        "coordinate_eval_order": {
          "title": "Coordinate Eval Order",
          "description": "The order in which coordinates will be evaluated. Should be used when a coordinate depends on another. If omitted, defaults to `xzy`.",
          "type": "string",
          "enum": ["xyz", "xzy", "yxz", "yzx", "zxy", "zyx"]
        },
        "identifier": {
          "title": "Identifier",
          "description": "UNDOCUMENTED.",
          "$comment": "UNDOCUMENTED",
          "type": "string"
        },
        "iterations": {
          "title": "Iterations",
          "description": "Number of scattered positions to generate.",
          "$ref": "../../../molang/number.json"
        },
        "places_feature": {
          "title": "Places Feature",
          "description": "UNDOCUMENTED.",
          "$comment": "UNDOCUMENTED",
          "type": "string"
        },
        "scatter_chance": {
          "title": "Scatter Chance",
          "oneOf": [
            {
              "type": "object",
              "description": "Probability numerator / denominator that this scatter will occur.  Not evaluated each iteration; either no iterations will run, or all will.",
              "additionalProperties": false,
              "properties": {
                "denominator": {
                  "title": "Denominator",
                  "description": "UNDOCUMENTED.",
                  "$comment": "UNDOCUMENTED",
                  "type": "integer",
                  "minimum": 1
                },
                "numerator": {
                  "title": "Numerator",
                  "description": "UNDOCUMENTED.",
                  "$comment": "UNDOCUMENTED",
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            {
              "type": "string",
              "description": "Probability (0-100) that this scatter will occur.  Not evaluated each iteration; either no iterations will run, or all will.",
              "$ref": "../../../molang/number.json"
            },
            {
              "type": "number",
              "description": "Probability (0-100) that this scatter will occur.  Not evaluated each iteration; either no iterations will run, or all will."
            }
          ]
        },
        "x": {
          "title": "X",
          "$ref": "#/definitions/coordinate"
        },
        "y": {
          "title": "X",
          "$ref": "#/definitions/coordinate"
        },
        "z": {
          "title": "X",
          "$ref": "#/definitions/coordinate"
        }
      }
    }
  },
  "properties": {
    "after_sky_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    },
    "after_surface_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    },
    "after_underground_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    },
    "before_sky_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    },
    "before_surface_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    },
    "before_underground_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    },
    "final_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    },
    "first_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    },
    "surface_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    },
    "sky_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    },
    "underground_pass": {
      "title": "First Pass",
      "description": "UNDOCUMENTED.",
      "$comment": "UNDOCUMENTED",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iteration"
      }
    }
  }
}
