Add dyn weapon separately

This commit is contained in:
Sofia 2026-07-20 20:33:30 +03:00
parent c588b7cab4
commit 0d7f5a6bf6
3 changed files with 19 additions and 13 deletions

View File

@ -21,7 +21,7 @@ use crate::{
}, },
soldier_mesh::SoldierMesh, soldier_mesh::SoldierMesh,
ui::cli::CommandLinePanel, ui::cli::CommandLinePanel,
weapon::Raygun, weapon::{Raygun, Weapon},
}; };
#[derive(Debug, Clone, Copy, Serialize, Deserialize)] #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
@ -83,7 +83,7 @@ pub struct LocalPlayer {
soldier_mesh: Option<Gd<SoldierMesh>>, soldier_mesh: Option<Gd<SoldierMesh>>,
pub player_id: Option<u16>, pub player_id: Option<u16>,
pub weapon: Option<Gd<Raygun>>, pub weapon: Option<DynGd<Node3D, dyn Weapon>>,
movement_dir: Vector3, movement_dir: Vector3,
y_speed: f32, y_speed: f32,
@ -157,7 +157,7 @@ impl IPlayer for LocalPlayer {
fn try_shoot(&mut self, to: Vector3, deal_damage: bool) -> bool { fn try_shoot(&mut self, to: Vector3, deal_damage: bool) -> bool {
if self.shoot_cd <= 0. { if self.shoot_cd <= 0. {
if let Some(weapon) = &mut self.weapon { if let Some(weapon) = &mut self.weapon {
weapon.bind_mut().shoot(to, deal_damage); weapon.dyn_bind_mut().shoot(to, deal_damage);
} }
self.shoot_cd = 0.2; self.shoot_cd = 0.2;
true true
@ -314,7 +314,7 @@ pub struct RemotePlayer {
soldier_mesh: Option<Gd<SoldierMesh>>, soldier_mesh: Option<Gd<SoldierMesh>>,
pub player_id: Option<u16>, pub player_id: Option<u16>,
pub weapon: Option<Gd<Raygun>>, pub weapon: Option<DynGd<Node3D, dyn Weapon>>,
movement_dir: Vector3, movement_dir: Vector3,
y_speed: f32, y_speed: f32,
@ -384,7 +384,7 @@ impl IPlayer for RemotePlayer {
fn try_shoot(&mut self, to: Vector3, deal_damage: bool) -> bool { fn try_shoot(&mut self, to: Vector3, deal_damage: bool) -> bool {
if self.shoot_cd <= 0. { if self.shoot_cd <= 0. {
if let Some(weapon) = &mut self.weapon { if let Some(weapon) = &mut self.weapon {
weapon.bind_mut().shoot(to, deal_damage); weapon.dyn_bind_mut().shoot(to, deal_damage);
} }
self.shoot_cd = 0.2; self.shoot_cd = 0.2;
true true

View File

@ -6,7 +6,7 @@ use godot::{
prelude::*, prelude::*,
}; };
use crate::weapon::Raygun; use crate::weapon::{Raygun, Weapon};
#[derive(GodotClass)] #[derive(GodotClass)]
#[class(base=Node3D, init)] #[class(base=Node3D, init)]
@ -43,16 +43,19 @@ impl SoldierMesh {
} }
} }
pub fn spawn_raygun(&mut self) -> Option<Gd<Raygun>> { pub fn spawn_raygun(&mut self) -> Option<DynGd<Node3D, dyn Weapon>> {
if let Some(raygun) = &self.raygun { if let Some(raygun) = &self.raygun {
let node = raygun.instantiate_as::<Raygun>(); let node = raygun.instantiate_as::<Raygun>();
self.spawn_weapon(node) self.spawn_weapon(node.into_dyn().upcast())
} else { } else {
None None
} }
} }
fn spawn_weapon(&mut self, node: Gd<Raygun>) -> Option<Gd<Raygun>> { fn spawn_weapon(
&mut self,
node: DynGd<Node3D, dyn Weapon>,
) -> Option<DynGd<Node3D, dyn Weapon>> {
if let Some(hand) = &mut self.hand_attachment { if let Some(hand) = &mut self.hand_attachment {
hand.add_child(&node); hand.add_child(&node);
Some(node) Some(node)

View File

@ -3,6 +3,10 @@ use godot::{
prelude::*, prelude::*,
}; };
pub trait Weapon {
fn shoot(&mut self, to: Vector3, deal_damage: bool);
}
#[derive(GodotClass)] #[derive(GodotClass)]
#[class(base=Node3D, init)] #[class(base=Node3D, init)]
pub struct Raygun { pub struct Raygun {
@ -16,8 +20,9 @@ pub struct Raygun {
base: Base<Node3D>, base: Base<Node3D>,
} }
impl Raygun { #[godot_dyn]
pub fn shoot(&mut self, to: Vector3, deal_damage: bool) { impl Weapon for Raygun {
fn shoot(&mut self, to: Vector3, deal_damage: bool) {
if let Some(emitter) = &mut self.sound_emitter { if let Some(emitter) = &mut self.sound_emitter {
emitter.play(); emitter.play();
} }
@ -43,8 +48,6 @@ pub struct Beam {
pub source: Option<Vector3>, pub source: Option<Vector3>,
pub target: Option<Vector3>, pub target: Option<Vector3>,
alive_for: f64,
distance: f32, distance: f32,
girth: f32, girth: f32,