Refactored tools/sprays as distinct types

This commit is contained in:
Rob Kelly 2025-03-12 11:03:41 -06:00
parent 0f9188476c
commit 1515b9edee
10 changed files with 64 additions and 69 deletions

View File

@ -4,13 +4,9 @@ class_name PointSpray extends Spray
@export var spray_scale := 1.5 @export var spray_scale := 1.5
@onready var laser: LaserCast = %LaserCast @onready var laser: LaserCast = %LaserCast
@onready var spray_effect: MeshInstance3D = %SprayEffect
@onready var beam_particles_1: GPUParticles3D = $BeamParticles1
@onready var beam_particles_2: GPUParticles3D = $BeamParticles2
func _fire() -> void: func _spray() -> void:
if laser.is_colliding(): if laser.is_colliding():
var collider := laser.get_collider() var collider := laser.get_collider()
if collider is GunkBody: if collider is GunkBody:
@ -21,13 +17,3 @@ func _fire() -> void:
) )
if collider is GunkNode: if collider is GunkNode:
(collider as GunkNode).hit() (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

View File

@ -59,6 +59,7 @@ sorting_offset = 1.0
mesh = SubResource("CylinderMesh_j5thb") mesh = SubResource("CylinderMesh_j5thb")
[node name="BeamParticles1" type="GPUParticles3D" parent="."] [node name="BeamParticles1" type="GPUParticles3D" parent="."]
unique_name_in_owner = true
amount = 16 amount = 16
lifetime = 0.5 lifetime = 0.5
local_coords = true local_coords = true
@ -66,6 +67,7 @@ process_material = SubResource("ParticleProcessMaterial_nc5qr")
draw_pass_1 = SubResource("QuadMesh_fgb4j") draw_pass_1 = SubResource("QuadMesh_fgb4j")
[node name="BeamParticles2" type="GPUParticles3D" parent="."] [node name="BeamParticles2" type="GPUParticles3D" parent="."]
unique_name_in_owner = true
lifetime = 0.2 lifetime = 0.2
local_coords = true local_coords = true
process_material = SubResource("ParticleProcessMaterial_vwgy4") process_material = SubResource("ParticleProcessMaterial_vwgy4")

View File

@ -1,24 +1,24 @@
class_name Spray extends Node3D class_name Spray extends Tool
## Abstract base class for spraygun types ## Base class for spraygun tools
var firing := false @onready var spray_effect: MeshInstance3D = %SprayEffect
@onready var beam_particles_1: GPUParticles3D = %BeamParticles1
@onready var beam_particles_2: GPUParticles3D = %BeamParticles2
func _spray() -> void:
pass ## Implemented in derived type
func _fire() -> void: func _fire() -> void:
pass _spray()
spray_effect.visible = true
beam_particles_1.emitting = true
beam_particles_2.emitting = true
func _idle() -> void: func _idle() -> void:
pass spray_effect.visible = false
beam_particles_1.emitting = false
beam_particles_2.emitting = false
## Called each frame that this spray is being fired.
func fire() -> void:
firing = true
_fire()
## Called each frame that this spray is not being fired.
func idle() -> void:
firing = false
_idle()

View File

@ -1 +1 @@
uid://caygiek3vmx1g uid://bqdlht6f7xy0i

24
src/equipment/tool.gd Normal file
View File

@ -0,0 +1,24 @@
class_name Tool extends Node3D
## Abstract base class for spraygun types
var firing := false
func _fire() -> void:
pass
func _idle() -> void:
pass
## Called each frame that this tool is being fired.
func fire() -> void:
firing = true
_fire()
## Called each frame that this tool is not being fired.
func idle() -> void:
firing = false
_idle()

View File

@ -0,0 +1 @@
uid://caygiek3vmx1g

View File

@ -6,13 +6,9 @@ const SPRAYCAST_GROUP := "SprayCast"
@export var spray_scale := 1.0 @export var spray_scale := 1.0
@onready var spray_casts: Node3D = %SprayCasts @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: func _spray() -> void:
var prev_target: GunkBody = null var prev_target: GunkBody = null
var prev_point: Vector3 var prev_point: Vector3
var prev_normal: Vector3 var prev_normal: Vector3
@ -37,13 +33,3 @@ func _fire() -> void:
prev_normal = normal prev_normal = normal
elif collider is GunkNode: elif collider is GunkNode:
(collider as GunkNode).hit() (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

View File

@ -113,6 +113,7 @@ texture_albedo = ExtResource("5_xo3vu")
cull_mask = 1048573 cull_mask = 1048573
[node name="BeamParticles1" type="GPUParticles3D" parent="."] [node name="BeamParticles1" type="GPUParticles3D" parent="."]
unique_name_in_owner = true
amount = 16 amount = 16
lifetime = 0.5 lifetime = 0.5
local_coords = true local_coords = true
@ -120,6 +121,7 @@ process_material = SubResource("ParticleProcessMaterial_pr4yq")
draw_pass_1 = SubResource("QuadMesh_trcry") draw_pass_1 = SubResource("QuadMesh_trcry")
[node name="BeamParticles2" type="GPUParticles3D" parent="."] [node name="BeamParticles2" type="GPUParticles3D" parent="."]
unique_name_in_owner = true
lifetime = 0.2 lifetime = 0.2
local_coords = true local_coords = true
process_material = SubResource("ParticleProcessMaterial_lyk2j") process_material = SubResource("ParticleProcessMaterial_lyk2j")

View File

@ -19,8 +19,9 @@ var firing := false
@onready var player_hud: PlayerHUD = %PlayerHUD @onready var player_hud: PlayerHUD = %PlayerHUD
@onready var camera_pivot: CameraController = %CameraPivot @onready var camera_pivot: CameraController = %CameraPivot
@onready var spray_muzzle: Marker3D = %SprayMuzzle @onready var tool_muzzle: Marker3D = %ToolMuzzle
@onready var spray_rumbler: Rumbler3D = %SprayRumbler @onready var tool_rumbler: Rumbler3D = %ToolRumbler
@onready var interact_ray: RayCast3D = %InteractRay @onready var interact_ray: RayCast3D = %InteractRay
@ -40,8 +41,8 @@ func get_friction() -> float:
return AIR_FRICTION return AIR_FRICTION
func get_spray() -> Spray: func get_tool() -> Spray:
return spray_muzzle.get_child(0) return tool_muzzle.get_child(0)
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
@ -53,13 +54,13 @@ func _physics_process(delta: float) -> void:
interactive.activate() interactive.activate()
if Input.is_action_pressed("fire"): if Input.is_action_pressed("fire"):
get_spray().fire() get_tool().fire()
firing = true firing = true
spray_rumbler.intensity = 0.002 tool_rumbler.intensity = 0.002
else: else:
get_spray().idle() get_tool().idle()
firing = false firing = false
spray_rumbler.intensity *= 0.8 tool_rumbler.intensity *= 0.8
# Gravity # Gravity
if not is_on_floor(): if not is_on_floor():

View File

@ -1,12 +1,10 @@
[gd_scene load_steps=10 format=3 uid="uid://bwe2jdmvinhqd"] [gd_scene load_steps=8 format=3 uid="uid://bwe2jdmvinhqd"]
[ext_resource type="Script" uid="uid://buwh0g1ga2aka" path="res://src/player/player.gd" id="1_npueo"] [ext_resource type="Script" uid="uid://buwh0g1ga2aka" path="res://src/player/player.gd" id="1_npueo"]
[ext_resource type="Script" uid="uid://cx1yt0drthpw3" path="res://src/player/camera_controller.gd" id="2_veeqv"] [ext_resource type="Script" uid="uid://cx1yt0drthpw3" path="res://src/player/camera_controller.gd" id="2_veeqv"]
[ext_resource type="PackedScene" uid="uid://cc102xko0u6yj" path="res://src/equipment/point_spray/point_spray.tscn" id="3_6wgkm"] [ext_resource type="PackedScene" uid="uid://cc102xko0u6yj" path="res://src/equipment/point_spray/point_spray.tscn" id="3_6wgkm"]
[ext_resource type="PackedScene" uid="uid://d2hnxr5l6w2x4" path="res://src/equipment/wide_spray/wide_spray.tscn" id="3_ibq07"]
[ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="5_ipd7g"] [ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="5_ipd7g"]
[ext_resource type="PackedScene" uid="uid://dq1x21tq06dud" path="res://src/ui/hud/player_hud.tscn" id="5_jvafu"] [ext_resource type="PackedScene" uid="uid://dq1x21tq06dud" path="res://src/ui/hud/player_hud.tscn" id="5_jvafu"]
[ext_resource type="PackedScene" uid="uid://30o8ltnnxpxo" path="res://src/effects/floating_dust.tscn" id="7_o822w"]
[sub_resource type="BoxMesh" id="BoxMesh_ua7a2"] [sub_resource type="BoxMesh" id="BoxMesh_ua7a2"]
size = Vector3(0.05, 0.05, 0.3) size = Vector3(0.05, 0.05, 0.3)
@ -22,23 +20,20 @@ unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
script = ExtResource("2_veeqv") script = ExtResource("2_veeqv")
[node name="SprayMount" type="Node3D" parent="CameraPivot"] [node name="ToolMount" type="Node3D" parent="CameraPivot"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, -0.1, -0.1) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, -0.1, -0.1)
[node name="SprayMuzzle" type="Marker3D" parent="CameraPivot/SprayMount"] [node name="ToolMuzzle" type="Marker3D" parent="CameraPivot/ToolMount"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 0.997564, -0.0697565, 0, 0.0697565, 0.997564, 0, 0, -0.15) transform = Transform3D(1, 0, 0, 0, 0.997564, -0.0697565, 0, 0.0697565, 0.997564, 0, 0, -0.15)
[node name="WideSpray" parent="CameraPivot/SprayMount/SprayMuzzle" instance=ExtResource("3_ibq07")] [node name="PointSpray" parent="CameraPivot/ToolMount/ToolMuzzle" instance=ExtResource("3_6wgkm")]
[node name="PointSpray" parent="CameraPivot/SprayMount/SprayMuzzle" instance=ExtResource("3_6wgkm")] [node name="ToolRumbler" type="Node3D" parent="CameraPivot/ToolMount"]
visible = false
[node name="SprayRumbler" type="Node3D" parent="CameraPivot/SprayMount"]
unique_name_in_owner = true unique_name_in_owner = true
script = ExtResource("5_ipd7g") script = ExtResource("5_ipd7g")
[node name="SprayNozzle" type="MeshInstance3D" parent="CameraPivot/SprayMount/SprayRumbler"] [node name="SprayNozzle" type="MeshInstance3D" parent="CameraPivot/ToolMount/ToolRumbler"]
layers = 2 layers = 2
mesh = SubResource("BoxMesh_ua7a2") mesh = SubResource("BoxMesh_ua7a2")
skeleton = NodePath("../../..") skeleton = NodePath("../../..")
@ -57,5 +52,3 @@ shape = SubResource("CapsuleShape3D_s7f0r")
[node name="PlayerHUD" parent="." instance=ExtResource("5_jvafu")] [node name="PlayerHUD" parent="." instance=ExtResource("5_jvafu")]
unique_name_in_owner = true unique_name_in_owner = true
[node name="FloatingDust" parent="." instance=ExtResource("7_o822w")]