gd: added input addon

This commit is contained in:
2025-05-27 19:20:46 +02:00
parent d8a1604af9
commit c8d8c7ec25
683 changed files with 21608 additions and 2 deletions

View File

@ -0,0 +1,7 @@
extends Node2D
@export var mapping_context:GUIDEMappingContext
func _ready():
GUIDE.enable_mapping_context(mapping_context)

View File

@ -0,0 +1 @@
uid://dk0t3b28kxhf8

View File

@ -0,0 +1,87 @@
[gd_scene load_steps=18 format=3 uid="uid://b12bmbtmbuame"]
[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="1_eyn1y"]
[ext_resource type="Script" path="res://guide_examples/combos/combos.gd" id="1_kdeb4"]
[ext_resource type="Resource" uid="uid://c7uloa16ajj5p" path="res://guide_examples/combos/mapping_contexts/combos.tres" id="2_ahmv3"]
[ext_resource type="Script" path="res://guide_examples/combos/player.gd" id="3_kulxp"]
[ext_resource type="Resource" uid="uid://b2wemrcnxfbmo" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_horizontal.tres" id="4_7328w"]
[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="4_uej32"]
[ext_resource type="Resource" uid="uid://b0761600n8fnb" path="res://guide_examples/combos/mapping_contexts/combo_actions/fireball_left.tres" id="4_uvwd5"]
[ext_resource type="Resource" uid="uid://dj83uxjdx6r2c" path="res://guide_examples/combos/mapping_contexts/combo_actions/dash_left.tres" id="5_s5wpr"]
[ext_resource type="Resource" uid="uid://5ve3hevhhgnw" path="res://guide_examples/combos/mapping_contexts/combo_actions/dash_right.tres" id="6_vd0bg"]
[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="11_i5q2v"]
[ext_resource type="Resource" uid="uid://wdh7cg7kjul0" path="res://guide_examples/combos/mapping_contexts/combo_actions/fireball_right.tres" id="11_n707x"]
[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="11_obfhv"]
[ext_resource type="Resource" uid="uid://bqiryilvj5mqv" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_left.tres" id="12_0mhlm"]
[ext_resource type="PackedScene" uid="uid://c36cnvgv2ur60" path="res://guide_examples/shared/fireball/fireball.tscn" id="12_fl88r"]
[ext_resource type="Resource" uid="uid://bk54ofxos3xxg" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_right.tres" id="13_xn6qb"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_8kkfa"]
size = Vector2(137, 138)
[sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_0s5wn"]
[node name="Combos" type="Node2D"]
script = ExtResource("1_kdeb4")
mapping_context = ExtResource("2_ahmv3")
[node name="Player" type="CharacterBody2D" parent="."]
position = Vector2(902, 841)
script = ExtResource("3_kulxp")
dash_speed_bonus = 400.0
horizontal_movement = ExtResource("4_7328w")
dash_left = ExtResource("5_s5wpr")
dash_right = ExtResource("6_vd0bg")
fireball_left = ExtResource("4_uvwd5")
fireball_right = ExtResource("11_n707x")
fireball_scene = ExtResource("12_fl88r")
[node name="Sprite" type="Sprite2D" parent="Player"]
texture = ExtResource("4_uej32")
[node name="CollisionShape2D" type="CollisionShape2D" parent="Player"]
position = Vector2(1.5, 1)
shape = SubResource("RectangleShape2D_8kkfa")
[node name="Ground" type="StaticBody2D" parent="."]
position = Vector2(-44, 954)
[node name="ColorRect" type="ColorRect" parent="Ground"]
offset_left = -427.0
offset_right = 2555.0
offset_bottom = 150.0
color = Color(0.285871, 0.0915713, 0.0208481, 1)
[node name="CollisionShape2D" type="CollisionShape2D" parent="Ground"]
position = Vector2(869, 1)
shape = SubResource("WorldBoundaryShape2D_0s5wn")
[node name="UILayer" type="CanvasLayer" parent="."]
[node name="InstructionsLabel" type="RichTextLabel" parent="UILayer"]
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -482.0
offset_top = 21.0
offset_bottom = 205.0
grow_horizontal = 0
theme = ExtResource("11_i5q2v")
bbcode_enabled = true
text = "Lore, ipsum dolor sit amet."
fit_content = true
scroll_active = false
script = ExtResource("11_obfhv")
instructions_text = "Press %s to move left.
Press %s to move right.
Press %s to dash left.
Press %s to dash right.
Press %s shoot a fireball to the left.
Press %s to shoot a fireball to the right."
actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("12_0mhlm"), ExtResource("13_xn6qb"), ExtResource("5_s5wpr"), ExtResource("6_vd0bg"), ExtResource("4_uvwd5"), ExtResource("11_n707x")])
[node name="DebuggerLayer" type="CanvasLayer" parent="."]
[node name="GuideDebugger" parent="DebuggerLayer" instance=ExtResource("1_eyn1y")]
theme = ExtResource("11_i5q2v")
metadata/_edit_lock_ = true

View File

@ -0,0 +1,13 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cgr4iegvrkebx"]
[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_pxjqb"]
[resource]
script = ExtResource("1_pxjqb")
name = &""
action_value_type = 0
block_lower_priority_actions = true
emit_as_godot_actions = false
is_remappable = false
display_name = ""
display_category = "Player Controls"

View File

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://b2wemrcnxfbmo"]
[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_bg42k"]
[resource]
script = ExtResource("1_bg42k")
name = &""
action_value_type = 0
emit_as_godot_actions = false
is_remappable = false
display_name = ""
display_category = ""

View File

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bqiryilvj5mqv"]
[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_pxjqb"]
[resource]
script = ExtResource("1_pxjqb")
name = &""
action_value_type = 0
emit_as_godot_actions = false
is_remappable = false
display_name = ""
display_category = ""

View File

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bk54ofxos3xxg"]
[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_ppgom"]
[resource]
script = ExtResource("1_ppgom")
name = &""
action_value_type = 0
emit_as_godot_actions = false
is_remappable = false
display_name = ""
display_category = ""

View File

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://dj83uxjdx6r2c"]
[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_hxh8l"]
[resource]
script = ExtResource("1_hxh8l")
name = &""
action_value_type = 0
emit_as_godot_actions = false
is_remappable = false
display_name = ""
display_category = ""

View File

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://5ve3hevhhgnw"]
[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_cbjx7"]
[resource]
script = ExtResource("1_cbjx7")
name = &""
action_value_type = 0
emit_as_godot_actions = false
is_remappable = false
display_name = ""
display_category = ""

View File

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://b0761600n8fnb"]
[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_exrdu"]
[resource]
script = ExtResource("1_exrdu")
name = &""
action_value_type = 0
emit_as_godot_actions = false
is_remappable = false
display_name = ""
display_category = ""

View File

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://wdh7cg7kjul0"]
[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_clys2"]
[resource]
script = ExtResource("1_clys2")
name = &""
action_value_type = 0
emit_as_godot_actions = false
is_remappable = false
display_name = ""
display_category = ""

View File

@ -0,0 +1,299 @@
[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=57 format=3 uid="uid://c7uloa16ajj5p"]
[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_bycs2"]
[ext_resource type="Resource" uid="uid://bqiryilvj5mqv" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_left.tres" id="1_pb347"]
[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="2_o8ffe"]
[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_wsx31"]
[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="3_dnh2v"]
[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="3_ji605"]
[ext_resource type="Resource" uid="uid://bk54ofxos3xxg" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_right.tres" id="5_jksbs"]
[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_action.gd" id="8_04uuh"]
[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_combo_cancel_action.gd" id="8_ewrgg"]
[ext_resource type="Resource" uid="uid://5ve3hevhhgnw" path="res://guide_examples/combos/mapping_contexts/combo_actions/dash_right.tres" id="9_ciqk8"]
[ext_resource type="Resource" uid="uid://b0761600n8fnb" path="res://guide_examples/combos/mapping_contexts/combo_actions/fireball_left.tres" id="9_lvx6c"]
[ext_resource type="Resource" uid="uid://wdh7cg7kjul0" path="res://guide_examples/combos/mapping_contexts/combo_actions/fireball_right.tres" id="12_icm8e"]
[ext_resource type="Resource" uid="uid://b2wemrcnxfbmo" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_horizontal.tres" id="13_u4d84"]
[ext_resource type="Resource" uid="uid://cgr4iegvrkebx" path="res://guide_examples/combos/mapping_contexts/basic_actions/fire.tres" id="17_yw71c"]
[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_combo.gd" id="19_kw0e0"]
[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_combo_step.gd" id="20_226av"]
[ext_resource type="Resource" uid="uid://dj83uxjdx6r2c" path="res://guide_examples/combos/mapping_contexts/combo_actions/dash_left.tres" id="21_wfbjl"]
[sub_resource type="Resource" id="Resource_le3gd"]
script = ExtResource("2_wsx31")
key = 65
shift = false
control = false
alt = false
meta = false
allow_additional_modifiers = true
[sub_resource type="Resource" id="Resource_jphf8"]
script = ExtResource("3_dnh2v")
override_action_settings = false
is_remappable = false
display_name = ""
display_category = ""
input = SubResource("Resource_le3gd")
modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([])
triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([])
metadata/_guide_modifiers_collapsed = true
[sub_resource type="Resource" id="Resource_ohm7l"]
script = ExtResource("2_o8ffe")
action = ExtResource("1_pb347")
input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_jphf8")])
metadata/_guide_input_mappings_collapsed = false
[sub_resource type="Resource" id="Resource_bf80h"]
script = ExtResource("2_wsx31")
key = 68
shift = false
control = false
alt = false
meta = false
allow_additional_modifiers = true
[sub_resource type="Resource" id="Resource_o2rir"]
script = ExtResource("3_dnh2v")
override_action_settings = false
is_remappable = false
display_name = ""
display_category = ""
input = SubResource("Resource_bf80h")
modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([])
triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([])
[sub_resource type="Resource" id="Resource_3ojw4"]
script = ExtResource("2_o8ffe")
action = ExtResource("5_jksbs")
input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_o2rir")])
metadata/_guide_input_mappings_collapsed = false
[sub_resource type="Resource" id="Resource_xe8bg"]
script = ExtResource("8_04uuh")
action = ExtResource("1_pb347")
[sub_resource type="Resource" id="Resource_tisnm"]
script = ExtResource("3_ji605")
x = true
y = true
z = true
[sub_resource type="Resource" id="Resource_6q14n"]
script = ExtResource("3_dnh2v")
override_action_settings = false
is_remappable = false
display_name = ""
display_category = ""
input = SubResource("Resource_xe8bg")
modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_tisnm")])
triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([])
[sub_resource type="Resource" id="Resource_p31qj"]
script = ExtResource("8_04uuh")
action = ExtResource("5_jksbs")
[sub_resource type="Resource" id="Resource_m3jub"]
script = ExtResource("3_dnh2v")
override_action_settings = false
is_remappable = false
display_name = ""
display_category = ""
input = SubResource("Resource_p31qj")
modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([])
triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([])
[sub_resource type="Resource" id="Resource_nypfm"]
script = ExtResource("2_o8ffe")
action = ExtResource("13_u4d84")
input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_6q14n"), SubResource("Resource_m3jub")])
metadata/_guide_input_mappings_collapsed = false
[sub_resource type="Resource" id="Resource_rgf84"]
script = ExtResource("2_wsx31")
key = 32
shift = false
control = false
alt = false
meta = false
allow_additional_modifiers = true
[sub_resource type="Resource" id="Resource_wf4jl"]
script = ExtResource("3_dnh2v")
override_action_settings = false
is_remappable = false
display_name = ""
display_category = ""
input = SubResource("Resource_rgf84")
modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([])
triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([])
[sub_resource type="Resource" id="Resource_qxroc"]
script = ExtResource("2_o8ffe")
action = ExtResource("17_yw71c")
input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_wf4jl")])
metadata/_guide_input_mappings_collapsed = false
[sub_resource type="Resource" id="Resource_ai4v6"]
script = ExtResource("8_ewrgg")
action = ExtResource("5_jksbs")
completion_events = 1
[sub_resource type="Resource" id="Resource_22wmg"]
script = ExtResource("20_226av")
action = ExtResource("1_pb347")
completion_events = 16
time_to_actuate = 0.5
[sub_resource type="Resource" id="Resource_m5xce"]
script = ExtResource("20_226av")
action = ExtResource("1_pb347")
completion_events = 16
time_to_actuate = 0.5
[sub_resource type="Resource" id="Resource_bc2sa"]
script = ExtResource("19_kw0e0")
enable_debug_print = false
steps = Array[ExtResource("20_226av")]([SubResource("Resource_22wmg"), SubResource("Resource_m5xce")])
cancellation_actions = Array[ExtResource("8_ewrgg")]([SubResource("Resource_ai4v6")])
actuation_threshold = 0.5
[sub_resource type="Resource" id="Resource_00r0g"]
script = ExtResource("3_dnh2v")
override_action_settings = false
is_remappable = false
display_name = ""
display_category = ""
modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([])
triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_bc2sa")])
[sub_resource type="Resource" id="Resource_abarl"]
script = ExtResource("2_o8ffe")
action = ExtResource("21_wfbjl")
input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_00r0g")])
metadata/_guide_input_mappings_collapsed = false
[sub_resource type="Resource" id="Resource_w3it8"]
script = ExtResource("8_ewrgg")
action = ExtResource("1_pb347")
completion_events = 1
[sub_resource type="Resource" id="Resource_o1r17"]
script = ExtResource("20_226av")
action = ExtResource("5_jksbs")
completion_events = 16
time_to_actuate = 0.5
[sub_resource type="Resource" id="Resource_y7323"]
script = ExtResource("20_226av")
action = ExtResource("5_jksbs")
completion_events = 16
time_to_actuate = 0.5
[sub_resource type="Resource" id="Resource_0x6c4"]
script = ExtResource("19_kw0e0")
enable_debug_print = false
steps = Array[ExtResource("20_226av")]([SubResource("Resource_o1r17"), SubResource("Resource_y7323")])
cancellation_actions = Array[ExtResource("8_ewrgg")]([SubResource("Resource_w3it8")])
actuation_threshold = 0.5
[sub_resource type="Resource" id="Resource_wnc21"]
script = ExtResource("3_dnh2v")
override_action_settings = false
is_remappable = false
display_name = ""
display_category = ""
modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([])
triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_0x6c4")])
[sub_resource type="Resource" id="Resource_1vsh7"]
script = ExtResource("2_o8ffe")
action = ExtResource("9_ciqk8")
input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_wnc21")])
metadata/_guide_input_mappings_collapsed = false
[sub_resource type="Resource" id="Resource_cbc1w"]
script = ExtResource("20_226av")
action = ExtResource("5_jksbs")
completion_events = 16
time_to_actuate = 0.5
[sub_resource type="Resource" id="Resource_k4x1t"]
script = ExtResource("20_226av")
action = ExtResource("1_pb347")
completion_events = 16
time_to_actuate = 0.5
[sub_resource type="Resource" id="Resource_ryygs"]
script = ExtResource("20_226av")
action = ExtResource("17_yw71c")
completion_events = 16
time_to_actuate = 0.5
[sub_resource type="Resource" id="Resource_wocqt"]
script = ExtResource("19_kw0e0")
enable_debug_print = false
steps = Array[ExtResource("20_226av")]([SubResource("Resource_cbc1w"), SubResource("Resource_k4x1t"), SubResource("Resource_ryygs")])
cancellation_actions = Array[ExtResource("8_ewrgg")]([])
actuation_threshold = 0.5
[sub_resource type="Resource" id="Resource_v7om3"]
script = ExtResource("3_dnh2v")
override_action_settings = false
is_remappable = false
display_name = ""
display_category = ""
modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([])
triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_wocqt")])
[sub_resource type="Resource" id="Resource_40qct"]
script = ExtResource("2_o8ffe")
action = ExtResource("9_lvx6c")
input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_v7om3")])
metadata/_guide_input_mappings_collapsed = false
[sub_resource type="Resource" id="Resource_2ivmb"]
script = ExtResource("20_226av")
action = ExtResource("1_pb347")
completion_events = 16
time_to_actuate = 0.5
[sub_resource type="Resource" id="Resource_o88yx"]
script = ExtResource("20_226av")
action = ExtResource("5_jksbs")
completion_events = 16
time_to_actuate = 0.5
[sub_resource type="Resource" id="Resource_j6a01"]
script = ExtResource("20_226av")
action = ExtResource("17_yw71c")
completion_events = 16
time_to_actuate = 0.5
[sub_resource type="Resource" id="Resource_lonke"]
script = ExtResource("19_kw0e0")
enable_debug_print = false
steps = Array[ExtResource("20_226av")]([SubResource("Resource_2ivmb"), SubResource("Resource_o88yx"), SubResource("Resource_j6a01")])
cancellation_actions = Array[ExtResource("8_ewrgg")]([])
actuation_threshold = 0.5
[sub_resource type="Resource" id="Resource_do51u"]
script = ExtResource("3_dnh2v")
override_action_settings = false
is_remappable = false
display_name = ""
display_category = ""
modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([])
triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_lonke")])
[sub_resource type="Resource" id="Resource_pn365"]
script = ExtResource("2_o8ffe")
action = ExtResource("12_icm8e")
input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_do51u")])
metadata/_guide_input_mappings_collapsed = false
[resource]
script = ExtResource("1_bycs2")
display_name = ""
mappings = Array[ExtResource("2_o8ffe")]([SubResource("Resource_ohm7l"), SubResource("Resource_3ojw4"), SubResource("Resource_nypfm"), SubResource("Resource_qxroc"), SubResource("Resource_abarl"), SubResource("Resource_1vsh7"), SubResource("Resource_40qct"), SubResource("Resource_pn365")])
metadata/_guide_action_mappings_collapsed = false

View File

@ -0,0 +1,50 @@
## This is a somewhat more complex player example. Note how all the combos
## are completely handled by GUIDE, the player doesn't need to know which
## inputs trigger them.
extends CharacterBody2D
@export var speed:float = 150
@export var dash_speed_bonus:float = 250
@export var horizontal_movement:GUIDEAction
@export var dash_left:GUIDEAction
@export var dash_right:GUIDEAction
@export var fireball_left:GUIDEAction
@export var fireball_right:GUIDEAction
@export var fireball_scene:PackedScene
var _dash_bonus:float
func _ready():
# We can use the event system to get notified whenever
# the combo actions trigger. This way we don't need to check them
# in _physics_process every frame.
dash_left.triggered.connect(func(): _dash_bonus = -1)
dash_right.triggered.connect(func(): _dash_bonus = 1)
fireball_left.triggered.connect(_spawn_fireball.bind(Vector2.LEFT))
fireball_right.triggered.connect(_spawn_fireball.bind(Vector2.RIGHT))
func _physics_process(delta):
# Get current left-right input
var movement:float = horizontal_movement.value_axis_1d
# Move any dash bonus towards zero
_dash_bonus = move_toward(_dash_bonus, 0, delta)
# Calculate new velocity
velocity.x = movement * speed + _dash_bonus * dash_speed_bonus
velocity.y = 980
move_and_slide()
func _spawn_fireball(direction:Vector2) -> void:
# spawn a new fireball
var fireball:Node2D = fireball_scene.instantiate()
# add it to the tree
get_parent().add_child(fireball)
# start at our position/orientation
fireball.global_transform = global_transform
# fly into the given direction
fireball.direction = direction

View File

@ -0,0 +1 @@
uid://bd1xrcr5qu5yd