diff --git a/assets/all.headsdb.ron b/assets/all.headsdb.ron index 5ef02fb..964c324 100644 --- a/assets/all.headsdb.ron +++ b/assets/all.headsdb.ron @@ -4,7 +4,7 @@ /*02*/(key:"chicago gangster", ability:Gun, aps:7.4, ammo:25, range:60, damage:12), /*03*/(key:"commando", ability:Gun, aps:7.4, ammo:26, range:60, damage:12), /*04*/(key:"field medic", ability:Medic, aps:20), - /*05*/(key:"geisha", ability:None), + /*05*/(key:"geisha", ability:Curver, range:60, ammo:10, damage:25, projectile:"fan"), /*06*/(key:"goblin", ability:Arrow, aps:2, ammo:5, range:90, damage:50), /*07*/(key:"green grocer", ability:Curver, range:60, ammo:10, damage:25, projectile:"carrot"), /*08*/(key:"highland hammer thrower", ability:Thrown, aps:2, ammo:10, damage:25, range:80, projectile:"hammer", interrupt_shoot:false), diff --git a/assets/models/projectiles/fan.glb b/assets/models/projectiles/fan.glb new file mode 100644 index 0000000..fb906e8 Binary files /dev/null and b/assets/models/projectiles/fan.glb differ diff --git a/crates/shared/src/abilities/curver.rs b/crates/shared/src/abilities/curver.rs index 378cf6d..7c515a0 100644 --- a/crates/shared/src/abilities/curver.rs +++ b/crates/shared/src/abilities/curver.rs @@ -11,17 +11,21 @@ use crate::{ use avian3d::prelude::*; use bevy::prelude::*; use bevy_replicon::prelude::{Replicated, SendMode, ServerTriggerExt, ToClients}; +use serde::{Deserialize, Serialize}; use std::f32::consts::PI; const MAX_SHOT_AGES: f32 = 15.; -#[derive(Component)] -struct CurverProjectile { +#[derive(Component, Reflect, Deserialize, Serialize)] +#[reflect(Component)] +pub struct CurverProjectile { time: f32, damage: u32, } pub fn plugin(app: &mut App) { + app.register_type::(); + app.add_systems( Update, (shot_collision, enemy_hit).run_if(in_state(GameState::Playing)), @@ -31,10 +35,10 @@ pub fn plugin(app: &mut App) { (update, timeout).run_if(in_state(GameState::Playing)), ); - global_observer!(app, on_trigger_missile); + global_observer!(app, on_trigger_curver); } -fn on_trigger_missile( +fn on_trigger_curver( trigger: On, mut commands: Commands, query_transform: Query<&Transform>, @@ -75,10 +79,12 @@ fn on_trigger_missile( Visibility::default(), transform, Replicated, + //TODO: put in client only system children![( Transform::from_rotation(Quat::from_rotation_x(PI / 2.).inverse()), AutoRotation(Quat::from_rotation_x(0.4) * Quat::from_rotation_z(0.3)), GltfSceneRoot::Projectile(head.projectile.clone()), + Replicated, ),], )); } diff --git a/crates/shared/src/protocol/mod.rs b/crates/shared/src/protocol/mod.rs index 5c570fd..59f5b0d 100644 --- a/crates/shared/src/protocol/mod.rs +++ b/crates/shared/src/protocol/mod.rs @@ -1,6 +1,6 @@ use crate::{ GameState, - abilities::{BuildExplosionSprite, healing::Healing}, + abilities::{BuildExplosionSprite, curver::CurverProjectile, healing::Healing}, animation::AnimationFlags, backpack::{Backpack, backpack_ui::BackpackUiState}, camera::{CameraArmRotation, CameraTarget}, @@ -83,6 +83,7 @@ pub fn plugin(app: &mut App) { .replicate::() .replicate::() .replicate_once::() + .replicate_once::() .replicate::() .replicate::() .replicate::()