diff --git a/assets/models/medic_particle.glb b/assets/models/medic_particle.glb new file mode 100644 index 0000000..7c19c09 Binary files /dev/null and b/assets/models/medic_particle.glb differ diff --git a/src/abilities/healing.rs b/src/abilities/healing.rs index a2563a2..a147602 100644 --- a/src/abilities/healing.rs +++ b/src/abilities/healing.rs @@ -6,7 +6,7 @@ use crate::{ }; #[derive(Component)] -struct Healing(Entity); +pub struct Healing(pub Entity); #[derive(Event, Debug)] pub enum HealingStateChanged { diff --git a/src/abilities/mod.rs b/src/abilities/mod.rs index b83f9d8..019eb32 100644 --- a/src/abilities/mod.rs +++ b/src/abilities/mod.rs @@ -4,6 +4,8 @@ mod healing; mod missile; mod thrown; +pub use healing::Healing; + use crate::{ GameState, aim::AimTarget, diff --git a/src/heal_effect.rs b/src/heal_effect.rs new file mode 100644 index 0000000..0e585ba --- /dev/null +++ b/src/heal_effect.rs @@ -0,0 +1,99 @@ +use crate::{ + GameState, abilities::Healing, loading_assets::GameAssets, utils::billboards::Billboard, +}; +use bevy::prelude::*; +use rand::{Rng, thread_rng}; + +#[derive(Component, Default)] +#[require(Transform, InheritedVisibility)] +struct HealParticleEffect { + next_spawn: f32, +} + +#[derive(Component)] +struct HealParticle { + start_scale: f32, + end_scale: f32, + start_pos: Vec3, + end_pos: Vec3, + start_time: f32, + life_time: f32, +} + +pub fn plugin(app: &mut App) { + app.add_systems( + Update, + (on_added, update_effects, update_particles).run_if(in_state(GameState::Playing)), + ); +} + +fn on_added(mut cmds: Commands, query: Query<&Healing, Added>) { + for healing in query.iter() { + cmds.entity(healing.0).insert(( + Name::new("heal-particle-effect"), + HealParticleEffect::default(), + )); + } +} + +fn update_effects( + mut cmds: Commands, + mut query: Query<(&mut HealParticleEffect, Entity)>, + time: Res