Move splorch to player effects, add hit sound

This commit is contained in:
Sofia 2026-07-24 00:53:39 +03:00
parent f227dea9bc
commit d5fdc5b1de
5 changed files with 51 additions and 13 deletions

View File

@ -10,13 +10,13 @@ glow_enabled = true
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_oh8vq"]
[node name="player" type="LocalPlayer" unique_id=863055906 node_paths=PackedStringArray("camera", "soldier_mesh", "collider", "splorch", "dead_cam_target", "respawn_label", "ball_origin", "weapon_node", "pause_panel", "exit_to_lobby", "settings_panel", "scoreboard")]
[node name="player" type="LocalPlayer" unique_id=863055906 node_paths=PackedStringArray("camera", "soldier_mesh", "collider", "effects", "dead_cam_target", "respawn_label", "ball_origin", "weapon_node", "pause_panel", "exit_to_lobby", "settings_panel", "scoreboard")]
look_sensitivity = 1.5
camera = NodePath("camera_3d")
move_speed = 5.0
soldier_mesh = NodePath("soldier_m")
collider = NodePath("collision_shape_3d2")
splorch = NodePath("splorch")
effects = NodePath("effects")
dead_cam_target = NodePath("dead_camera_target")
respawn_label = NodePath("respawn_label")
ball_origin = NodePath("camera_3d")
@ -44,7 +44,7 @@ transform = Transform3D(-0.5, 0, -4.371139e-08, 0, 0.5, 0, 4.371139e-08, 0, -0.5
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
shape = SubResource("CapsuleShape3D_oh8vq")
[node name="splorch" parent="." unique_id=986677517 instance=ExtResource("2_ywmwa")]
[node name="effects" parent="." unique_id=986677517 instance=ExtResource("2_ywmwa")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.16157162, 1.4223524, 0)
[node name="dead_camera_target" type="Node3D" parent="." unique_id=559969559]

View File

@ -5,11 +5,11 @@
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"]
[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "splorch", "spectator_camera", "ball_origin", "name_label")]
[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "effects", "spectator_camera", "ball_origin", "name_label")]
move_speed = 5.0
soldier_mesh = NodePath("soldier_m")
collider = NodePath("collision_shape_3d")
splorch = NodePath("gpu_particles_3d")
effects = NodePath("effects")
health = 100
spectator_camera = NodePath("spectate_root/spectate_camera")
ball_origin = NodePath("ball_origin")
@ -24,7 +24,7 @@ transform = Transform3D(-0.5, 0, -4.371139e-08, 0, 0.5, 0, 4.371139e-08, 0, -0.5
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
shape = SubResource("CapsuleShape3D_1cgct")
[node name="gpu_particles_3d" parent="." unique_id=986677517 instance=ExtResource("2_orxjf")]
[node name="effects" parent="." unique_id=986677517 instance=ExtResource("2_orxjf")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4540546, 0)
[node name="spectate_root" type="Node3D" parent="." unique_id=624336254]

View File

@ -1,5 +1,7 @@
[gd_scene format=3 uid="uid://cl66unms2gim0"]
[ext_resource type="AudioStream" uid="uid://bfg31e3s4jv8c" path="res://assets/Hit.mp3" id="1_2hdmt"]
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_1cgct"]
particle_flag_align_y = true
direction = Vector3(0, 1, 0)
@ -23,7 +25,11 @@ section_length = 0.1
section_rings = 10
curve = SubResource("Curve_yli5f")
[node name="gpu_particles_3d" type="GPUParticles3D" unique_id=986677517]
[node name="player_effects" type="PlayerEffects" unique_id=1493455892 node_paths=PackedStringArray("splorch", "hit_sound")]
splorch = NodePath("splorch")
hit_sound = NodePath("hit_sound")
[node name="splorch" type="GPUParticles3D" parent="." unique_id=986677517]
emitting = false
amount = 20
one_shot = true
@ -32,3 +38,7 @@ trail_enabled = true
trail_lifetime = 0.5
process_material = SubResource("ParticleProcessMaterial_1cgct")
draw_pass_1 = SubResource("TubeTrailMesh_wwb7k")
[node name="hit_sound" type="AudioStreamPlayer3D" parent="." unique_id=345049143]
stream = ExtResource("1_2hdmt")
volume_db = 80.0

View File

@ -0,0 +1,26 @@
use godot::{
classes::{AudioStreamPlayer3D, GpuParticles3D},
prelude::*,
};
#[derive(GodotClass)]
#[class(base=Node3D, init)]
pub struct PlayerEffects {
#[export]
splorch: Option<Gd<GpuParticles3D>>,
#[export]
hit_sound: Option<Gd<AudioStreamPlayer3D>>,
base: Base<Node3D>,
}
impl PlayerEffects {
pub fn death(&mut self) {
if let Some(splorch) = &mut self.splorch {
splorch.set_emitting(true);
}
if let Some(sfx) = &mut self.hit_sound {
sfx.play();
}
}
}

View File

@ -23,12 +23,14 @@ use crate::{
util::{NetVector3, cast_ray},
},
player::{
effects::PlayerEffects,
soldier_mesh::SoldierMesh,
weapon::{BallWeapon, Raygun, Weapon, WeaponType},
},
ui::{cli::CommandLinePanel, settings::SettingsPanel},
};
pub mod effects;
pub mod player_hand_remover;
pub mod soldier_mesh;
pub mod weapon;
@ -189,7 +191,7 @@ pub struct LocalPlayer {
#[export]
collider: Option<Gd<CollisionShape3D>>,
#[export]
splorch: Option<Gd<GpuParticles3D>>,
effects: Option<Gd<PlayerEffects>>,
#[export]
dead_cam_target: Option<Gd<Node3D>>,
#[export]
@ -342,8 +344,8 @@ impl IPlayer for LocalPlayer {
if let Some(mut collider) = self.collider.take() {
collider.queue_free();
}
if let Some(splorch) = &mut self.splorch {
splorch.set_emitting(true);
if let Some(effects) = &mut self.effects {
effects.bind_mut().death();
}
if let Some(mut weapon) = self.weapon.take() {
weapon.queue_free();
@ -659,7 +661,7 @@ pub struct RemotePlayer {
#[export]
collider: Option<Gd<CollisionShape3D>>,
#[export]
splorch: Option<Gd<GpuParticles3D>>,
effects: Option<Gd<PlayerEffects>>,
#[export]
health: i32,
#[export]
@ -796,8 +798,8 @@ impl IPlayer for RemotePlayer {
if let Some(mut collider) = self.collider.take() {
collider.queue_free();
}
if let Some(splorch) = &mut self.splorch {
splorch.set_emitting(true);
if let Some(effects) = &mut self.effects {
effects.bind_mut().death();
}
if let Some(mut name) = self.name_label.take() {
name.queue_free();