<?xml version="1.0" encoding="UTF-8" ?>
<class name="AnimationNodeOneShot" inherits="AnimationNodeSync" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
	<brief_description>
		Plays an animation once in an [AnimationNodeBlendTree].
	</brief_description>
	<description>
		A resource to add to an [AnimationNodeBlendTree]. This animation node will execute a sub-animation and return once it finishes. Blend times for fading in and out can be customized, as well as filters.
		After setting the request and changing the animation playback, the one-shot node automatically clears the request on the next process frame by setting its [code]request[/code] value to [constant ONE_SHOT_REQUEST_NONE].
		[codeblocks]
		[gdscript]
		# Play child animation connected to "shot" port.
		animation_tree.set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE)
		# Alternative syntax (same result as above).
		animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE

		# Abort child animation connected to "shot" port.
		animation_tree.set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT)
		# Alternative syntax (same result as above).
		animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT

		# Abort child animation with fading out connected to "shot" port.
		animation_tree.set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT)
		# Alternative syntax (same result as above).
		animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_FADE_OUT

		# Get current state (read-only).
		animation_tree.get("parameters/OneShot/active")
		# Alternative syntax (same result as above).
		animation_tree["parameters/OneShot/active"]

		# Get current internal state (read-only).
		animation_tree.get("parameters/OneShot/internal_active")
		# Alternative syntax (same result as above).
		animation_tree["parameters/OneShot/internal_active"]
		[/gdscript]
		[csharp]
		// Play child animation connected to "shot" port.
		animationTree.Set("parameters/OneShot/request", (int)AnimationNodeOneShot.OneShotRequest.Fire);

		// Abort child animation connected to "shot" port.
		animationTree.Set("parameters/OneShot/request", (int)AnimationNodeOneShot.OneShotRequest.Abort);

		// Abort child animation with fading out connected to "shot" port.
		animationTree.Set("parameters/OneShot/request", (int)AnimationNodeOneShot.OneShotRequest.FadeOut);

		// Get current state (read-only).
		animationTree.Get("parameters/OneShot/active");

		// Get current internal state (read-only).
		animationTree.Get("parameters/OneShot/internal_active");
		[/csharp]
		[/codeblocks]
	</description>
	<tutorials>
		<link title="Using AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link>
		<link title="Third Person Shooter (TPS) Demo">https://godotengine.org/asset-library/asset/2710</link>
	</tutorials>
	<members>
		<member name="autorestart" type="bool" setter="set_autorestart" getter="has_autorestart" default="false">
			If [code]true[/code], the sub-animation will restart automatically after finishing.
			In other words, to start auto restarting, the animation must be played once with the [constant ONE_SHOT_REQUEST_FIRE] request. The [constant ONE_SHOT_REQUEST_ABORT] request stops the auto restarting, but it does not disable the [member autorestart] itself. So, the [constant ONE_SHOT_REQUEST_FIRE] request will start auto restarting again.
		</member>
		<member name="autorestart_delay" type="float" setter="set_autorestart_delay" getter="get_autorestart_delay" default="1.0">
			The delay after which the automatic restart is triggered, in seconds.
		</member>
		<member name="autorestart_random_delay" type="float" setter="set_autorestart_random_delay" getter="get_autorestart_random_delay" default="0.0">
			If [member autorestart] is [code]true[/code], a random additional delay (in seconds) between 0 and this value will be added to [member autorestart_delay].
		</member>
		<member name="break_loop_at_end" type="bool" setter="set_break_loop_at_end" getter="is_loop_broken_at_end" default="false">
			If [code]true[/code], breaks the loop at the end of the loop cycle for transition, even if the animation is looping.
		</member>
		<member name="fadein_curve" type="Curve" setter="set_fadein_curve" getter="get_fadein_curve">
			Determines how cross-fading between animations is eased. If empty, the transition will be linear.
		</member>
		<member name="fadein_time" type="float" setter="set_fadein_time" getter="get_fadein_time" default="0.0">
			The fade-in duration. For example, setting this to [code]1.0[/code] for a 5 second length animation will produce a cross-fade that starts at 0 second and ends at 1 second during the animation.
			[b]Note:[/b] [AnimationNodeOneShot] transitions the current state after the end of the fading. When [AnimationNodeOutput] is considered as the most upstream, so the [member fadein_time] is scaled depending on the downstream delta. For example, if this value is set to [code]1.0[/code] and a [AnimationNodeTimeScale] with a value of [code]2.0[/code] is chained downstream, the actual processing time will be 0.5 second.
		</member>
		<member name="fadeout_curve" type="Curve" setter="set_fadeout_curve" getter="get_fadeout_curve">
			Determines how cross-fading between animations is eased. If empty, the transition will be linear.
		</member>
		<member name="fadeout_time" type="float" setter="set_fadeout_time" getter="get_fadeout_time" default="0.0">
			The fade-out duration. For example, setting this to [code]1.0[/code] for a 5 second length animation will produce a cross-fade that starts at 4 second and ends at 5 second during the animation.
			[b]Note:[/b] [AnimationNodeOneShot] transitions the current state after the end of the fading. When [AnimationNodeOutput] is considered as the most upstream, so the [member fadeout_time] is scaled depending on the downstream delta. For example, if this value is set to [code]1.0[/code] and an [AnimationNodeTimeScale] with a value of [code]2.0[/code] is chained downstream, the actual processing time will be 0.5 second.
		</member>
		<member name="mix_mode" type="int" setter="set_mix_mode" getter="get_mix_mode" enum="AnimationNodeOneShot.MixMode" default="0">
			The blend type.
		</member>
	</members>
	<constants>
		<constant name="ONE_SHOT_REQUEST_NONE" value="0" enum="OneShotRequest">
			The default state of the request. Nothing is done.
		</constant>
		<constant name="ONE_SHOT_REQUEST_FIRE" value="1" enum="OneShotRequest">
			The request to play the animation connected to "shot" port.
		</constant>
		<constant name="ONE_SHOT_REQUEST_ABORT" value="2" enum="OneShotRequest">
			The request to stop the animation connected to "shot" port.
		</constant>
		<constant name="ONE_SHOT_REQUEST_FADE_OUT" value="3" enum="OneShotRequest">
			The request to fade out the animation connected to "shot" port.
		</constant>
		<constant name="MIX_MODE_BLEND" value="0" enum="MixMode">
			Blends two animations. See also [AnimationNodeBlend2].
		</constant>
		<constant name="MIX_MODE_ADD" value="1" enum="MixMode">
			Blends two animations additively. See also [AnimationNodeAdd2].
		</constant>
	</constants>
</class>
