@tool extends Node3D class_name VendingMachine3d const LINE_OBJECT_NUMBER = 5 const LINE_OBJECT_SEPARATION = Vector3.LEFT * 0.2 const FALLING_OBJECT_LINE_SHIFT = Vector3.FORWARD * 0.3 @export_tool_button("Update", "Callable") var update_action = update @export_tool_button("Fall Object 1", "Callable") var fall_object_1_action = fall_object_1 @export_tool_button("Fall Object 1", "Callable") var fall_object_2_action = fall_object_2 @export var object_1_scene : PackedScene = null : set = set_object_1_scene @export var object_2_scene : PackedScene = null : set = set_object_2_scene @export var screen_1_hide : bool = true : set = set_screen_1_hide @export var screen_2_hide : bool = true : set = set_screen_2_hide # func _input(_e): # if Input.is_action_just_pressed("action"): # fall_object([ # %Line1, # %Line2, # %Line3, # %Line4 # ].pick_random()) func _ready(): update() func update(): set_object_1_scene() set_object_2_scene() set_screen_1_hide() set_screen_2_hide() func set_object_1_scene(scene := object_1_scene): if scene and is_node_ready(): fill_lines(%Line1, scene.instantiate()) fill_lines(%Line2, scene.instantiate()) object_1_scene = scene func set_object_2_scene(scene := object_2_scene): if scene and is_node_ready(): fill_lines(%Line3, scene.instantiate()) fill_lines(%Line4, scene.instantiate()) object_2_scene = scene func set_screen_1_hide(v := screen_1_hide): screen_1_hide = v if is_node_ready(): %HideScreen1.visible = v func set_screen_2_hide(v := screen_2_hide): screen_2_hide = v if is_node_ready(): %HideScreen2.visible = v func fall_object_1(): fall_object([ %Line1, %Line2 ].pick_random()) func fall_object_2(): fall_object([ %Line3, %Line4 ].pick_random()) func fall_object(from_line : Node3D): if len(from_line.get_children()): var falling_object = create_falling_object() var object = from_line.get_children().pick_random() as Node3D falling_object.global_position = object.global_position + FALLING_OBJECT_LINE_SHIFT var falling_model = object.duplicate() falling_model.position = Vector3.ZERO falling_object.add_child(falling_model) falling_object.freeze = false object.queue_free() %FallingObjects.add_child(falling_object) func clear_falling_objects(): for c in %FallingObjects.get_children(): c.queue_free() func create_falling_object() -> RigidBody3D: var falling_object = RigidBody3D.new() var falling_collider = CollisionShape3D.new() var falling_shape = SphereShape3D.new() falling_shape.radius = 0.08 falling_collider.shape = falling_shape falling_object.add_child(falling_collider) falling_object.gravity_scale = 0.2 return falling_object func fill_lines(line : Node3D, object : Node3D): for c in line.get_children(): c.queue_free() for i in range(LINE_OBJECT_NUMBER): var new_object = object.duplicate() line.add_child(new_object) new_object.position = i * LINE_OBJECT_SEPARATION