2025-03-02 12:00:42 -07:00
|
|
|
class_name WideSpray extends Spray
|
|
|
|
## Wide spray pattern
|
|
|
|
|
|
|
|
const SPRAYCAST_GROUP := "SprayCast"
|
|
|
|
|
2025-03-03 15:06:30 -07:00
|
|
|
@export var spray_scale := 2.0
|
2025-03-02 12:00:42 -07:00
|
|
|
|
|
|
|
@onready var spray_casts: Node3D = %SprayCasts
|
|
|
|
@onready var spray_effect: MeshInstance3D = %SprayEffect
|
|
|
|
|
|
|
|
|
|
|
|
func fire() -> void:
|
|
|
|
var prev_target: GunkBody = null
|
|
|
|
var prev_point: Vector3
|
|
|
|
var prev_normal: Vector3
|
|
|
|
|
|
|
|
for raycast: RayCast3D in spray_casts.get_children():
|
|
|
|
if raycast.is_colliding():
|
|
|
|
var target := raycast.get_collider() as GunkBody
|
|
|
|
if target:
|
|
|
|
var point := raycast.get_collision_point()
|
|
|
|
var normal := raycast.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
|
|
|
|
|
|
|
|
spray_effect.visible = true
|
|
|
|
|
|
|
|
|
|
|
|
func idle() -> void:
|
|
|
|
spray_effect.visible = false
|