{
  "$id": "blockception.minecraft.behavior.entities.events",
  "type": "object",
  "title": "Events",
  "description": "Events for entities.",
  "additionalProperties": { "$ref": "#/definitions/event_base" },
  "definitions": {
    "addremove": {
      "additionalProperties": false,
      "title": "Add Or Remove",
      "description": "The components groups to add or remove.",
      "type": "object",
      "examples": [{ "component_groups": ["self:variant1"] }],
      "properties": {
        "component_groups": {
          "title": "Component Groups",
          "description": "The components groups to add or remove.",
          "type": "array",
          "items": { "type": "string", "description": "A reference to a component group.", "title": "Component Groups" }
        }
      }
    },
    "event_base": {
      "additionalProperties": false,
      "type": "object",
      "examples": [{}, { "add": { "component_groups": [] } }, { "remove": { "component_groups": [] } }],
      "defaultSnippets": [
        { "label": "New Add Event", "body": { "add": { "component_groups": ["$1"] } } },
        { "label": "New Remove Event", "body": { "remove": { "component_groups": ["$1"] } } },
        {
          "label": "New Random Event",
          "body": {
            "randomize": [
              { "add": { "component_groups": ["$1"] }, "weight": 1 },
              { "add": { "component_groups": ["$2"] }, "weight": 1 }
            ]
          }
        },
        {
          "label": "New Sequence Events",
          "body": {
            "sequence": [{ "add": { "component_groups": ["$1"] } }, { "add": { "component_groups": ["$2"] } }]
          }
        }
      ],
      "properties": {
        "filters": { "$ref": "./../filters/filters.json" },
        "trigger": {
          "description": "Triggers additional events.",
          "$comment": "UNDOCUMENTED",
          "title": "Trigger",
          "$ref": "./types/trigger.json"
        },
        "add": {
          "$ref": "#/definitions/addremove",
          "description": "What gets added when the event gets triggered.",
          "title": "Add"
        },
        "remove": {
          "$ref": "#/definitions/addremove",
          "description": "What gets removed when the event gets triggered.",
          "title": "Remove"
        },
        "randomize": {
          "type": "array",
          "description": "Randomly selects one of the following items based upon their weight and the total weights.",
          "title": "Randomize",
          "items": {
            "description": "Randomly selects one of the following items based upon their weight and the total weights.",
            "title": "Randomize",
            "examples": [{ "add": { "component_groups": ["foo:example"] }, "weight": 1 }],
            "$ref": "#/definitions/weighted_event_base"
          }
        },
        "sequence": {
          "type": "array",
          "description": "A series of filters and components to be added.",
          "title": "Sequences",
          "items": {
            "description": "Filters and components to be added.",
            "title": "Sequence",
            "type": "object",
            "$ref": "#/definitions/event_base"
          }
        },
        "emit_vibration": {
          "title": "Emit Vibration",
          "description": "UNDOCUMENTED",
          "type": "object",
          "properties": {
            "vibration": {
              "enum": [
                "shear",
                "entity_act",
                "entity_interact"
              ]
            }
          },
          "examples": [
            { "vibration": "shear"},
            { "vibration": "entity_act"},
            { "vibration": "entity_interact"}
          ]
        },
        "set_property": {
          "title": "Set Property",
          "description": "Sets a property on the entity.",
          "type": "object",
          "additionalProperties": {
            "title": "Property",
            "type": ["string", "number", "integer", "boolean"],
            "description": "The value to set the property to.",
            "examples": [false, 0, 0.0, "math.random(0, 10)"]
          },
          "examples": [
            { "example:property": false },
            { "example:property": 0 },
            { "example:property": 0.0 },
            { "example:property": "one" },
            { "example:property": "math.random(0, 10)" }
          ]
        },
        "queue_command": {
          "description": "Queues a command to be executed.",
          "properties": {
            "command": {
              "title": "Command",
              "description": "The command to execute.",
              "oneOf": [
                {
                  "type": "string",
                  "pattern": "^[^/].*$",
                  "examples": ["say Hello World"]
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "description": "The command to execute.",
                    "examples": ["say Hello World"],
                    "pattern": "^[^/].*$"
                  }
                }
              ]
            }
          }
        }
      }
    },
    "weighted_event_base": {
      "additionalProperties": false,
      "type": "object",
      "examples": [{}, { "add": { "component_groups": [] } }, { "remove": { "component_groups": [] } }],
      "defaultSnippets": [
        { "label": "New Add Event", "body": { "add": { "component_groups": ["$1"] } } },
        { "label": "New Remove Event", "body": { "remove": { "component_groups": ["$1"] } } },
        {
          "label": "New Random Event",
          "body": {
            "randomize": [
              { "add": { "component_groups": ["$1"] }, "weight": 1 },
              { "add": { "component_groups": ["$2"] }, "weight": 1 }
            ]
          }
        },
        {
          "label": "New Sequence Events",
          "body": {
            "sequence": [{ "add": { "component_groups": ["$1"] } }, { "add": { "component_groups": ["$2"] } }]
          }
        }
      ],
      "properties": {
        "filters": { "$ref": "./../filters/filters.json" },
        "trigger": {
          "description": "Triggers additional events.",
          "$comment": "UNDOCUMENTED",
          "title": "Trigger",
          "$ref": "./types/trigger.json"
        },
        "add": {
          "$ref": "#/definitions/addremove",
          "description": "What gets added when the event gets triggered.",
          "title": "Add"
        },
        "remove": {
          "$ref": "#/definitions/addremove",
          "description": "What gets removed when the event gets triggered.",
          "title": "Remove"
        },
        "randomize": {
          "type": "array",
          "description": "Randomly selects one of the following items based upon their weight and the total weights.",
          "title": "Randomize",
          "items": {
            "description": "Randomly selects one of the following items based upon their weight and the total weights.",
            "title": "Randomize",
            "examples": [{ "add": { "component_groups": ["foo:example"] }, "weight": 1 }],
            "$ref": "#/definitions/weighted_event_base"
          }
        },
        "sequence": {
          "type": "array",
          "description": "A series of filters and components to be added.",
          "title": "Sequences",
          "items": {
            "description": "Filters and components to be added.",
            "title": "Sequence",
            "type": "object",
            "$ref": "#/definitions/event_base"
          }
        },
        "emit_vibration": {
          "title": "Emit Vibration",
          "description": "UNDOCUMENTED",
          "type": "object",
          "properties": {
            "vibration": {
              "enum": [
                "shear",
                "entity_act",
                "entity_interact"
              ]
            }
          },
          "examples": [
            { "vibration": "shear"},
            { "vibration": "entity_act"},
            { "vibration": "entity_interact"}
          ]
        },
        "set_property": {
          "title": "Set Property",
          "description": "Sets a property on the entity.",
          "type": "object",
          "additionalProperties": {
            "title": "Property",
            "type": ["string", "number", "integer", "boolean"],
            "description": "The value to set the property to.",
            "examples": [false, 0, 0.0, "math.random(0, 10)"]
          },
          "examples": [
            { "example:property": false },
            { "example:property": 0 },
            { "example:property": 0.0 },
            { "example:property": "one" },
            { "example:property": "math.random(0, 10)" }
          ]
        },
        "queue_command": {
          "description": "Queues a command to be executed.",
          "properties": {
            "command": {
              "title": "Command",
              "description": "The command to execute.",
              "oneOf": [
                {
                  "type": "string",
                  "pattern": "^[^/].*$",
                  "examples": ["say Hello World"]
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "description": "The command to execute.",
                    "examples": ["say Hello World"],
                    "pattern": "^[^/].*$"
                  }
                }
              ]
            }
          }
        },
        "weight": {
          "type": "number",
          "default": 1,
          "minimum": 1,
          "description": "The weight on how likely this section is to trigger.",
          "$comment": "UNDOCUMENTED",
          "title": "Weight"
        }
      }
    }
  },
  "properties": {
    "minecraft:entity_transformed": {
      "description": "Event called on an entity that transforms into another entity.",
      "$ref": "#/definitions/event_base",
      "title": "Entity Transformed"
    },
    "minecraft:entity_born": {
      "description": "Event called on an entity that is spawned through two entities breeding.",
      "$ref": "#/definitions/event_base",
      "title": "Entity Born"
    },
    "minecraft:entity_spawned": {
      "description": "Event called on an entity that is placed in the level.",
      "$ref": "#/definitions/event_base",
      "title": "Entity Spawned"
    },
    "minecraft:on_prime": {
      "description": "Event called on an entity whose fuse is lit and is ready to explode.",
      "$ref": "#/definitions/event_base",
      "title": "On Prime"
    }
  }
}
