extends Area2D class_name Spawner ## A node which spawns things! ## The scene to spawn. @export var scene: PackedScene ## The node to add new scenes to. @export var target: Node ## Count of how many items should be spawned when possible. var buffer: int = 0 ## Maximum amount of items whose spawn can be buffered. @export var buffer_cap: int ## Rect in which scenes can be spawned randomly in. @export var spawn_rect: Rect2 ## Minimum rotation degrees that an object can spawn with. @export_range(0, 360) var spawn_rotation_degrees_min: float ## Maximum rotation degrees that an object can spawn with. @export_range(0, 360) var spawn_rotation_degrees_max: float ## Maximum amount of bodies overlapping the spawner's area before the spawner stops spawning. @export_range(0, 16, 1, "or_greater") var overlapping_body_count_limit: int signal spawned(what: Node2D) func spawn(): buffer += 1 if buffer > buffer_cap: buffer = buffer_cap func _select_spawn_position() -> Vector2: return Vector2( Randomizer.rng.randf_range(spawn_rect.position.x, spawn_rect.end.x), Randomizer.rng.randf_range(spawn_rect.position.y, spawn_rect.end.y), ) func _select_spawn_rotation() -> float: return Randomizer.rng.randf_range( spawn_rotation_degrees_min, spawn_rotation_degrees_max ) func _do_spawn(): var overlapping_bodies = get_overlapping_bodies() if len(overlapping_bodies) > overlapping_body_count_limit: return if scene == null: return if scene._bundled["names"][0]=="Coal": var scene = PackedScene.new() scene.pack(get_node("Diamond")) print("ehi") var instantiated = scene.instantiate() instantiated.global_position = global_position + _select_spawn_position() instantiated.rotation_degrees = _select_spawn_rotation() target.add_child(instantiated) spawned.emit() buffer -= 1 func _physics_process(_delta): if buffer > 0: _do_spawn()