<members>
		<member name="floor_block_on_wall" type="bool" setter="set_floor_block_on_wall_enabled" getter="is_floor_block_on_wall_enabled" default="true">
			If [code]true[/code], the body will be able to move on the floor only. This option avoids to be able to walk on walls, it will however allow to slide down along them.
		</member>
		<member name="floor_constant_speed" type="bool" setter="set_floor_constant_speed_enabled" getter="is_floor_constant_speed_enabled" default="false">
			If [code]false[/code] (by default), the body will move faster on downward slopes and slower on upward slopes.
			If [code]true[/code], the body will always move at the same speed on the ground no matter the slope. Note that you need to use [member floor_snap_length] to stick along a downward slope at constant speed.
		</member>
		<member name="floor_max_angle" type="float" setter="set_floor_max_angle" getter="get_floor_max_angle" default="0.785398">
			Maximum angle (in radians) where a slope is still considered a floor (or a ceiling), rather than a wall, when calling [method move_and_slide]. The default value equals 45 degrees.
		</member>
		<member name="floor_snap_length" type="float" setter="set_floor_snap_length" getter="get_floor_snap_length" default="1.0">
			Sets a snapping distance. When set to a value different from [code]0.0[/code], the body is kept attached to slopes when calling [method move_and_slide]. The snapping vector is determined by the given distance along the opposite direction of the [member up_direction].
			As long as the snapping vector is in contact with the ground and the body moves against [member up_direction], the body will remain attached to the surface. Snapping is not applied if the body moves along [member up_direction], meaning it contains vertical rising velocity, so it will be able to detach from the ground when jumping or when the body is pushed up by something. If you want to apply a snap without taking into account the velocity, use [method apply_floor_snap].
		</member>
		<member name="floor_stop_on_slope" type="bool" setter="set_floor_stop_on_slope_enabled" getter="is_floor_stop_on_slope_enabled" default="true">
			If [code]true[/code], the body will not slide on slopes when calling [method move_and_slide] when the body is standing still.
			If [code]false[/code], the body will slide on floor's slopes when [member velocity] applies a downward force.
		</member>
		<member name="max_slides" type="int" setter="set_max_slides" getter="get_max_slides" default="4">
			Maximum number of times the body can change direction before it stops when calling [method move_and_slide].
		</member>
		<member name="motion_mode" type="int" setter="set_motion_mode" getter="get_motion_mode" enum="CharacterBody2D.MotionMode" default="0">
			Sets the motion mode which defines the behavior of [method move_and_slide]. See [enum MotionMode] constants for available modes.
		</member>
		<member name="platform_floor_layers" type="int" setter="set_platform_floor_layers" getter="get_platform_floor_layers" default="4294967295">
			Collision layers that will be included for detecting floor bodies that will act as moving platforms to be followed by the [CharacterBody2D]. By default, all floor bodies are detected and propagate their velocity.
		</member>
		<member name="platform_on_leave" type="int" setter="set_platform_on_leave" getter="get_platform_on_leave" enum="CharacterBody2D.PlatformOnLeave" default="0">
			Sets the behavior to apply when you leave a moving platform. By default, to be physically accurate, when you leave the last platform velocity is applied. See [enum PlatformOnLeave] constants for available behavior.
		</member>
		<member name="platform_wall_layers" type="int" setter="set_platform_wall_layers" getter="get_platform_wall_layers" default="0">
			Collision layers that will be included for detecting wall bodies that will act as moving platforms to be followed by the [CharacterBody2D]. By default, all wall bodies are ignored.
		</member>
		<member name="safe_margin" type="float" setter="set_safe_margin" getter="get_safe_margin" default="0.08">
			Extra margin used for collision recovery when calling [method move_and_slide].
			If the body is at least this close to another body, it will consider them to be colliding and will be pushed away before performing the actual motion.
			A higher value means it's more flexible for detecting collision, which helps with consistently detecting walls and floors.
			A lower value forces the collision algorithm to use more exact detection, so it can be used in cases that specifically require precision, e.g at very low scale to avoid visible jittering, or for stability with a stack of character bodies.
		</member>
		<member name="slide_on_ceiling" type="bool" setter="set_slide_on_ceiling_enabled" getter="is_slide_on_ceiling_enabled" default="true">
			If [code]true[/code], during a jump against the ceiling, the body will slide, if [code]false[/code] it will be stopped and will fall vertically.
		</member>
		<member name="up_direction" type="Vector2" setter="set_up_direction" getter="get_up_direction" default="Vector2(0, -1)">
			Vector pointing upwards, used to determine what is a wall and what is a floor (or a ceiling) when calling [method move_and_slide]. Defaults to [constant Vector2.UP]. As the vector will be normalized it can't be equal to [constant Vector2.ZERO], if you want all collisions to be reported as walls, consider using [constant MOTION_MODE_FLOATING] as [member motion_mode].
		</member>
		<member name="velocity" type="Vector2" setter="set_velocity" getter="get_velocity" default="Vector2(0, 0)">
			Current velocity vector in pixels per second, used and modified during calls to [method move_and_slide].
		</member>
		<member name="wall_min_slide_angle" type="float" setter="set_wall_min_slide_angle" getter="get_wall_min_slide_angle" default="0.261799">
			Minimum angle (in radians) where the body is allowed to slide when it encounters a slope. The default value equals 15 degrees. This property only affects movement when [member motion_mode] is [constant MOTION_MODE_FLOATING].
		</member>
	</members>
	<constants>
		<constant name="MOTION_MODE_GROUNDED" value="0" enum="MotionMode">
			Apply when notions of walls, ceiling and floor are relevant. In this mode the body motion will react to slopes (acceleration/slowdown). This mode is suitable for sided games like platformers.
		</constant>
		<constant name="MOTION_MODE_FLOATING" value="1" enum="MotionMode">
			Apply when there is no notion of floor or ceiling. All collisions will be reported as [code]on_wall[/code]. In this mode, when you slide, the speed will always be constant. This mode is suitable for top-down games.
		</constant>
		<constant name="PLATFORM_ON_LEAVE_ADD_VELOCITY" value="0" enum="PlatformOnLeave">
			Add the last platform velocity to the [member velocity] when you leave a moving platform.
		</constant>
		<constant name="PLATFORM_ON_LEAVE_ADD_UPWARD_VELOCITY" value="1" enum="PlatformOnLeave">
			Add the last platform velocity to the [member velocity] when you leave a moving platform, but any downward motion is ignored. It's useful to keep full jump height even when the platform is moving down.
		</constant>
		<constant name="PLATFORM_ON_LEAVE_DO_NOTHING" value="2" enum="PlatformOnLeave">
			Do nothing when leaving a platform.
		</constant>
	</constants>
</class>


<?xml version="1.0" encoding="UTF-8" ?>
<class name="MeshDataTool" inherits="RefCounted" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
	<brief_description>
		Helper tool to access and edit [Mesh] data.
	</brief_description>
	<description>
		MeshDataTool provides access to individual vertices in a [Mesh]. It allows users to read and edit vertex data of meshes. It also creates an array of faces and edges.
		To use MeshDataTool, load a mesh with [method create_from_surface]. When you are finished editing the data commit the data to a mesh with [method commit_to_surface].
		Below is an example of how MeshDataTool may be used.
		[codeblocks]
		[gdscript]
		var mesh = ArrayMesh.new()
		mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, BoxMesh.new().get_mesh_arrays())
		var mdt = MeshDataTool.new()
		mdt.create_from_surface(mesh, 0)
		for i in range(mdt.get_vertex_count()):
		    var vertex = mdt.get_vertex(i)
		    # In this example we extend the mesh by one unit, which results in separated faces as it is flat shaded.
		    vertex += mdt.get_vertex_normal(i)
		    # Save your change.
		    mdt.set_vertex(i, vertex)
		mesh.clear_surfaces()
		mdt.commit_to_surface(mesh)
		var mi = MeshInstance.new()
		mi.mesh = mesh
		add_child(mi)
		[/gdscript]
		[csharp]
		var mesh = new ArrayMesh();
		mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, new BoxMesh().GetMeshArrays());
		var mdt = new MeshDataTool();
		mdt.CreateFromSurface(mesh, 0);
		for (var i = 0; i < mdt.GetVertexCount(); i++)
		{
		    Vector3 vertex = mdt.GetVertex(i);
		    // In this example we extend the mesh by one unit, which results in separated faces as it is flat shaded.
		    vertex += mdt.GetVertexNormal(i);
		    // Save your change.
		    mdt.SetVertex(i, vertex);
		}
		mesh.ClearSurfaces();
		mdt.CommitToSurface(mesh);
		var mi = new MeshInstance();
		mi.Mesh = mesh;
		AddChild(mi);
		[/csharp]
		[/codeblocks]
		See also [ArrayMesh], [ImmediateMesh] and [SurfaceTool] for procedural geometry generation.
		[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-OpenGL/Face-culling]winding order[/url] for front faces of triangle primitive modes.
	</description>
	<tutorials>
		<link title="Using the MeshDataTool">$DOCS_URL/tutorials/3d/procedural_geometry/meshdatatool.html</link>
	</tutorials>


<?xml version="1.0" encoding="UTF-8" ?>
<class name="Variant" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
	<brief_description>
		The most important data type in Godot.
	</brief_description>
	<description>
		In computer programming, a Variant class is a class that is designed to store a variety of other types. Dynamic programming languages like PHP, Lua, JavaScript and GDScript like to use them to store variables' data on the backend. With these Variants, properties are able to change value types freely.
		[codeblocks]
		[gdscript]
		var foo = 2 # foo is dynamically an integer
		foo = "Now foo is a string!"
		foo = RefCounted.new() # foo is an Object
		var bar: int = 2 # bar is a statically typed integer.
		# bar = "Uh oh! I can't make statically typed variables become a different type!"
		[/gdscript]
		[csharp]
		// C# is statically typed. Once a variable has a type it cannot be changed. You can use the `var` keyword to let the compiler infer the type automatically.
		var foo = 2; // Foo is a 32-bit integer (int). Be cautious, integers in GDScript are 64-bit and the direct C# equivalent is `long`.
		// foo = "foo was and will always be an integer. It cannot be turned into a string!";
		var boo = "Boo is a string!";
		var ref = new RefCounted(); // var is especially useful when used together with a constructor.

		// Godot also provides a Variant type that works like a union of all the Variant-compatible types.
		Variant fooVar = 2; // fooVar is dynamically an integer (stored as a `long` in the Variant type).
		fooVar = "Now fooVar is a string!";
		fooVar = new RefCounted(); // fooVar is a GodotObject.
		[/csharp]
		[/codeblocks]
		Godot tracks all scripting API variables within Variants. Without even realizing it, you use Variants all the time. When a particular language enforces its own rules for keeping data typed, then that language is applying its own custom logic over the base Variant scripting API.
		- GDScript automatically wrap values in them. It keeps all data in plain Variants by default and then optionally enforces custom static typing rules on variable types.
		- C# is statically typed, but uses its own implementation of the Variant type in place of Godot's [Variant] class when it needs to represent a dynamic value. C# Variant can be assigned any compatible type implicitly but converting requires an explicit cast.
		The global [method @GlobalScope.typeof] function returns the enumerated value of the Variant type stored in the current variable (see [enum Variant.Type]).
		[codeblocks]
		[gdscript]
		var foo = 2
		match typeof(foo):
		    TYPE_NIL:
		        print("foo is null")
		    TYPE_INT:
		        print("foo is an integer")
		    TYPE_OBJECT:
		        # Note that Objects are their own special category.
		        # To get the name of the underlying Object type, you need the `get_class()` method.
		        print("foo is a(n) %s" % foo.get_class()) # inject the class name into a formatted string.
		        # Note that this does not get the script's `class_name` global identifier.
		        # If the `class_name` is needed, use `foo.get_script().get_global_name()` instead.
		[/gdscript]
		[csharp]
		Variant foo = 2;
		switch (foo.VariantType)
		{
		    case Variant.Type.Nil:
		        GD.Print("foo is null");
		        break;
		    case Variant.Type.Int:
		        GD.Print("foo is an integer");
		        break;
		    case Variant.Type.Object:
		        // Note that Objects are their own special category.
		        // You can convert a Variant to a GodotObject and use reflection to get its name.
		        GD.Print($"foo is a(n) {foo.AsGodotObject().GetType().Name}");
		        break;
		}
		[/csharp]
		[/codeblocks]
		A Variant takes up only 20 bytes and can store almost any engine datatype inside of it. Variants are rarely used to hold information for long periods of time. Instead, they are used mainly for communication, editing, serialization and moving data around.
		Godot has specifically invested in making its Variant class as flexible as possible; so much so that it is used for a multitude of operations to facilitate communication between all of Godot's systems.
		A Variant:
		- Can store almost any datatype.
		- Can perform operations between many variants. GDScript uses Variant as its atomic/native datatype.
		- Can be hashed, so it can be compared quickly to other variants.
		- Can be used to convert safely between datatypes.
		- Can be used to abstract calling methods and their arguments. Godot exports all its functions through variants.
		- Can be used to defer calls or move data between threads.
		- Can be serialized as binary and stored to disk, or transferred via network.
		- Can be serialized to text and use it for printing values and editable settings.
		- Can work as an exported property, so the editor can edit it universally.
		- Can be used for dictionaries, arrays, parsers, etc.
		[b]Containers (Array and Dictionary):[/b] Both are implemented using variants. A [Dictionary] can match any datatype used as key to any other datatype. An [Array] just holds an array of Variants. Of course, a Variant can also hold a [Dictionary] and an [Array] inside, making it even more flexible.
		Modifications to a container will modify all references to it. A [Mutex] should be created to lock it if multi-threaded access is desired.
	</description>
	<tutorials>
		<link title="Variant class introduction">$DOCS_URL/contributing/development/core_and_modules/variant_class.html</link>
	</tutorials>
</class>


<?xml version="1.0" encoding="UTF-8" ?>
<class name="Area3D" inherits="CollisionObject3D" keywords="trigger" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
	<brief_description>
		A region of 3D space that detects other [CollisionObject3D]s entering or exiting it.
	</brief_description>
	<description>
		[Area3D] is a region of 3D space defined by one or multiple [CollisionShape3D] or [CollisionPolygon3D] child nodes. It detects when other [CollisionObject3D]s enter or exit it, and it also keeps track of which collision objects haven't exited it yet (i.e. which one are overlapping it).
		This node can also locally alter or override physics parameters (gravity, damping) and route audio to custom audio buses.
		[b]Note:[/b] Areas and bodies created with [PhysicsServer3D] might not interact as expected with [Area3D]s, and might not emit signals or track objects correctly.
		[b]Warning:[/b] Using a [ConcavePolygonShape3D] inside a [CollisionShape3D] child of this node (created e.g. by using the [b]Create Trimesh Collision Sibling[/b] option in the [b]Mesh[/b] menu that appears when selecting a [MeshInstance3D] node) may give unexpected results, since this collision shape is hollow. If this is not desired, it has to be split into multiple [ConvexPolygonShape3D]s or primitive shapes like [BoxShape3D], or in some cases it may be replaceable by a [CollisionPolygon3D].
	</description>
	<tutorials>
		<link title="Using Area2D">$DOCS_URL/tutorials/physics/using_area_2d.html</link>
		<link title="3D Platformer Demo">https://godotengine.org/asset-library/asset/2748</link>
		<link title="GUI in 3D Viewport Demo">https://godotengine.org/asset-library/asset/2807</link>
	</tutorials>
	<methods>
		<method name="get_overlapping_areas" qualifiers="const">
			<return type="Area3D[]" />
			<description>
				Returns a list of intersecting [Area3D]s. The overlapping area's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected.
				For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved. Consider using signals instead.
			</description>
		</method>
		<method name="get_overlapping_bodies" qualifiers="const">
			<return type="Node3D[]" />
			<description>
				Returns a list of intersecting [PhysicsBody3D]s and [GridMap]s. The overlapping body's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected.
				For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved. Consider using signals instead.
			</description>
		</method>
		<method name="has_overlapping_areas" qualifiers="const">
			<return type="bool" />
			<description>
				Returns [code]true[/code] if intersecting any [Area3D]s, otherwise returns [code]false[/code]. The overlapping area's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected.
				For performance reasons (collisions are all processed at the same time) the list of overlapping areas is modified once during the physics step, not immediately after objects are moved. Consider using signals instead.
			</description>
		</method>
		<method name="has_overlapping_bodies" qualifiers="const">
			<return type="bool" />
			<description>
				Returns [code]true[/code] if intersecting any [PhysicsBody3D]s or [GridMap]s, otherwise returns [code]false[/code]. The overlapping body's [member CollisionObject3D.collision_layer] must be part of this area's [member CollisionObject3D.collision_mask] in order to be detected.
				For performance reasons (collisions are all processed at the same time) the list of overlapping bodies is modified once during the physics step, not immediately after objects are moved. Consider using signals instead.
			</description>
		</method>
		<method name="overlaps_area" qualifiers="const">
			<return type="bool" />
			<param index="0" name="area" type="Node" />
			<description>
				Returns [code]true[/code] if the given [Area3D] intersects or overlaps this [Area3D], [code]false[/code] otherwise.
				[b]Note:[/b] The result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead.
			</description>
		</method>
		<method name="overlaps_body" qualifiers="const">
			<return type="bool" />
			<param index="0" name="body" type="Node" />
			<description>
				Returns [code]true[/code] if the given physics body intersects or overlaps this [Area3D], [code]false[/code] otherwise.
				[b]Note:[/b] The result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead.
				The [param body] argument can either be a [PhysicsBody3D] or a [GridMap] instance. While GridMaps are not physics body themselves, they register their tiles with collision shapes as a virtual physics body.
			</description>
		</method>
	</methods>


<methods>
		<method name="edit_node">
			<return type="void" />
			<param index="0" name="node" type="Node" />
			<description>
				Edits the given [Node]. The node will be also selected if it's inside the scene tree.
			</description>
		</method>
		<method name="edit_resource">
			<return type="void" />
			<param index="0" name="resource" type="Resource" />
			<description>
				Edits the given [Resource]. If the resource is a [Script] you can also edit it with [method edit_script] to specify the line and column position.
			</description>
		</method>
		<method name="edit_script">
			<return type="void" />
			<param index="0" name="script" type="Script" />
			<param index="1" name="line" type="int" default="-1" />
			<param index="2" name="column" type="int" default="0" />
			<param index="3" name="grab_focus" type="bool" default="true" />
			<description>
				Edits the given [Script]. The line and column on which to open the script can also be specified. The script will be open with the user-configured editor for the script's language which may be an external editor.
			</description>
		</method>
		<method name="get_base_control" qualifiers="const">
			<return type="Control" />
			<description>
				Returns the main container of Godot editor's window. For example, you can use it to retrieve the size of the container and place your controls accordingly.
				[b]Warning:[/b] Removing and freeing this node will render the editor useless and may cause a crash.
			</description>
		</method>
		<method name="get_command_palette" qualifiers="const">
			<return type="EditorCommandPalette" />
			<description>
				Returns the editor's [EditorCommandPalette] instance.
				[b]Warning:[/b] Removing and freeing this node will render a part of the editor useless and may cause a crash.
			</description>
		</method>
		<method name="get_current_directory" qualifiers="const">
			<return type="String" />
			<description>
				Returns the current directory being viewed in the [FileSystemDock]. If a file is selected, its base directory will be returned using [method String.get_base_dir] instead.
			</description>
		</method>
		<method name="get_current_feature_profile" qualifiers="const">
			<return type="String" />
			<description>
				Returns the name of the currently activated feature profile. If the default profile is currently active, an empty string is returned instead.
				In order to get a reference to the [EditorFeatureProfile], you must load the feature profile using [method EditorFeatureProfile.load_from_file].
				[b]Note:[/b] Feature profiles created via the user interface are loaded from the [code]feature_profiles[/code] directory, as a file with the [code].profile[/code] extension. The editor configuration folder can be found by using [method EditorPaths.get_config_dir].
			</description>
		</method>
		<method name="get_current_path" qualifiers="const">
			<return type="String" />
			<description>
				Returns the current path being viewed in the [FileSystemDock].
			</description>
		</method>
		<method name="get_edited_scene_root" qualifiers="const">
			<return type="Node" />
			<description>
				Returns the edited (current) scene's root [Node].
			</description>
		</method>
		<method name="get_editor_main_screen" qualifiers="const">
			<return type="VBoxContainer" />
			<description>
				Returns the editor control responsible for main screen plugins and tools. Use it with plugins that implement [method EditorPlugin._has_main_screen].
				[b]Note:[/b] This node is a [VBoxContainer], which means that if you add a [Control] child to it, you need to set the child's [member Control.size_flags_vertical] to [constant Control.SIZE_EXPAND_FILL] to make it use the full available space.
				[b]Warning:[/b] Removing and freeing this node will render a part of the editor useless and may cause a crash.
			</description>
		</method>
		<method name="get_editor_paths" qualifiers="const">
			<return type="EditorPaths" />
			<description>
				Returns the [EditorPaths] singleton.
			</description>
		</method>
		<method name="get_editor_scale" qualifiers="const">
			<return type="float" />
			<description>
				Returns the actual scale of the editor UI ([code]1.0[/code] being 100% scale). This can be used to adjust position and dimensions of the UI added by plugins.
				[b]Note:[/b] This value is set via the [code]interface/editor/display_scale[/code] and [code]interface/editor/custom_display_scale[/code] editor settings. Editor must be restarted for changes to be properly applied.
			</description>
		</method>
		<method name="get_editor_settings" qualifiers="const">
			<return type="EditorSettings" />
			<description>
				Returns the editor's [EditorSettings] instance.
			</description>
		</method>
		<method name="get_editor_theme" qualifiers="const">
			<return type="Theme" />
			<description>
				Returns the editor's [Theme].
				[b]Note:[/b] When creating custom editor UI, prefer accessing theme items directly from your GUI nodes using the [code]get_theme_*[/code] methods.
			</description>
		</method>
		<method name="get_editor_undo_redo" qualifiers="const">
			<return type="EditorUndoRedoManager" />
			<description>
				Returns the editor's [EditorUndoRedoManager].
			</description>
		</method>
		<method name="get_editor_viewport_2d" qualifiers="const">
			<return type="SubViewport" />
			<description>
				Returns the 2D editor [SubViewport]. It does not have a camera. Instead, the view transforms are done directly and can be accessed with [member Viewport.global_canvas_transform].
			</description>
		</method>
		<method name="get_editor_viewport_3d" qualifiers="const">
			<return type="SubViewport" />
			<param index="0" name="idx" type="int" default="0" />
			<description>
				Returns the specified 3D editor [SubViewport], from [code]0[/code] to [code]3[/code]. The viewport can be used to access the active editor cameras with [method Viewport.get_camera_3d].
			</description>
		</method>
		<method name="get_file_system_dock" qualifiers="const">
			<return type="FileSystemDock" />
			<description>
				Returns the editor's [FileSystemDock] instance.
				[b]Warning:[/b] Removing and freeing this node will render a part of the editor useless and may cause a crash.
			</description>
		</method>
		<method name="get_inspector" qualifiers="const">
			<return type="EditorInspector" />
			<description>
				Returns the editor's [EditorInspector] instance.
				[b]Warning:[/b] Removing and freeing this node will render a part of the editor useless and may cause a crash.
			</description>
		</method>
		<method name="get_open_scenes" qualifiers="const">
			<return type="PackedStringArray" />
			<description>
				Returns an [Array] with the file paths of the currently opened scenes.
			</description>
		</method>
		<method name="get_playing_scene" qualifiers="const">
			<return type="String" />
			<description>
				Returns the name of the scene that is being played. If no scene is currently being played, returns an empty string.
			</description>
		</method>
		<method name="get_resource_filesystem" qualifiers="const">
			<return type="EditorFileSystem" />
			<description>
				Returns the editor's [EditorFileSystem] instance.
			</description>
		</method>
		<method name="get_resource_previewer" qualifiers="const">
			<return type="EditorResourcePreview" />
			<description>
				Returns the editor's [EditorResourcePreview] instance.
			</description>
		</method>


<?xml version="1.0" encoding="UTF-8" ?>
<class name="PlaneMesh" inherits="PrimitiveMesh" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
	<brief_description>
		Class representing a planar [PrimitiveMesh].
	</brief_description>
	<description>
		Class representing a planar [PrimitiveMesh]. This flat mesh does not have a thickness. By default, this mesh is aligned on the X and Z axes; this default rotation isn't suited for use with billboarded materials. For billboarded materials, change [member orientation] to [constant FACE_Z].
		[b]Note:[/b] When using a large textured [PlaneMesh] (e.g. as a floor), you may stumble upon UV jittering issues depending on the camera angle. To solve this, increase [member subdivide_depth] and [member subdivide_width] until you no longer notice UV jittering.
	</description>
	<tutorials>
	</tutorials>
	<members>
		<member name="center_offset" type="Vector3" setter="set_center_offset" getter="get_center_offset" default="Vector3(0, 0, 0)">
			Offset of the generated plane. Useful for particles.
		</member>
		<member name="orientation" type="int" setter="set_orientation" getter="get_orientation" enum="PlaneMesh.Orientation" default="1">
			Direction that the [PlaneMesh] is facing. See [enum Orientation] for options.
		</member>
		<member name="size" type="Vector2" setter="set_size" getter="get_size" default="Vector2(2, 2)">
			Size of the generated plane.
		</member>
		<member name="subdivide_depth" type="int" setter="set_subdivide_depth" getter="get_subdivide_depth" default="0">
			Number of subdivision along the Z axis.
		</member>
		<member name="subdivide_width" type="int" setter="set_subdivide_width" getter="get_subdivide_width" default="0">
			Number of subdivision along the X axis.
		</member>
	</members>
	<constants>
		<constant name="FACE_X" value="0" enum="Orientation">
			[PlaneMesh] will face the positive X-axis.
		</constant>
		<constant name="FACE_Y" value="1" enum="Orientation">
			[PlaneMesh] will face the positive Y-axis. This matches the behavior of the [PlaneMesh] in Godot 3.x.
		</constant>
		<constant name="FACE_Z" value="2" enum="Orientation">
			[PlaneMesh] will face the positive Z-axis. This matches the behavior of the QuadMesh in Godot 3.x.
		</constant>
	</constants>
</class>


<?xml version="1.0" encoding="UTF-8" ?>
<class name="Node" inherits="Object" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
	<brief_description>
		Base class for all scene objects.
	</brief_description>
	<description>
		Nodes are Godot's building blocks. They can be assigned as the child of another node, resulting in a tree arrangement. A given node can contain any number of nodes as children with the requirement that all siblings (direct children of a node) should have unique names.
		A tree of nodes is called a [i]scene[/i]. Scenes can be saved to the disk and then instantiated into other scenes. This allows for very high flexibility in the architecture and data model of Godot projects.
		[b]Scene tree:[/b] The [SceneTree] contains the active tree of nodes. When a node is added to the scene tree, it receives the [constant NOTIFICATION_ENTER_TREE] notification and its [method _enter_tree] callback is triggered. Child nodes are always added [i]after[/i] their parent node, i.e. the [method _enter_tree] callback of a parent node will be triggered before its child's.
		Once all nodes have been added in the scene tree, they receive the [constant NOTIFICATION_READY] notification and their respective [method _ready] callbacks are triggered. For groups of nodes, the [method _ready] callback is called in reverse order, starting with the children and moving up to the parent nodes.
		This means that when adding a node to the scene tree, the following order will be used for the callbacks: [method _enter_tree] of the parent, [method _enter_tree] of the children, [method _ready] of the children and finally [method _ready] of the parent (recursively for the entire scene tree).
		[b]Processing:[/b] Nodes can override the "process" state, so that they receive a callback on each frame requesting them to process (do something). Normal processing (callback [method _process], toggled with [method set_process]) happens as fast as possible and is dependent on the frame rate, so the processing time [i]delta[/i] (in seconds) is passed as an argument. Physics processing (callback [method _physics_process], toggled with [method set_physics_process]) happens a fixed number of times per second (60 by default) and is useful for code related to the physics engine.
		Nodes can also process input events. When present, the [method _input] function will be called for each input that the program receives. In many cases, this can be overkill (unless used for simple projects), and the [method _unhandled_input] function might be preferred; it is called when the input event was not handled by anyone else (typically, GUI [Control] nodes), ensuring that the node only receives the events that were meant for it.
		To keep track of the scene hierarchy (especially when instantiating scenes into other scenes), an "owner" can be set for the node with the [member owner] property. This keeps track of who instantiated what. This is mostly useful when writing editors and tools, though.
		Finally, when a node is freed with [method Object.free] or [method queue_free], it will also free all its children.
		[b]Groups:[/b] Nodes can be added to as many groups as you want to be easy to manage, you could create groups like "enemies" or "collectables" for example, depending on your game. See [method add_to_group], [method is_in_group] and [method remove_from_group]. You can then retrieve all nodes in these groups, iterate them and even call methods on groups via the methods on [SceneTree].
		[b]Networking with nodes:[/b] After connecting to a server (or making one, see [ENetMultiplayerPeer]), it is possible to use the built-in RPC (remote procedure call) system to communicate over the network. By calling [method rpc] with a method name, it will be called locally and in all connected peers (peers = clients and the server that accepts connections). To identify which node receives the RPC call, Godot will use its [NodePath] (make sure node names are the same on all peers). Also, take a look at the high-level networking tutorial and corresponding demos.
		[b]Note:[/b] The [code]script[/code] property is part of the [Object] class, not [Node]. It isn't exposed like most properties but does have a setter and getter (see [method Object.set_script] and [method Object.get_script]).
	</description>
	<tutorials>
		<link title="Nodes and scenes">$DOCS_URL/getting_started/step_by_step/nodes_and_scenes.html</link>
		<link title="All Demos">https://github.com/godotengine/godot-demo-projects/</link>
	</tutorials>


<methods>
		<method name="_enter_tree" qualifiers="virtual">
			<return type="void" />
			<description>
				Called when the node enters the [SceneTree] (e.g. upon instantiating, scene changing, or after calling [method add_child] in a script). If the node has children, its [method _enter_tree] callback will be called first, and then that of the children.
				Corresponds to the [constant NOTIFICATION_ENTER_TREE] notification in [method Object._notification].
			</description>
		</method>
		<method name="_exit_tree" qualifiers="virtual">
			<return type="void" />
			<description>
				Called when the node is about to leave the [SceneTree] (e.g. upon freeing, scene changing, or after calling [method remove_child] in a script). If the node has children, its [method _exit_tree] callback will be called last, after all its children have left the tree.
				Corresponds to the [constant NOTIFICATION_EXIT_TREE] notification in [method Object._notification] and signal [signal tree_exiting]. To get notified when the node has already left the active tree, connect to the [signal tree_exited].
			</description>
		</method>
		<method name="_get_configuration_warnings" qualifiers="virtual const">
			<return type="PackedStringArray" />
			<description>
				The elements in the array returned from this method are displayed as warnings in the Scene dock if the script that overrides it is a [code]tool[/code] script.
				Returning an empty array produces no warnings.
				Call [method update_configuration_warnings] when the warnings need to be updated for this node.
				[codeblock]
				@export var energy = 0:
				    set(value):
				        energy = value
				        update_configuration_warnings()

				func _get_configuration_warnings():
				    if energy < 0:
				        return ["Energy must be 0 or greater."]
				    else:
				        return []
				[/codeblock]
			</description>
		</method>
		<method name="_input" qualifiers="virtual">
			<return type="void" />
			<param index="0" name="event" type="InputEvent" />
			<description>
				Called when there is an input event. The input event propagates up through the node tree until a node consumes it.
				It is only called if input processing is enabled, which is done automatically if this method is overridden, and can be toggled with [method set_process_input].
				To consume the input event and stop it propagating further to other nodes, [method Viewport.set_input_as_handled] can be called.
				For gameplay input, [method _unhandled_input] and [method _unhandled_key_input] are usually a better fit as they allow the GUI to intercept the events first.
				[b]Note:[/b] This method is only called if the node is present in the scene tree (i.e. if it's not an orphan).
			</description>
		</method>
		<method name="_physics_process" qualifiers="virtual">
			<return type="void" />
			<param index="0" name="delta" type="float" />
			<description>
				Called during the physics processing step of the main loop. Physics processing means that the frame rate is synced to the physics, i.e. the [param delta] variable should be constant. [param delta] is in seconds.
				It is only called if physics processing is enabled, which is done automatically if this method is overridden, and can be toggled with [method set_physics_process].
				Processing happens in order of [member process_physics_priority], lower priority values are called first. Nodes with the same priority are processed in tree order, or top to bottom as seen in the editor (also known as pre-order traversal).
				Corresponds to the [constant NOTIFICATION_PHYSICS_PROCESS] notification in [method Object._notification].
				[b]Note:[/b] This method is only called if the node is present in the scene tree (i.e. if it's not an orphan).
			</description>
		</method>
		<method name="_process" qualifiers="virtual">
			<return type="void" />
			<param index="0" name="delta" type="float" />
			<description>
				Called during the processing step of the main loop. Processing happens at every frame and as fast as possible, so the [param delta] time since the previous frame is not constant. [param delta] is in seconds.
				It is only called if processing is enabled, which is done automatically if this method is overridden, and can be toggled with [method set_process].
				Processing happens in order of [member process_priority], lower priority values are called first. Nodes with the same priority are processed in tree order, or top to bottom as seen in the editor (also known as pre-order traversal).
				Corresponds to the [constant NOTIFICATION_PROCESS] notification in [method Object._notification].
				[b]Note:[/b] This method is only called if the node is present in the scene tree (i.e. if it's not an orphan).
			</description>
		</method>
		<method name="_ready" qualifiers="virtual">
			<return type="void" />
			<description>
				Called when the node is "ready", i.e. when both the node and its children have entered the scene tree. If the node has children, their [method _ready] callbacks get triggered first, and the parent node will receive the ready notification afterwards.
				Corresponds to the [constant NOTIFICATION_READY] notification in [method Object._notification]. See also the [code]@onready[/code] annotation for variables.
				Usually used for initialization. For even earlier initialization, [method Object._init] may be used. See also [method _enter_tree].
				[b]Note:[/b] This method may be called only once for each node. After removing a node from the scene tree and adding it again, [method _ready] will [b]not[/b] be called a second time. This can be bypassed by requesting another call with [method request_ready], which may be called anywhere before adding the node again.
			</description>
		</method>
		<method name="_shortcut_input" qualifiers="virtual">
			<return type="void" />
			<param index="0" name="event" type="InputEvent" />
			<description>
				Called when an [InputEventKey], [InputEventShortcut], or [InputEventJoypadButton] hasn't been consumed by [method _input] or any GUI [Control] item. It is called before [method _unhandled_key_input] and [method _unhandled_input]. The input event propagates up through the node tree until a node consumes it.
				It is only called if shortcut processing is enabled, which is done automatically if this method is overridden, and can be toggled with [method set_process_shortcut_input].
				To consume the input event and stop it propagating further to other nodes, [method Viewport.set_input_as_handled] can be called.
				This method can be used to handle shortcuts. For generic GUI events, use [method _input] instead. Gameplay events should usually be handled with either [method _unhandled_input] or [method _unhandled_key_input].
				[b]Note:[/b] This method is only called if the node is present in the scene tree (i.e. if it's not orphan).
			</description>
		</method>
		<method name="_unhandled_input" qualifiers="virtual">
			<return type="void" />
			<param index="0" name="event" type="InputEvent" />
			<description>
				Called when an [InputEvent] hasn't been consumed by [method _input] or any GUI [Control] item. It is called after [method _shortcut_input] and after [method _unhandled_key_input]. The input event propagates up through the node tree until a node consumes it.
				It is only called if unhandled input processing is enabled, which is done automatically if this method is overridden, and can be toggled with [method set_process_unhandled_input].
				To consume the input event and stop it propagating further to other nodes, [method Viewport.set_input_as_handled] can be called.
				For gameplay input, this method is usually a better fit than [method _input], as GUI events need a higher priority. For keyboard shortcuts, consider using [method _shortcut_input] instead, as it is called before this method. Finally, to handle keyboard events, consider using [method _unhandled_key_input] for performance reasons.
				[b]Note:[/b] This method is only called if the node is present in the scene tree (i.e. if it's not an orphan).
			</description>
		</method>


<method name="_unhandled_key_input" qualifiers="virtual">
			<return type="void" />
			<param index="0" name="event" type="InputEvent" />
			<description>
				Called when an [InputEventKey] hasn't been consumed by [method _input] or any GUI [Control] item. It is called after [method _shortcut_input] but before [method _unhandled_input]. The input event propagates up through the node tree until a node consumes it.
				It is only called if unhandled key input processing is enabled, which is done automatically if this method is overridden, and can be toggled with [method set_process_unhandled_key_input].
				To consume the input event and stop it propagating further to other nodes, [method Viewport.set_input_as_handled] can be called.
				This method can be used to handle Unicode character input with [kbd]Alt[/kbd], [kbd]Alt + Ctrl[/kbd], and [kbd]Alt + Shift[/kbd] modifiers, after shortcuts were handled.
				For gameplay input, this and [method _unhandled_input] are usually a better fit than [method _input], as GUI events should be handled first. This method also performs better than [method _unhandled_input], since unrelated events such as [InputEventMouseMotion] are automatically filtered. For shortcuts, consider using [method _shortcut_input] instead.
				[b]Note:[/b] This method is only called if the node is present in the scene tree (i.e. if it's not an orphan).
			</description>
		</method>
		<method name="add_child">
			<return type="void" />
			<param index="0" name="node" type="Node" />
			<param index="1" name="force_readable_name" type="bool" default="false" />
			<param index="2" name="internal" type="int" enum="Node.InternalMode" default="0" />
			<description>
				Adds a child [param node]. Nodes can have any number of children, but every child must have a unique name. Child nodes are automatically deleted when the parent node is deleted, so an entire scene can be removed by deleting its topmost node.
				If [param force_readable_name] is [code]true[/code], improves the readability of the added [param node]. If not named, the [param node] is renamed to its type, and if it shares [member name] with a sibling, a number is suffixed more appropriately. This operation is very slow. As such, it is recommended leaving this to [code]false[/code], which assigns a dummy name featuring [code]@[/code] in both situations.
				If [param internal] is different than [constant INTERNAL_MODE_DISABLED], the child will be added as internal node. These nodes are ignored by methods like [method get_children], unless their parameter [code]include_internal[/code] is [code]true[/code]. The intended usage is to hide the internal nodes from the user, so the user won't accidentally delete or modify them. Used by some GUI nodes, e.g. [ColorPicker]. See [enum InternalMode] for available modes.
				[b]Note:[/b] If [param node] already has a parent, this method will fail. Use [method remove_child] first to remove [param node] from its current parent. For example:
				[codeblocks]
				[gdscript]
				var child_node = get_child(0)
				if child_node.get_parent():
				    child_node.get_parent().remove_child(child_node)
				add_child(child_node)
				[/gdscript]
				[csharp]
				Node childNode = GetChild(0);
				if (childNode.GetParent() != null)
				{
				    childNode.GetParent().RemoveChild(childNode);
				}
				AddChild(childNode);
				[/csharp]
				[/codeblocks]
				If you need the child node to be added below a specific node in the list of children, use [method add_sibling] instead of this method.
				[b]Note:[/b] If you want a child to be persisted to a [PackedScene], you must set [member owner] in addition to calling [method add_child]. This is typically relevant for [url=$DOCS_URL/tutorials/plugins/running_code_in_the_editor.html]tool scripts[/url] and [url=$DOCS_URL/tutorials/plugins/editor/index.html]editor plugins[/url]. If [method add_child] is called without setting [member owner], the newly added [Node] will not be visible in the scene tree, though it will be visible in the 2D/3D view.
			</description>
		</method>
		<method name="add_sibling">
			<return type="void" />
			<param index="0" name="sibling" type="Node" />
			<param index="1" name="force_readable_name" type="bool" default="false" />
			<description>
				Adds a [param sibling] node to this node's parent, and moves the added sibling right below this node.
				If [param force_readable_name] is [code]true[/code], improves the readability of the added [param sibling]. If not named, the [param sibling] is renamed to its type, and if it shares [member name] with a sibling, a number is suffixed more appropriately. This operation is very slow. As such, it is recommended leaving this to [code]false[/code], which assigns a dummy name featuring [code]@[/code] in both situations.
				Use [method add_child] instead of this method if you don't need the child node to be added below a specific node in the list of children.
				[b]Note:[/b] If this node is internal, the added sibling will be internal too (see [method add_child]'s [code]internal[/code] parameter).
			</description>
		</method>
		<method name="add_to_group">
			<return type="void" />
			<param index="0" name="group" type="StringName" />
			<param index="1" name="persistent" type="bool" default="false" />
			<description>
				Adds the node to the [param group]. Groups can be helpful to organize a subset of nodes, for example [code]"enemies"[/code] or [code]"collectables"[/code]. See notes in the description, and the group methods in [SceneTree].
				If [param persistent] is [code]true[/code], the group will be stored when saved inside a [PackedScene]. All groups created and displayed in the Node dock are persistent.
				[b]Note:[/b] To improve performance, the order of group names is [i]not[/i] guaranteed and may vary between project runs. Therefore, do not rely on the group order.
				[b]Note:[/b] [SceneTree]'s group methods will [i]not[/i] work on this node if not inside the tree (see [method is_inside_tree]).
			</description>
		</method>
		<method name="atr" qualifiers="const">
			<return type="String" />
			<param index="0" name="message" type="String" />
			<param index="1" name="context" type="StringName" default="""" />
			<description>
				Translates a [param message], using the translation catalogs configured in the Project Settings. Further [param context] can be specified to help with the translation. Note that most [Control] nodes automatically translate their strings, so this method is mostly useful for formatted strings or custom drawn text.
				This method works the same as [method Object.tr], with the addition of respecting the [member auto_translate_mode] state.
				If [method Object.can_translate_messages] is [code]false[/code], or no translation is available, this method returns the [param message] without changes. See [method Object.set_message_translation].
				For detailed examples, see [url=$DOCS_URL/tutorials/i18n/internationalizing_games.html]Internationalizing games[/url].
			</description>
		</method>


<method name="get_node" qualifiers="const">
			<return type="Node" />
			<param index="0" name="path" type="NodePath" />
			<description>
				Fetches a node. The [NodePath] can either be a relative path (from this node), or an absolute path (from the [member SceneTree.root]) to a node. If [param path] does not point to a valid node, generates an error and returns [code]null[/code]. Attempts to access methods on the return value will result in an [i]"Attempt to call <method> on a null instance."[/i] error.
				[b]Note:[/b] Fetching by absolute path only works when the node is inside the scene tree (see [method is_inside_tree]).
				[b]Example:[/b] Assume this method is called from the Character node, inside the following tree:
				[codeblock lang=text]
				 ┖╴root
				    ┠╴Character (you are here!)
				    ┃  ┠╴Sword
				    ┃  ┖╴Backpack
				    ┃     ┖╴Dagger
				    ┠╴MyGame
				    ┖╴Swamp
				       ┠╴Alligator
				       ┠╴Mosquito
				       ┖╴Goblin
				[/codeblock]
				The following calls will return a valid node:
				[codeblocks]
				[gdscript]
				get_node("Sword")
				get_node("Backpack/Dagger")
				get_node("../Swamp/Alligator")
				get_node("/root/MyGame")
				[/gdscript]
				[csharp]
				GetNode("Sword");
				GetNode("Backpack/Dagger");
				GetNode("../Swamp/Alligator");
				GetNode("/root/MyGame");
				[/csharp]
				[/codeblocks]
			</description>
		</method>
		<method name="get_node_and_resource">
			<return type="Array" />
			<param index="0" name="path" type="NodePath" />
			<description>
				Fetches a node and its most nested resource as specified by the [NodePath]'s subname. Returns an [Array] of size [code]3[/code] where:
				- Element [code]0[/code] is the [Node], or [code]null[/code] if not found;
				- Element [code]1[/code] is the subname's last nested [Resource], or [code]null[/code] if not found;
				- Element [code]2[/code] is the remaining [NodePath], referring to an existing, non-[Resource] property (see [method Object.get_indexed]).
				[b]Example:[/b] Assume that the child's [member Sprite2D.texture] has been assigned a [AtlasTexture]:
				[codeblocks]
				[gdscript]
				var a = get_node_and_resource("Area2D/Sprite2D")
				print(a[0].name) # Prints Sprite2D
				print(a[1])      # Prints <null>
				print(a[2])      # Prints ^""

				var b = get_node_and_resource("Area2D/Sprite2D:texture:atlas")
				print(b[0].name)        # Prints Sprite2D
				print(b[1].get_class()) # Prints AtlasTexture
				print(b[2])             # Prints ^""

				var c = get_node_and_resource("Area2D/Sprite2D:texture:atlas:region")
				print(c[0].name)        # Prints Sprite2D
				print(c[1].get_class()) # Prints AtlasTexture
				print(c[2])             # Prints ^":region"
				[/gdscript]
				[csharp]
				var a = GetNodeAndResource(NodePath("Area2D/Sprite2D"));
				GD.Print(a[0].Name); // Prints Sprite2D
				GD.Print(a[1]);      // Prints <null>
				GD.Print(a[2]);      // Prints ^"

				var b = GetNodeAndResource(NodePath("Area2D/Sprite2D:texture:atlas"));
				GD.Print(b[0].name);        // Prints Sprite2D
				GD.Print(b[1].get_class()); // Prints AtlasTexture
				GD.Print(b[2]);             // Prints ^""

				var c = GetNodeAndResource(NodePath("Area2D/Sprite2D:texture:atlas:region"));
				GD.Print(c[0].name);        // Prints Sprite2D
				GD.Print(c[1].get_class()); // Prints AtlasTexture
				GD.Print(c[2]);             // Prints ^":region"
				[/csharp]
				[/codeblocks]
			</description>
		</method>
		<method name="get_node_or_null" qualifiers="const">
			<return type="Node" />
			<param index="0" name="path" type="NodePath" />
			<description>
				Fetches a node by [NodePath]. Similar to [method get_node], but does not generate an error if [param path] does not point to a valid node.
			</description>
		</method>
		<method name="get_parent" qualifiers="const">
			<return type="Node" />
			<description>
				Returns this node's parent node, or [code]null[/code] if the node doesn't have a parent.
			</description>
		</method>
		<method name="get_path" qualifiers="const">
			<return type="NodePath" />
			<description>
				Returns the node's absolute path, relative to the [member SceneTree.root]. If the node is not inside the scene tree, this method fails and returns an empty [NodePath].
			</description>
		</method>
		<method name="get_path_to" qualifiers="const">
			<return type="NodePath" />
			<param index="0" name="node" type="Node" />
			<param index="1" name="use_unique_path" type="bool" default="false" />
			<description>
				Returns the relative [NodePath] from this node to the specified [param node]. Both nodes must be in the same [SceneTree] or scene hierarchy, otherwise this method fails and returns an empty [NodePath].
				If [param use_unique_path] is [code]true[/code], returns the shortest path accounting for this node's unique name (see [member unique_name_in_owner]).
				[b]Note:[/b] If you get a relative path which starts from a unique node, the path may be longer than a normal relative path, due to the addition of the unique node's name.
			</description>
		</method>
		<method name="get_physics_process_delta_time" qualifiers="const">
			<return type="float" />
			<description>
				Returns the time elapsed (in seconds) since the last physics callback. This value is identical to [method _physics_process]'s [code]delta[/code] parameter, and is often consistent at run-time, unless [member Engine.physics_ticks_per_second] is changed. See also [constant NOTIFICATION_PHYSICS_PROCESS].
			</description>
		</method>
		<method name="get_process_delta_time" qualifiers="const">
			<return type="float" />
			<description>
				Returns the time elapsed (in seconds) since the last process callback. This value is identical to [method _process]'s [code]delta[/code] parameter, and may vary from frame to frame. See also [constant NOTIFICATION_PROCESS].
			</description>
		</method>
		<method name="get_rpc_config" qualifiers="const">
			<return type="Variant" />
			<description>
				Returns a [Dictionary] mapping method names to their RPC configuration defined for this node using [method rpc_config].
			</description>
		</method>
		<method name="get_scene_instance_load_placeholder" qualifiers="const">
			<return type="bool" />
			<description>
				Returns [code]true[/code] if this node is an instance load placeholder. See [InstancePlaceholder] and [method set_scene_instance_load_placeholder].
			</description>
		</method>
		<method name="get_tree" qualifiers="const">
			<return type="SceneTree" />
			<description>
				Returns the [SceneTree] that contains this node. If this node is not inside the tree, generates an error and returns [code]null[/code]. See also [method is_inside_tree].
			</description>
		</method>
		<method name="get_tree_string">
			<return typ


<param index="1" name="keep_groups" type="bool" default="false" />
			<description>
				Replaces this node by the given [param node]. All children of this node are moved to [param node].
				If [param keep_groups] is [code]true[/code], the [param node] is added to the same groups that the replaced node is in (see [method add_to_group]).
				[b]Warning:[/b] The replaced node is removed from the tree, but it is [b]not[/b] deleted. To prevent memory leaks, store a reference to the node in a variable, or use [method Object.free].
			</description>
		</method>
		<method name="request_ready">
			<return type="void" />
			<description>
				Requests [method _ready] to be called again the next time the node enters the tree. Does [b]not[/b] immediately call [method _ready].
				[b]Note:[/b] This method only affects the current node. If the node's children also need to request ready, this method needs to be called for each one of them. When the node and its children enter the tree again, the order of [method _ready] callbacks will be the same as normal.
			</description>
		</method>
		<method name="reset_physics_interpolation">
			<return type="void" />
			<description>
				When physics interpolation is active, moving a node to a radically different transform (such as placement within a level) can result in a visible glitch as the object is rendered moving from the old to new position over the physics tick.
				That glitch can be prevented by calling this method, which temporarily disables interpolation until the physics tick is complete.
				The notification [constant NOTIFICATION_RESET_PHYSICS_INTERPOLATION] will be received by the node and all children recursively.
				[b]Note:[/b] This function should be called [b]after[/b] moving the node, rather than before.
			</description>
		</method>
		<method name="rpc" qualifiers="vararg">
			<return type="int" enum="Error" />
			<param index="0" name="method" type="StringName" />
			<description>
				Sends a remote procedure call request for the given [param method] to peers on the network (and locally), sending additional arguments to the method called by the RPC. The call request will only be received by nodes with the same [NodePath], including the exact same [member name]. Behavior depends on the RPC configuration for the given [param method] (see [method rpc_config] and [annotation @GDScript.@rpc]). By default, methods are not exposed to RPCs.
				May return [constant OK] if the call is successful, [constant ERR_INVALID_PARAMETER] if the arguments passed in the [param method] do not match, [constant ERR_UNCONFIGURED] if the node's [member multiplayer] cannot be fetched (such as when the node is not inside the tree), [constant ERR_CONNECTION_ERROR] if [member multiplayer]'s connection is not available.
				[b]Note:[/b] You can only safely use RPCs on clients after you received the [signal MultiplayerAPI.connected_to_server] signal from the [MultiplayerAPI]. You also need to keep track of the connection state, either by the [MultiplayerAPI] signals like [signal MultiplayerAPI.server_disconnected] or by checking ([code]get_multiplayer().peer.get_connection_status() == CONNECTION_CONNECTED[/code]).
			</description>
		</method>
		<method name="rpc_config">
			<return type="void" />
			<param index="0" name="method" type="StringName" />
			<param index="1" name="config" type="Variant" />
			<description>
				Changes the RPC configuration for the given [param method]. [param config] should either be [code]null[/code] to disable the feature (as by default), or a [Dictionary] containing the following entries:
				- [code]rpc_mode[/code]: see [enum MultiplayerAPI.RPCMode];
				- [code]transfer_mode[/code]: see [enum MultiplayerPeer.TransferMode];
				- [code]call_local[/code]: if [code]true[/code], the method will also be called locally;
				- [code]channel[/code]: an [int] representing the channel to send the RPC on.
				[b]Note:[/b] In GDScript, this method corresponds to the [annotation @GDScript.@rpc] annotation, with various parameters passed ([code]@rpc(any)[/code], [code]@rpc(authority)[/code]...). See also the [url=$DOCS_URL/tutorials/networking/high_level_multiplayer.html]high-level multiplayer[/url] tutorial.
			</description>
		</method>
		<method name="rpc_id" qualifiers="vararg">
			<return type="int" enum="Error" />
			<param index="0" name="peer_id" type="int" />
			<param index="1" name="method" type="StringName" />
			<description>
				Sends a [method rpc] to a specific peer identified by [param peer_id] (see [method MultiplayerPeer.set_target_peer]).
				May return [constant OK] if the call is successful, [constant ERR_INVALID_PARAMETER] if the arguments passed in the [param method] do not match, [constant ERR_UNCONFIGURED] if the node's [member multiplayer] cannot be fetched (such as when the node is not inside the tree), [constant ERR_CONNECTION_ERROR] if [member multiplayer]'s connection is not available.
			</description>
		</method>
		<method name="set_deferred_thread_group">
			<return type="void" />
			<param index="0" name="property" type="StringName" />
			<param index="1" name="value" type="Variant" />
			<description>
				Similar to [method call_deferred_thread_group], but for setting properties.
			</description>
		</method>
		<method name="set_display_folded">
			<return type="void" />
			<param index="0" name="fold" type="bool" />
			<description>
				If set to [code]true[/code], the node appears folded in the Scene dock. As a result, all of its children are hidden. This method is intended to be used in editor plugins and tools, but it also works in release builds. See also [method is_displayed_folded].
			</description>
		</method>
		<method name="set_editable_instance">
			<return type="void" />
			<param index="0" name="node" type="Node" />
			<param index="1" name="is_editable" type="bool" />
			<description>
				Set to [code]true[/code] to allow all nodes owned by [param node] to be available, and editable, in the Scene dock, even if their [member owner] is not the scene root. This method is intended to be used in editor plugins and tools, but it also works in release builds. See also [method is_editable_instance].
			</description>
		</method>
		<method name="set_multiplayer_authority">
			<return type="void" />
			<param index="0" name="id" type="int" />
			<param index="1" name="recursive" type="bool" default="true" />
			<description>
				Sets the node's multiplayer authority to the peer with the given peer [param id]. The multiplayer authority is the peer that has authority over the node on the network. Defaults to peer ID 1 (the server). Useful in conjunction with [method rpc_config] and the [MultiplayerAPI].
				If [param recursive] is [code]true[/code], the given peer is recursively set as the authority for all children of this node.
				[b]Warning:[/b] This does [b]not[/b] automatically replicate the new authority to other peers. It is the developer's responsibility to do so. You may replicate the new authority's information using [member MultiplayerSpawner.spawn_function], an RPC, or a [MultiplayerSynchronizer]. Furthermore, the parent's authority does [b]not[/b] propagate to newly added children.
			</description>
		</method>
		<method name="set_physics_process">
			<return type="void" />
			<param index="0" name="enable" type="


_auto_translate_mode" enum="Node.AutoTranslateMode" default="0">
			Defines if any text should automatically change to its translated version depending on the current locale (for nodes such as [Label], [RichTextLabel], [Window], etc.). Also decides if the node's strings should be parsed for POT generation.
			[b]Note:[/b] For the root node, auto translate mode can also be set via [member ProjectSettings.internationalization/rendering/root_node_auto_translate].
		</member>
		<member name="editor_description" type="String" setter="set_editor_description" getter="get_editor_description" default="""">
			An optional description to the node. It will be displayed as a tooltip when hovering over the node in the editor's Scene dock.
		</member>
		<member name="multiplayer" type="MultiplayerAPI" setter="" getter="get_multiplayer">
			The [MultiplayerAPI] instance associated with this node. See [method SceneTree.get_multiplayer].
			[b]Note:[/b] Renaming the node, or moving it in the tree, will not move the [MultiplayerAPI] to the new path, you will have to update this manually.
		</member>
		<member name="name" type="StringName" setter="set_name" getter="get_name">
			The name of the node. This name must be unique among the siblings (other child nodes from the same parent). When set to an existing sibling's name, the node is automatically renamed.
			[b]Note:[/b] When changing the name, the following characters will be replaced with an underscore: ([code].[/code] [code]:[/code] [code]@[/code] [code]/[/code] [code]"[/code] [code]%[/code]). In particular, the [code]@[/code] character is reserved for auto-generated names. See also [method String.validate_node_name].
		</member>
		<member name="owner" type="Node" setter="set_owner" getter="get_owner">
			The owner of this node. The owner must be an ancestor of this node. When packing the owner node in a [PackedScene], all the nodes it owns are also saved with it.
			[b]Note:[/b] In the editor, nodes not owned by the scene root are usually not displayed in the Scene dock, and will [b]not[/b] be saved. To prevent this, remember to set the owner after calling [method add_child]. See also (see [member unique_name_in_owner])
		</member>
		<member name="physics_interpolation_mode" type="int" setter="set_physics_interpolation_mode" getter="get_physics_interpolation_mode" enum="Node.PhysicsInterpolationMode" default="0">
			Allows enabling or disabling physics interpolation per node, offering a finer grain of control than turning physics interpolation on and off globally. See [member ProjectSettings.physics/common/physics_interpolation] and [member SceneTree.physics_interpolation] for the global setting.
			[b]Note:[/b] When teleporting a node to a distant position you should temporarily disable interpolation with [method Node.reset_physics_interpolation].
		</member>
		<member name="process_mode" type="int" setter="set_process_mode" getter="get_process_mode" enum="Node.ProcessMode" default="0">
			The node's processing behavior (see [enum ProcessMode]). To check if the node can process in its current mode, use [method can_process].
		</member>
		<member name="process_physics_priority" type="int" setter="set_physics_process_priority" getter="get_physics_process_priority" default="0">
			Similar to [member process_priority] but for [constant NOTIFICATION_PHYSICS_PROCESS], [method _physics_process], or [constant NOTIFICATION_INTERNAL_PHYSICS_PROCESS].
		</member>
		<member name="process_priority" type="int" setter="set_process_priority" getter="get_process_priority" default="0">
			The node's execution order of the process callbacks ([method _process], [constant NOTIFICATION_PROCESS], and [constant NOTIFICATION_INTERNAL_PROCESS]). Nodes whose priority value is [i]lower[/i] call their process callbacks first, regardless of tree order.
		</member>
		<member name="process_thread_group" type="int" setter="set_process_thread_group" getter="get_process_thread_group" enum="Node.ProcessThreadGroup" default="0">
			Set the process thread group for this node (basically, whether it receives [constant NOTIFICATION_PROCESS], [constant NOTIFICATION_PHYSICS_PROCESS], [method _process] or [method _physics_process] (and the internal versions) on the main thread or in a sub-thread.
			By default, the thread group is [constant PROCESS_THREAD_GROUP_INHERIT], which means that this node belongs to the same thread group as the parent node. The thread groups means that nodes in a specific thread group will process together, separate to other thread groups (depending on [member process_thread_group_order]). If the value is set is [constant PROCESS_THREAD_GROUP_SUB_THREAD], this thread group will occur on a sub thread (not the main thread), otherwise if set to [constant PROCESS_THREAD_GROUP_MAIN_THREAD] it will process on the main thread. If there is not a parent or grandparent node set to something other than inherit, the node will belong to the [i]default thread group[/i]. This default group will process on the main thread and its group order is 0.
			During processing in a sub-thread, accessing most functions in nodes outside the thread group is forbidden (and it will result in an error in debug mode). Use [method Object.call_deferred], [method call_thread_safe], [method call_deferred_thread_group] and the likes in order to communicate from the thread groups to the main thread (or to other thread groups).
			To better understand process thread groups, the idea is that any node set to any other value than [constant PROCESS_THREAD_GROUP_INHERIT] will include any child (and grandchild) nodes set to inherit into its process thread group. This means that the processing of all the nodes in the group will happen together, at the same time as the node including them.
		</member>
		<member name="process_thread_group_order" type="int" setter="set_process_thread_group_order" getter="get_process_thread_group_order">
			Change the process thread group order. Groups with a lesser order will process before groups with a greater order. This is useful when a large amount of nodes process in sub thread and, afterwards, another group wants to collect their result in the main thread, as an example.
		</member>
		<member name="process_thread_messages" type="int" setter="set_process_thread_messages" getter="get_process_thread_messages" enum="Node.ProcessThreadMessages" is_bitfield="true">
			Set whether the current thread group will process messages (calls to [method call_deferred_thread_group] on threads), and whether it wants to receive them during regular process or physics process callbacks.
		</member>
		<member name="scene_file_path" type="String" setter="set_scene_file_path" getter="get_scene_file_path">
			The original scene's file path, if the node has been instantiated from a [PackedScene] file. Only scene root nodes contains this.
		</member>
		<member name="unique_name_in_owner" type="bool" setter="set_unique_name_in_owner" getter="is_unique_name_in_owner" default="false">
			If [code]true[/code], the node can be accessed from any node sharing the same [member owner] or from the [member owner] itself, with special [code]%Name[/code] syntax in [method get_node].
			[b]Note:[/b] If another node with the same [member owner] shares the same [member name] as this node, the other node will no longer be accessible as unique.
		</member>
	</members>
	<signals>
		<signal name="child_entered_tree">
			<param index="0" name="node" type="Node" />
			<desc


ription>
				Emitted when the child [param node] enters the [SceneTree], usually because this node entered the tree (see [signal tree_entered]), or [method add_child] has been called.
				This signal is emitted [i]after[/i] the child node's own [constant NOTIFICATION_ENTER_TREE] and [signal tree_entered].
			</description>
		</signal>
		<signal name="child_exiting_tree">
			<param index="0" name="node" type="Node" />
			<description>
				Emitted when the child [param node] is about to exit the [SceneTree], usually because this node is exiting the tree (see [signal tree_exiting]), or because the child [param node] is being removed or freed.
				When this signal is received, the child [param node] is still accessible inside the tree. This signal is emitted [i]after[/i] the child node's own [signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE].
			</description>
		</signal>
		<signal name="child_order_changed">
			<description>
				Emitted when the list of children is changed. This happens when child nodes are added, moved or removed.
			</description>
		</signal>
		<signal name="editor_description_changed">
			<param index="0" name="node" type="Node" />
			<description>
				Emitted when the node's editor description field changed.
			</description>
		</signal>
		<signal name="ready">
			<description>
				Emitted when the node is considered ready, after [method _ready] is called.
			</description>
		</signal>
		<signal name="renamed">
			<description>
				Emitted when the node's [member name] is changed, if the node is inside the tree.
			</description>
		</signal>
		<signal name="replacing_by">
			<param index="0" name="node" type="Node" />
			<description>
				Emitted when this node is being replaced by the [param node], see [method replace_by].
				This signal is emitted [i]after[/i] [param node] has been added as a child of the original parent node, but [i]before[/i] all original child nodes have been reparented to [param node].
			</description>
		</signal>
		<signal name="tree_entered">
			<description>
				Emitted when the node enters the tree.
				This signal is emitted [i]after[/i] the related [constant NOTIFICATION_ENTER_TREE] notification.
			</description>
		</signal>
		<signal name="tree_exited">
			<description>
				Emitted after the node exits the tree and is no longer active.
				This signal is emitted [i]after[/i] the related [constant NOTIFICATION_EXIT_TREE] notification.
			</description>
		</signal>
		<signal name="tree_exiting">
			<description>
				Emitted when the node is just about to exit the tree. The node is still valid. As such, this is the right place for de-initialization (or a "destructor", if you will).
				This signal is emitted [i]after[/i] the node's [method _exit_tree], and [i]before[/i] the related [constant NOTIFICATION_EXIT_TREE].
			</description>
		</signal>
	</signals>
	<constants>
		<constant name="NOTIFICATION_ENTER_TREE" value="10">
			Notification received when the n


<?xml version="1.0" encoding="UTF-8" ?>
<class name="MainLoop" inherits="Object" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
	<brief_description>
		Abstract base class for the game's main loop.
	</brief_description>
	<description>
		[MainLoop] is the abstract base class for a Godot project's game loop. It is inherited by [SceneTree], which is the default game loop implementation used in Godot projects, though it is also possible to write and use one's own [MainLoop] subclass instead of the scene tree.
		Upon the application start, a [MainLoop] implementation must be provided to the OS; otherwise, the application will exit. This happens automatically (and a [SceneTree] is created) unless a [MainLoop] [Script] is provided from the command line (with e.g. [code]godot -s my_loop.gd[/code]) or the "Main Loop Type" project setting is overwritten.
		Here is an example script implementing a simple [MainLoop]:
		[codeblocks]
		[gdscript]
		class_name CustomMainLoop
		extends MainLoop

		var time_elapsed = 0

		func _initialize():
		    print("Initialized:")
		    print("  Starting time: %s" % str(time_elapsed))

		func _process(delta):
		    time_elapsed += delta
		    # Return true to end the main loop.
		    return Input.get_mouse_button_mask() != 0 || Input.is_key_pressed(KEY_ESCAPE)

		func _finalize():
		    print("Finalized:")
		    print("  End time: %s" % str(time_elapsed))
		[/gdscript]
		[csharp]
		using Godot;

		[GlobalClass]
		public partial class CustomMainLoop : MainLoop
		{
		    private double _timeElapsed = 0;

		    public override void _Initialize()
		    {
		        GD.Print("Initialized:");
		        GD.Print($"  Starting Time: {_timeElapsed}");
		    }

		    public override bool _Process(double delta)
		    {
		        _timeElapsed += delta;
		        // Return true to end the main loop.
		        return Input.GetMouseButtonMask() != 0 || Input.IsKeyPressed(Key.Escape);
		    }

		    private void _Finalize()
		    {
		        GD.Print("Finalized:");
		        GD.Print($"  End Time: {_timeElapsed}");
		    }
		}
		[/csharp]
		[/codeblocks]
	</description>
	<tutorials>
	</tutorials>
	<methods>
		<method name="_finalize" qualifiers="virtual">
			<return type="void" />
			<description>
				Called before the program exits.
			</description>
		</method>
		<method name="_initialize" qualifiers="virtual">
			<return type="void" />
			<description>
				Called once during initialization.
			</description>
		</method>
		<method name="_physics_process" qualifiers="virtual">
			<return type="bool" />
			<param index="0" name="delta" type="float" />
			<description>
				Called each physics frame with the time since the last physics frame as argument ([param delta], in seconds). Equivalent to [method Node._physics_process].
				If implemented, the method must return a boolean value. [code]true[/code] ends the main loop, while [code]false[/code] lets it proceed to the next frame.
			</description>
		</method>
		<method name="_process" qualifiers="virtual">
			<return type="bool" />
			<param index="0" name="delta" type="float" />
			<description>
				Called each process (idle) frame with the time since the last process frame as argument (in seconds). Equivalent to [method Node._process].
				If implemented, the method must return a boolean value. [code]true[/code] ends the main loop, while [code]false[/code] lets it proceed to the next frame.
			</description>
		</method>
	</methods>
	<signals>
		<signal name="on_request_permissions_result">
			<param index="0" name="permission" type="String" />
			<param index="1" name="granted" type="bool" />
			<description>
				Emitted when a user responds to a permission request.
			</description>
		</signal>
	</signals>
	<constants>
		<constant name="NOTIFICATION_OS_MEMORY_WARNING" value="2009">
			Notification received from the OS when the application is exceeding its allocated memory.
			Specific to the iOS platform.
		</constant>
		<constant name="NOTIFICATION_TRANSLATION_CHANGED" value="2010">
			Notification received when translations may have changed. Can be triggered by the user changing the locale. Can be used to respond to language changes, for example to change the UI strings on the fly. Useful when working with the built-in translation support, like [method Object.tr].
		</constant>
		<constant name="NOTIFICATION_WM_ABOUT" value="2011">
			Notification received from the OS when a request for "About" information is sent.
			Specific to the macOS platform.
		</constant>
		<constant name="NOTIFICATION_CRASH" value="2012">
			Notification received from Godot's crash handler when the engine is about to crash.
			Implemented on desktop platforms if the crash handler is enabled.
		</constant>
		<constant name="NOTIFICATION_OS_IME_UPDATE" value="2013">
			Notification received from the OS when an update of the Input Method Engine occurs (e.g. change of IME cursor position or composition string).
			Specific to the macOS platform.
		</constant>
		<constant name="NOTIFICATION_APPLICATION_RESUMED" value="2014">
			Notification received from the OS when the application is resumed.
			Specific to the Android and iOS platforms.
		</constant>
		<constant name="NOTIFICATION_APPLICATION_PAUSED" value="2015">
			Notification received from the OS when the application is paused.
			Specific to the Android and iOS platforms.
			[b]Note:[/b] On iOS, you only have approximately 5 seconds to finish a task started by this signal. If you go over this allotment, iOS will kill the app instead of pausing it.
		</constant>
		<constant name="NOTIFICATION_APPLICATION_FOCUS_IN" value="2016">
			Notification received from the OS when the application is focused, i.e. when changing the focus from the OS desktop or a thirdparty application to any open window of the Godot instance.
			Implemented on desktop and mobile platforms.
		</constant>
		<constant name="NOTIFICATION_APPLICATION_FOCUS_OUT" value="2017">
			Notification received from the OS when the application is defocused, i.e. when changing the focus from any open window of the Godot instance to the OS desktop or a thirdparty application.
			Implemented on desktop and mobile platforms.
		</constant>
		<constant name="NOTIFICATION_TEXT_SERVER_CHANGED" value="2018">
			Notification received when text server is changed.
		</constant>
	</constants>
</class>


<?xml version="1.0" encoding="UTF-8" ?>
<class name="Object" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
	<brief_description>
		Base class for all other classes in the engine.
	</brief_description>
	<description>
		An advanced [Variant] type. All classes in the engine inherit from Object. Each class may define new properties, methods or signals, which are available to all inheriting classes. For example, a [Sprite2D] instance is able to call [method Node.add_child] because it inherits from [Node].
		You can create new instances, using [code]Object.new()[/code] in GDScript, or [code]new GodotObject[/code] in C#.
		To delete an Object instance, call [method free]. This is necessary for most classes inheriting Object, because they do not manage memory on their own, and will otherwise cause memory leaks when no longer in use. There are a few classes that perform memory management. For example, [RefCounted] (and by extension [Resource]) deletes itself when no longer referenced, and [Node] deletes its children when freed.
		Objects can have a [Script] attached to them. Once the [Script] is instantiated, it effectively acts as an extension to the base class, allowing it to define and inherit new properties, methods and signals.
		Inside a [Script], [method _get_property_list] may be overridden to customize properties in several ways. This allows them to be available to the editor, display as lists of options, sub-divide into groups, save on disk, etc. Scripting languages offer easier ways to customize properties, such as with the [annotation @GDScript.@export] annotation.
		Godot is very dynamic. An object's script, and therefore its properties, methods and signals, can be changed at run-time. Because of this, there can be occasions where, for example, a property required by a method may not exist. To prevent run-time errors, see methods such as [method set], [method get], [method call], [method has_method], [method has_signal], etc. Note that these methods are [b]much[/b] slower than direct references.
		In GDScript, you can also check if a given property, method, or signal name exists in an object with the [code]in[/code] operator:
		[codeblock]
		var node = Node.new()
		print("name" in node)         # Prints true
		print("get_parent" in node)   # Prints true
		print("tree_entered" in node) # Prints true
		print("unknown" in node)      # Prints false
		[/codeblock]
		Notifications are [int] constants commonly sent and received by objects. For example, on every rendered frame, the [SceneTree] notifies nodes inside the tree with a [constant Node.NOTIFICATION_PROCESS]. The nodes receive it and may call [method Node._process] to update. To make use of notifications, see [method notification] and [method _notification].
		Lastly, every object can also contain metadata (data about data). [method set_meta] can be useful to store information that the object itself does not depend on. To keep your code clean, making excessive use of metadata is discouraged.
		[b]Note:[/b] Unlike references to a [RefCounted], references to an object stored in a variable can become invalid without being set to [code]null[/code]. To check if an object has been deleted, do [i]not[/i] compare it against [code]null[/code]. Instead, use [method @GlobalScope.is_instance_valid]. It's also recommended to inherit from [RefCounted] for classes storing data instead of [Object].
		[b]Note:[/b] The [code]script[/code] is not exposed like most properties. To set or get an object's [Script] in code, use [method set_script] and [method get_script], respectively.
	</description>
	<tutorials>
		<link title="Object class introduction">$DOCS_URL/contributing/development/core_and_modules/object_class.html</link>
		<link title="When and how to avoid using nodes for everything">$DOCS_URL/tutorials/best_practices/node_alternatives.html</link>
		<link title="Object notifications">$DOCS_URL/tutorials/best_practices/godot_notifications.html</link>
	</tutorials>


<methods>
		<method name="_get" qualifiers="virtual">
			<return type="Variant" />
			<param index="0" name="property" type="StringName" />
			<description>
				Override this method to customize the behavior of [method get]. Should return the given [param property]'s value, or [code]null[/code] if the [param property] should be handled normally.
				Combined with [method _set] and [method _get_property_list], this method allows defining custom properties, which is particularly useful for editor plugins. Note that a property must be present in [method get_property_list], otherwise this method will not be called.
				[codeblocks]
				[gdscript]
				func _get(property):
				    if property == "fake_property":
				        print("Getting my property!")
				        return 4

				func _get_property_list():
				    return [
				        { "name": "fake_property", "type": TYPE_INT }
				    ]
				[/gdscript]
				[csharp]
				public override Variant _Get(StringName property)
				{
				    if (property == "FakeProperty")
				    {
				        GD.Print("Getting my property!");
				        return 4;
				    }
				    return default;
				}

				public override Godot.Collections.Array<Godot.Collections.Dictionary> _GetPropertyList()
				{
				    return new Godot.Collections.Array<Godot.Collections.Dictionary>()
				    {
				        new Godot.Collections.Dictionary()
				        {
				            { "name", "FakeProperty" },
				            { "type", (int)Variant.Type.Int }
				        }
				    };
				}
				[/csharp]
				[/codeblocks]
			</description>
		</method>
		<method name="_get_property_list" qualifiers="virtual">
			<return type="Dictionary[]" />
			<description>
				Override this method to provide a custom list of additional properties to handle by the engine.
				Should return a property list, as an [Array] of dictionaries. The result is added to the array of [method get_property_list], and should be formatted in the same way. Each [Dictionary] must at least contain the [code]name[/code] and [code]type[/code] entries.
				You can use [method _property_can_revert] and [method _property_get_revert] to customize the default values of the properties added by this method.
				The example below displays a list of numbers shown as words going from [code]ZERO[/code] to [code]FIVE[/code], with [code]number_count[/code] controlling the size of the list:
				[codeblocks]
				[gdscript]
				@tool
				extends Node

				@export var number_count = 3:
				    set(nc):
				        number_count = nc
				        numbers.resize(number_count)
				        notify_property_list_changed()

				var numbers = PackedInt32Array([0, 0, 0])

				func _get_property_list():
				    var properties = []

				    for i in range(number_count):
				        properties.append({
				            "name": "number_%d" % i,
				            "type": TYPE_INT,
				            "hint": PROPERTY_HINT_ENUM,
				            "hint_string": "ZERO,ONE,TWO,THREE,FOUR,FIVE",
				        })

				    return properties

				func _get(property):
				    if property.begins_with("number_"):
				        var index = property.get_slice("_", 1).to_int()
				        return numbers[index]

				func _set(property, value):
				    if property.begins_with("number_"):
				        var index = property.get_slice("_", 1).to_int()
				        numbers[index] = value
				        return true
				    return false
				[/gdscript]
				[csharp]
				[Tool]
				public partial class MyNode : Node
				{
				    private int _numberCount;

				    [Export]
				    public int NumberCount
				    {
				        get => _numberCount;
				        set
				        {
				            _numberCount = value;
				            _numbers.Resize(_numberCount);
				            NotifyPropertyListChanged();
				        }
				    }

				    private Godot.Collections.Array<int> _numbers = new();

				    public override Godot.Collections.Array<Godot.Collections.Dictionary> _GetPropertyList()
				    {
				        var properties = new Godot.Collections.Array<Godot.Collections.Dictionary>();

				        for (int i = 0; i < _numberCount; i++)
				        {
				            properties.Add(new Godot.Collections.Dictionary()
				            {
				                { "name", $"number_{i}" },
				                { "type", (int)Variant.Type.Int },
				                { "hint", (int)PropertyHint.Enum },
				                { "hint_string", "Zero,One,Two,Three,Four,Five" },
				            });
				        }

				        return properties;
				    }

				    public override Variant _Get(StringName property)
				    {
				        string propertyName = property.ToString();
				        if (propertyName.StartsWith("number_"))
				        {
				            int index = int.Parse(propertyName.Substring("number_".Length));
				            return _numbers[index];
				        }
				        return default;
				    }

				    public override bool _Set(StringName property, Variant value)
				    {
				        string propertyName = property.ToString();
				        if (propertyName.StartsWith("number_"))
				        {
				            int index = int.Parse(propertyName.Substring("number_".Length));
				            _numbers[index] = value.As<int>();
				            return true;
				        }
				        return false;
				    }
				}
				[/csharp]
				[/codeblocks]
				[b]Note:[/b] This method is intended for advanced purposes. For most common use cases, the scripting languages offer easier ways to handle properties. See [annotation @GDScript.@export], [annotation @GDScript.@export_enum], [annotation @GDScript.@export_group], etc. If you want to customize exported properties, use [method _validate_property].
				[b]Note:[/b] If the object's script is not [annotation @GDScript.@tool], this method will not be called in the editor.
			</description>
		</method>
		<method name="_init" qualifiers="virtual">
			<return type="void" />
			<description>
				Called when the object's script is instantiated, oftentimes after the object is initialized in memory (through [code]Object.new()[/code] in GDScript, or [code]new GodotObject[/code] in C#). It can be also defined to take in parameters. This method is similar to a constructor in most programming languages.
				[b]Note:[/b] If [method _init] is defined with [i]required[/i] parameters, the Object with script may only be created directly. If any other means (such as [method PackedScene.instantiate] or [method Node.duplicate]) are used, the script's initialization will fail.
			</description>
		</method>
		<method name="_iter_get" qualifiers="virtual">
			<return type="Variant" />
			<param index="0" name="iter" type="Variant" />
			<description>
				Returns the current iterable value. [param iter] stores the iteration state, but unlike [method _iter_init] and [method _iter_next] the state is supposed to be read-only, so there is no [Array] wrapper.
			</description>
		</method>
		<method name="_iter_init" qualifiers="virtual">
			<return type="bool" />
			<param index="0" name="iter" type="Array" />
			<description>
				Initializes the iterator. [param iter] stores the iteration state. Since GDScript does not support passing arguments by reference, a single-element array is used as a wrapper. Returns [code]true[/code] so long as the iterator has not reached the end.
				Example:
				[codeblock]
				class MyRange:
				    var _from
				    var _to

				    func _init(from, to):
				        assert(from <= to)
				        _from = from
				        _to = to

				    func _iter_init(iter):
				        iter[0] = _from
				        return iter[0] < _to

				    func _iter_next(iter):
				        iter[0] += 1
				        return iter[0] < _to

				    func _iter_get(iter):
				        return iter

				func _ready():
				    var my_range = MyRange.new(2, 5)
				    for x in my_range:
				        print(x) # Prints 2, 3, 4.
				[/codeblock]
				[b]Note:[/b] Alternatively, you can ignore [param iter] and use the object's state instead, see [url=$DOCS_URL/tutorials/scripting/gdscript/gdscript_advanced.html#custom-iterators]online docs[/url] for an example. Note that in this case you will not be able to reuse the same iterator instance in nested loops. Also, make sure you reset the iterator state in this method if you want to reuse the same instance multiple times.
			</description>
		</method>