Add simple shooting
This commit is contained in:
parent
7c5dbd3a9f
commit
dc30551227
@ -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")
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -9,6 +9,7 @@ pub mod net;
|
||||
pub mod player;
|
||||
pub mod soldier_mesh;
|
||||
pub mod ui;
|
||||
pub mod weapon;
|
||||
|
||||
struct MyExtension;
|
||||
|
||||
|
||||
@ -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<Gd<SoldierMesh>>,
|
||||
#[export]
|
||||
sound_emitter: Option<Gd<AudioStreamPlayer3D>>,
|
||||
|
||||
pub player_id: Option<u16>,
|
||||
pub weapon: Option<Gd<Weapon>>,
|
||||
|
||||
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<Gd<SoldierMesh>>,
|
||||
#[export]
|
||||
sound_emitter: Option<Gd<AudioStreamPlayer3D>>,
|
||||
|
||||
pub player_id: Option<u16>,
|
||||
pub weapon: Option<Gd<Weapon>>,
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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<Gd<Weapon>> {
|
||||
if let Some(raygun) = &self.raygun {
|
||||
let node = raygun.instantiate_as::<Node3D>();
|
||||
self.spawn_weapon(node);
|
||||
let node = raygun.instantiate_as::<Weapon>();
|
||||
self.spawn_weapon(node)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn spawn_weapon(&mut self, node: Gd<Node3D>) {
|
||||
fn spawn_weapon(&mut self, node: Gd<Weapon>) -> Option<Gd<Weapon>> {
|
||||
if let Some(hand) = &mut self.hand_attachment {
|
||||
hand.add_child(&node);
|
||||
Some(node)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
18
rust/src/weapon.rs
Normal file
18
rust/src/weapon.rs
Normal file
@ -0,0 +1,18 @@
|
||||
use godot::{classes::AudioStreamPlayer3D, prelude::*};
|
||||
|
||||
#[derive(GodotClass)]
|
||||
#[class(base=Node3D, init)]
|
||||
pub struct Weapon {
|
||||
#[export]
|
||||
sound_emitter: Option<Gd<AudioStreamPlayer3D>>,
|
||||
|
||||
base: Base<Node3D>,
|
||||
}
|
||||
|
||||
impl Weapon {
|
||||
pub fn shoot(&mut self, to: Vector3, deal_damage: bool) {
|
||||
if let Some(emitter) = &mut self.sound_emitter {
|
||||
emitter.play();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user