@tool class_name Weapon extends Node2D # constants @export var max_ammo = 1 ## Number of seconds until the weapon can be used again. @export var cooldown = 0.1 @export var shot: PackedScene: set(new_shot): shot = new_shot update_configuration_warnings() @export var shot_spawn: Node2D @export var audio: AudioStreamPlayer2D # gameplay variables var ammo var timer = 0.0 # Called when the node enters the scene tree for the first time. func _ready() -> void: if !Engine.is_editor_hint(): ammo = max_ammo else: child_entered_tree.connect(_on_child_entered_tree) child_exiting_tree.connect(_on_child_exited_tree) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: if !Engine.is_editor_hint(): timer += delta func _get_configuration_warnings(): var warnings = [] if shot == null: warnings.append("Please select a projectile scene for the shot variable.") if shot_spawn == null: warnings.append("Please add a Node2D as the muzzle/projectile spawning location for the shot_spawn variable.") if audio == null: warnings.append("Please add an AudioStreamPlayer2D which plays the weapon's audio.") return warnings func _on_child_entered_tree(node): print_debug("saw a child entering tree: ", node) if node.get_class() == "Node2D": shot_spawn = node if node is AudioStreamPlayer2D: audio = node update_configuration_warnings() func _on_child_exited_tree(node): if node == shot_spawn: shot_spawn = null if node == audio: audio = null update_configuration_warnings() # Creates and returns an instance of the weapon's projectile. func shoot() -> Projectile: print_debug("trying to shoot, timer at ", timer, " out of ", cooldown, " ammo at ", ammo, " out of ", max_ammo) if timer > cooldown && ammo > 0: timer = 0 var new_shot = shot.instantiate() owner.add_child(new_shot) new_shot.transform = shot_spawn.global_transform ammo -= 1 audio.play() return new_shot else: return null func add_ammo(amount): ammo += amount if ammo > max_ammo: ammo = max_ammo