{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "blockception.minecraft.resource.actor_animation",
  "defaultSnippets": [
    {
      "label": "New animation",
      "body": {
        "format_version": "${1:1.10.0}",
        "animations": {
          "animation.${2:${TM_FILENAME/[\\.].*//}}": "^{$3}"
        }
      }
    }
  ],
  "examples": [{ "format_version": "1.20.41", "animations": { "animation.annie.idle": { "loop": true, "animation_length": 2.12, "bones": {} } } }],
  "additionalProperties": false,
  "type": "object",
  "title": "Actor Animation",
  "description": "The RP animation that changes an actors models, or molang data.",
  "$comment": "UNDOCUMENTED",
  "definitions": {
    "ParticleEffect": {
      "type": "object",
      "title": "Particle Effect",
      "additionalProperties": false,
      "required": ["effect"],
      "properties": {
        "effect": { "type": "string", "title": "Particle Id", "description": "The name of a particle effect that should be played." },
        "locator": { "type": "string", "title": "Locator", "description": "The name of a locator on the actor where the effect should be located." },
        "pre_effect_script": {
          "title": "Pre Effect Script",
          "description": "A molang script that will be run when the particle emitter is initialized.",
          "$ref": "../../molang/string.json"
        },
        "bind_to_actor": {
          "type": "boolean",
          "title": "Bind To Actor",
          "description": "Set to false to have the effect spawned in the world without being bound to an actor (by default an effect is bound to the actor).",
          "const": false
        }
      }
    },
    "PositionV3": {
      "title": "Position Array",
      "description": "An array of 3 items that describe the bones position.",
      "type": "array",
      "examples": [[0, 0, 0]],
      "maxItems": 3,
      "minItems": 3,
      "items": [
        { "title": "Position X", "description": "The position over the X-axis or forwards/backwards.\nCan be molang or a float", "$ref": "../../molang/number.json" },
        { "title": "Position Y", "description": "The position over the Y-axis, or up/down.\nCan be molang or a float", "$ref": "../../molang/number.json" },
        { "title": "Position Z", "description": "The position over the Z-axis, or left/right.\nCan be molang or a float", "$ref": "../../molang/number.json" }
      ]
    },
    "RotationV3": {
      "title": "Rotation Array",
      "description": "An array of 3 items that describe the bones rotation.",
      "type": "array",
      "examples": [[0, 0, 0]],
      "maxItems": 3,
      "minItems": 3,
      "items": [
        { "title": "Rotation X", "description": "The rotation over the X-axis, or up or down.\nCan be molang or a float", "$ref": "../../molang/number.json" },
        { "title": "Rotation Y", "description": "The rotation over the Y-axis, or yaw.\nCan be molang or a float", "$ref": "../../molang/number.json" },
        { "title": "Rotation Z", "description": "The rotation over the Z-axis, or roll.\nCan be molang or a float", "$ref": "../../molang/number.json" }
      ]
    },
    "ScaleV3": {
      "title": "Scale Array",
      "description": "An array of 3 items that describe the bones scale.",
      "type": "array",
      "examples": [[0, 0, 0]],
      "maxItems": 3,
      "minItems": 3,
      "items": [
        { "title": "Scale X", "description": "The scale over the X-axis or forwards/backwards.\nCan be molang or a float", "$ref": "../../molang/number.json" },
        { "title": "Scale Y", "description": "The scale over the Y-axis, or up/down.\nCan be molang or a float", "$ref": "../../molang/number.json" },
        { "title": "Scale Z", "description": "The scale over the Z-axis, or left/right.\nCan be molang or a float", "$ref": "../../molang/number.json" }
      ]
    },
    "SoundEffect": {
      "title": "Sound Effect",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "effect": {
          "title": "Effect",
          "type": "string",
          "description": "Valid sound effect names should be listed in the entity's resource_definition json file."
        }
      }
    }
  },
  "required": ["format_version", "animations"],
  "properties": {
    "format_version": { "$ref": "../../general/format_version.json" },
    "animations": {
      "title": "Animations Schema",
      "description": "The animation specification.",
      "propertyNames": { "pattern": "^animation\\.[a-z\\.]+" },
      "type": "object",
      "additionalProperties": {
        "additionalProperties": false,
        "type": "object",
        "title": "Animation",
        "description": "The animation specification.",
        "properties": {
          "anim_time_update": {
            "title": "Animation Time Update",
            "description": "How does time pass when playing the animation. Defaults to `query.anim_time + query.delta_time` which means advance in seconds.",
            "$ref": "../../molang/number.json"
          },
          "animation_length": {
            "title": "Animation Length",
            "description": "Override calculated value (set as the last keyframe time) and set animation length in seconds.",
            "type": "number"
          },
          "blend_weight": {
            "title": "Blend Weight",
            "description": "The weight of the animation when blending with other animations. Defaults to 1.",
            "$comment": "UNDOCUMENTED",
            "$ref": "../../molang/number.json"
          },
          "bones": {
            "title": "Bones",
            "description": "Defines how the bones in an animation move or transform.",
            "propertyNames": { "examples": ["leftArm"] },
            "type": "object",
            "minProperties": 1,
            "additionalProperties": {
              "title": "Bone Transformation",
              "description": "The bone definition that declare how it transforms during animation.",
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "position": {
                  "title": "Position",
                  "description": "The Position transformation during this animation.",
                  "oneOf": [
                    { "type": "array", "$ref": "#/definitions/PositionV3" },
                    {
                      "type": "object",
                      "propertyNames": { "pattern": "^(\\d+\\.\\d+|\\d+)$", "examples": ["0.0", "1.0"] },
                      "additionalProperties": {
                        "title": "Timeline Object",
                        "description": "A single point in time.",
                        "oneOf": [
                          { "$ref": "../../molang/number.json", "description": "Uniform position." },
                          { "type": "array", "$ref": "#/definitions/PositionV3" },
                          {
                            "additionalProperties": false,
                            "type": "object",
                            "properties": {
                              "lerp_mode": {
                                "type": "string",
                                "title": "Lerp Mode",
                                "description": "UNDOCUMENTED.",
                                "$comment": "UNDOCUMENTED",
                                "enum": ["linear", "catmullrom"]
                              },
                              "pre": {
                                "title": "Pre",
                                "description": "UNDOCUMENTED.",
                                "$comment": "UNDOCUMENTED",
                                "$ref": "#/definitions/PositionV3"
                              },
                              "post": {
                                "title": "Pre",
                                "description": "UNDOCUMENTED.",
                                "$comment": "UNDOCUMENTED",
                                "$ref": "#/definitions/PositionV3"
                              }
                            }
                          }
                        ]
                      }
                    }
                  ]
                },
                "rotation": {
                  "title": "Rotation",
                  "description": "The rotation transformation during this animation.",
                  "oneOf": [
                    { "type": "array", "$ref": "#/definitions/RotationV3" },
                    {
                      "type": "object",
                      "propertyNames": { "pattern": "^(\\d+\\.\\d+|\\d+)$", "examples": ["0.0", "1.0"] },
                      "additionalProperties": {
                        "title": "Timeline Object",
                        "description": "A single point in time.",
                        "oneOf": [
                          { "$ref": "../../molang/number.json", "description": "Uniform rotation." },
                          {
                            "type": "array",
                            "description": "UNDOCUMENTED.",
                            "$comment": "UNDOCUMENTED",
                            "$ref": "#/definitions/RotationV3"
                          },
                          {
                            "additionalProperties": false,
                            "type": "object",
                            "properties": {
                              "lerp_mode": {
                                "type": "string",
                                "title": "Lerp Mode",
                                "description": "UNDOCUMENTED.",
                                "$comment": "UNDOCUMENTED",
                                "enum": ["linear", "catmullrom"]
                              },
                              "pre": {
                                "title": "Pre",
                                "description": "UNDOCUMENTED.",
                                "$comment": "UNDOCUMENTED",
                                "$ref": "#/definitions/RotationV3"
                              },
                              "post": {
                                "title": "Pre",
                                "description": "UNDOCUMENTED.",
                                "$comment": "UNDOCUMENTED",
                                "$ref": "#/definitions/RotationV3"
                              }
                            }
                          }
                        ]
                      }
                    }
                  ]
                },
                "relative_to": {
                  "title": "Relative To",
                  "description": "If set, makes the bone rotation relative to the entity instead of the bone's parent.",
                  "properties": {
                    "rotation": {
                      "title": "Rotation",
                      "description": "If set, makes the bone rotation relative to the entity instead of the bone's parent.",
                      "type": "string"
                    }
                  }
                },
                "scale": {
                  "title": "Scale",
                  "description": "UNDOCUMENTED.",
                  "$comment": "UNDOCUMENTED",
                  "oneOf": [
                    { "$ref": "../../molang/number.json", "description": "Uniform scale." },
                    { "$ref": "#/definitions/ScaleV3" },
                    {
                      "type": "object",
                      "propertyNames": { "pattern": "^(\\d+\\.\\d+|\\d+)$", "examples": ["0.0", "1.0"] },
                      "additionalProperties": {
                        "title": "Timeline Object",
                        "description": "A single point in time.",
                        "oneOf": [
                          { "$ref": "../../molang/number.json", "description": "Uniform rotation." },
                          {
                            "type": "array",
                            "description": "UNDOCUMENTED.",
                            "$comment": "UNDOCUMENTED",
                            "$ref": "#/definitions/ScaleV3"
                          },
                          {
                            "additionalProperties": false,
                            "type": "object",
                            "properties": {
                              "lerp_mode": {
                                "type": "string",
                                "title": "Lerp Mode",
                                "description": "UNDOCUMENTED.",
                                "$comment": "UNDOCUMENTED",
                                "enum": ["linear", "catmullrom"]
                              },
                              "pre": {
                                "title": "Pre",
                                "description": "UNDOCUMENTED.",
                                "$comment": "UNDOCUMENTED",
                                "$ref": "#/definitions/ScaleV3"
                              },
                              "post": {
                                "title": "Pre",
                                "description": "UNDOCUMENTED.",
                                "$comment": "UNDOCUMENTED",
                                "$ref": "#/definitions/ScaleV3"
                              }
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            }
          },
          "loop": {
            "title": "Loop",
            "description": "Should this animation stop, loop, or stay on the last frame when finished (true, false, hold_on_last_frame).",
            "oneOf": [{ "type": "boolean" }, { "type": "string", "enum": ["hold_on_last_frame"] }]
          },
          "loop_delay": {
            "title": "Loop Delay",
            "description": "How long to wait in seconds before looping this animation. Note that this expression is evaluated after each loop and on looping animation only.",
            "$ref": "../../molang/number.json"
          },
          "override_previous_animation": {
            "title": "Override Previous Animation",
            "description": "Reset bones in this animation to the default pose before applying this animation.",
            "type": "boolean"
          },
          "particle_effects": {
            "title": "Particle Effects",
            "description": "UNDOCUMENTED.",
            "$comment": "UNDOCUMENTED",
            "type": "object",
            "propertyNames": { "pattern": "^(\\d+\\.\\d+|\\d+)$", "examples": ["0.0", "1.0"] },
            "examples": [{ "0.0": {} }],
            "additionalProperties": {
              "title": "Timeline Object",
              "description": "A single point in time.",
              "oneOf": [
                { "type": "object", "$ref": "#/definitions/ParticleEffect" },
                { "type": "array", "items": { "$ref": "#/definitions/ParticleEffect" } }
              ]
            }
          },
          "start_delay": {
            "title": "Start Delay",
            "description": "How long to wait in seconds before playing this animation. Note that this expression is evaluated once before playing, and only re-evaluated if asked to play from the beginning again. A looping animation should use `loop_delay` if it wants a delay between loops.",
            "$ref": "../../molang/number.json"
          },
          "sound_effects": {
            "title": "Sound Effect",
            "description": "UNDOCUMENTED.",
            "$comment": "UNDOCUMENTED",
            "type": "object",
            "propertyNames": { "pattern": "^(\\d+\\.\\d+|\\d+)$", "examples": ["0.0", "1.0"] },
            "additionalProperties": {
              "title": "Timeline Object",
              "description": "A single point in time.",
              "oneOf": [
                { "type": "object", "$ref": "#/definitions/SoundEffect" },
                { "type": "array", "items": { "$ref": "#/definitions/SoundEffect" } }
              ]
            }
          },
          "timeline": {
            "title": "Timeline",
            "description": "The time line.",
            "type": "object",
            "propertyNames": { "pattern": "^(\\d+\\.\\d+|\\d+)$", "examples": ["0.0", "1.0"] },
            "examples": [{ "0.0": {} }],
            "additionalProperties": {
              "oneOf": [
                { "type": "string", "title": "Molang", "description": "Variable definition.", "pattern": "^(v|variable)\\..*=.*;$" },
                {
                  "type": "array",
                  "title": "Collection Timelime Items",
                  "items": { "type": "string", "title": "Molang", "description": "Variable definition.", "pattern": "^(v|variable)\\..*=.*;$" }
                }
              ]
            }
          }
        }
      }
    }
  }
}
