class_name WideSpray extends Spray ## Wide spray pattern const SPRAYCAST_GROUP := "SprayCast" @export var spray_scale := 1.0 @onready var spray_casts: Node3D = %SprayCasts @onready var spray_effect: Node3D = %SprayEffect @onready var beam_particles_1: GPUParticles3D = $BeamParticles1 @onready var beam_particles_2: GPUParticles3D = $BeamParticles2 func _fire() -> void: var prev_target: GunkBody = null var prev_point: Vector3 var prev_normal: Vector3 for laser: LaserCast in spray_casts.get_children(): if laser.is_colliding(): var collider := laser.get_collider() if collider is GunkBody: var target := collider as GunkBody var point := laser.get_collision_point() var normal := laser.get_collision_normal() # Always paint at least a dot, to cap the ends of the line target.paint_dot(point, normal, spray_scale) if target == prev_target: # Continue the multiline if possible target.add_to_multiline(prev_point, prev_normal, point, normal, spray_scale * 2) prev_point = point prev_normal = normal prev_target = target prev_point = point prev_normal = normal elif collider is GunkNode: (collider as GunkNode).hit() spray_effect.visible = true beam_particles_1.emitting = true beam_particles_2.emitting = true func _idle() -> void: spray_effect.visible = false beam_particles_1.emitting = false beam_particles_2.emitting = false