From dc30551227851b8d92cff41831c0b027072d180d Mon Sep 17 00:00:00 2001 From: Sofia Date: Sun, 19 Jul 2026 23:06:52 +0300 Subject: [PATCH] Add simple shooting --- godot/scenes/player/local_player.tscn | 7 +------ godot/scenes/player/raygun.tscn | 8 +++++++- godot/scenes/player/remote_player.tscn | 7 +------ rust/src/lib.rs | 1 + rust/src/player.rs | 28 ++++++++++---------------- rust/src/soldier_mesh.rs | 15 ++++++++++---- rust/src/weapon.rs | 18 +++++++++++++++++ 7 files changed, 50 insertions(+), 34 deletions(-) create mode 100644 rust/src/weapon.rs diff --git a/godot/scenes/player/local_player.tscn b/godot/scenes/player/local_player.tscn index 5edd86d..6a57b7c 100644 --- a/godot/scenes/player/local_player.tscn +++ b/godot/scenes/player/local_player.tscn @@ -1,7 +1,6 @@ [gd_scene format=3 uid="uid://ct70bpbca8one"] [ext_resource type="PackedScene" uid="uid://bod6b3befmyt5" path="res://scenes/player/soldier_m.tscn" id="1_jd651"] -[ext_resource type="AudioStream" uid="uid://xxpkjhaovyd" path="res://assets/LaserWithRecoveryEdited.ogg" id="2_ywmwa"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_oh8vq"] @@ -10,7 +9,7 @@ look_sensitivity = 1.5 camera = NodePath("camera_3d") move_speed = 5.0 soldier_mesh = NodePath("soldier_m") -sound_emitter = NodePath("sound_emitter") +sound_emitter = NodePath("") collision_mask = 2 [node name="camera_3d" type="Camera3D" parent="." unique_id=1773137418] @@ -24,7 +23,3 @@ visible = false [node name="collision_shape_3d2" type="CollisionShape3D" parent="." unique_id=442150782] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0310049, 0) shape = SubResource("CapsuleShape3D_oh8vq") - -[node name="sound_emitter" type="AudioStreamPlayer3D" parent="." unique_id=292990328] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8420726, 0) -stream = ExtResource("2_ywmwa") diff --git a/godot/scenes/player/raygun.tscn b/godot/scenes/player/raygun.tscn index 4ba4c2b..6791072 100644 --- a/godot/scenes/player/raygun.tscn +++ b/godot/scenes/player/raygun.tscn @@ -1,7 +1,13 @@ [gd_scene format=3 uid="uid://cw7duhhjebypt"] [ext_resource type="PackedScene" uid="uid://cg81784ct8gf5" path="res://mesh/raygun.tscn" id="1_ckadf"] +[ext_resource type="AudioStream" uid="uid://xxpkjhaovyd" path="res://assets/LaserWithRecoveryEdited.ogg" id="2_lxble"] -[node name="raygun" type="Node3D" unique_id=255606277] +[node name="raygun" type="Weapon" unique_id=751705927 node_paths=PackedStringArray("sound_emitter")] +sound_emitter = NodePath("sound_emitter") [node name="Raygun" parent="." unique_id=1928455392 instance=ExtResource("1_ckadf")] + +[node name="sound_emitter" type="AudioStreamPlayer3D" parent="." unique_id=1572422640] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8420726, 0) +stream = ExtResource("2_lxble") diff --git a/godot/scenes/player/remote_player.tscn b/godot/scenes/player/remote_player.tscn index 15f6edb..7af7857 100644 --- a/godot/scenes/player/remote_player.tscn +++ b/godot/scenes/player/remote_player.tscn @@ -1,14 +1,13 @@ [gd_scene format=3 uid="uid://kfxc0migw80o"] [ext_resource type="PackedScene" uid="uid://bod6b3befmyt5" path="res://scenes/player/soldier_m.tscn" id="1_e2ekk"] -[ext_resource type="AudioStream" uid="uid://xxpkjhaovyd" path="res://assets/LaserWithRecoveryEdited.ogg" id="2_orxjf"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"] [node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "sound_emitter")] move_speed = 5.0 soldier_mesh = NodePath("soldier_m") -sound_emitter = NodePath("sound_emitter") +sound_emitter = NodePath("") collision_mask = 2 [node name="soldier_m" parent="." unique_id=281995630 instance=ExtResource("1_e2ekk")] @@ -17,7 +16,3 @@ transform = Transform3D(-0.5, 0, -4.371139e-08, 0, 0.5, 0, 4.371139e-08, 0, -0.5 [node name="collision_shape_3d" type="CollisionShape3D" parent="." unique_id=1110995513] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0310049, 0) shape = SubResource("CapsuleShape3D_1cgct") - -[node name="sound_emitter" type="AudioStreamPlayer3D" parent="." unique_id=574144461] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.18387973, 1.6770729, -0.3557726) -stream = ExtResource("2_orxjf") diff --git a/rust/src/lib.rs b/rust/src/lib.rs index b87a84d..9ea596d 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -9,6 +9,7 @@ pub mod net; pub mod player; pub mod soldier_mesh; pub mod ui; +pub mod weapon; struct MyExtension; diff --git a/rust/src/player.rs b/rust/src/player.rs index d01c5d4..a39afdb 100644 --- a/rust/src/player.rs +++ b/rust/src/player.rs @@ -21,6 +21,7 @@ use crate::{ }, soldier_mesh::SoldierMesh, ui::cli::CommandLinePanel, + weapon::Weapon, }; #[derive(Debug, Clone, Copy, Serialize, Deserialize)] @@ -43,7 +44,6 @@ pub trait IPlayer { fn get_transform(&self) -> NetPlayerTransform; fn jump(&mut self); fn try_shoot(&mut self, deal_damage: bool) -> bool; - fn shoot_fx(&mut self); } pub trait PlayerMovement { @@ -81,10 +81,9 @@ pub struct LocalPlayer { move_speed: f32, #[export] soldier_mesh: Option>, - #[export] - sound_emitter: Option>, pub player_id: Option, + pub weapon: Option>, movement_dir: Vector3, y_speed: f32, @@ -157,15 +156,15 @@ impl IPlayer for LocalPlayer { fn try_shoot(&mut self, deal_damage: bool) -> bool { if self.shoot_cd <= 0. { - self.shoot_fx(); + if let Some(weapon) = &mut self.weapon { + weapon.bind_mut().shoot(Vector3::ZERO, deal_damage); + } self.shoot_cd = 0.2; true } else { false } } - - fn shoot_fx(&mut self) {} } #[godot_api] @@ -187,7 +186,7 @@ impl ICharacterBody3D for LocalPlayer { }); if let Some(mesh) = &mut self.soldier_mesh { - mesh.bind_mut().spawn_raygun(); + self.weapon = mesh.bind_mut().spawn_raygun(); } } @@ -275,10 +274,9 @@ pub struct RemotePlayer { move_speed: f32, #[export] soldier_mesh: Option>, - #[export] - sound_emitter: Option>, pub player_id: Option, + pub weapon: Option>, movement_dir: Vector3, y_speed: f32, @@ -347,26 +345,22 @@ impl IPlayer for RemotePlayer { fn try_shoot(&mut self, deal_damage: bool) -> bool { if self.shoot_cd <= 0. { - self.shoot_fx(); + if let Some(weapon) = &mut self.weapon { + weapon.bind_mut().shoot(Vector3::ZERO, deal_damage); + } self.shoot_cd = 0.2; true } else { false } } - - fn shoot_fx(&mut self) { - if let Some(emitter) = &mut self.sound_emitter { - emitter.play(); - } - } } #[godot_api] impl ICharacterBody3D for RemotePlayer { fn ready(&mut self) { if let Some(mesh) = &mut self.soldier_mesh { - mesh.bind_mut().spawn_raygun(); + self.weapon = mesh.bind_mut().spawn_raygun(); } } diff --git a/rust/src/soldier_mesh.rs b/rust/src/soldier_mesh.rs index 44cca6b..0cc233f 100644 --- a/rust/src/soldier_mesh.rs +++ b/rust/src/soldier_mesh.rs @@ -6,6 +6,8 @@ use godot::{ prelude::*, }; +use crate::weapon::Weapon; + #[derive(GodotClass)] #[class(base=Node3D, init)] pub struct SoldierMesh { @@ -41,16 +43,21 @@ impl SoldierMesh { } } - pub fn spawn_raygun(&mut self) { + pub fn spawn_raygun(&mut self) -> Option> { if let Some(raygun) = &self.raygun { - let node = raygun.instantiate_as::(); - self.spawn_weapon(node); + let node = raygun.instantiate_as::(); + self.spawn_weapon(node) + } else { + None } } - fn spawn_weapon(&mut self, node: Gd) { + fn spawn_weapon(&mut self, node: Gd) -> Option> { if let Some(hand) = &mut self.hand_attachment { hand.add_child(&node); + Some(node) + } else { + None } } } diff --git a/rust/src/weapon.rs b/rust/src/weapon.rs new file mode 100644 index 0000000..8359126 --- /dev/null +++ b/rust/src/weapon.rs @@ -0,0 +1,18 @@ +use godot::{classes::AudioStreamPlayer3D, prelude::*}; + +#[derive(GodotClass)] +#[class(base=Node3D, init)] +pub struct Weapon { + #[export] + sound_emitter: Option>, + + base: Base, +} + +impl Weapon { + pub fn shoot(&mut self, to: Vector3, deal_damage: bool) { + if let Some(emitter) = &mut self.sound_emitter { + emitter.play(); + } + } +}