grunk/src/equipment/wide_spray/wide_spray.gd

50 lines
1.4 KiB
GDScript3
Raw Normal View History

class_name WideSpray extends Spray
## Wide spray pattern
const SPRAYCAST_GROUP := "SprayCast"
2025-03-09 16:40:19 -06:00
@export var spray_scale := 1.0
@onready var spray_casts: Node3D = %SprayCasts
2025-03-06 14:57:57 -07:00
@onready var spray_effect: Node3D = %SprayEffect
2025-03-06 14:57:57 -07:00
@onready var beam_particles_1: GPUParticles3D = $BeamParticles1
@onready var beam_particles_2: GPUParticles3D = $BeamParticles2
2025-03-06 14:57:57 -07:00
func _fire() -> void:
var prev_target: GunkBody = null
var prev_point: Vector3
var prev_normal: Vector3
2025-03-06 14:57:57 -07:00
for laser: LaserCast in spray_casts.get_children():
if laser.is_colliding():
2025-03-12 00:18:27 -06:00
var collider := laser.get_collider()
if collider is GunkBody:
var target := collider as GunkBody
2025-03-06 14:57:57 -07:00
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
2025-03-12 00:18:27 -06:00
elif collider is GunkNode:
(collider as GunkNode).hit()
spray_effect.visible = true
2025-03-06 14:57:57 -07:00
beam_particles_1.emitting = true
beam_particles_2.emitting = true
2025-03-06 14:57:57 -07:00
func _idle() -> void:
spray_effect.visible = false
2025-03-06 14:57:57 -07:00
beam_particles_1.emitting = false
beam_particles_2.emitting = false