diff --git a/src/effects/damage.rs b/src/effects/damage.rs index c400e50..32edc21 100644 --- a/src/effects/damage.rs +++ b/src/effects/damage.rs @@ -106,6 +106,7 @@ pub fn bloodstain(ecs: &mut World, target: usize) { } pub fn entity_death(ecs: &mut World, effect: &EffectSpawner, target: Entity) { + super::DEAD_ENTITIES.lock().unwrap().push_back(target); let mut xp_gain = 0; let mut pools = ecs.write_storage::(); let attributes = ecs.read_storage::(); diff --git a/src/effects/mod.rs b/src/effects/mod.rs index 5c106f1..d2ee7fe 100644 --- a/src/effects/mod.rs +++ b/src/effects/mod.rs @@ -17,6 +17,10 @@ lazy_static! { pub static ref EFFECT_QUEUE: Mutex> = Mutex::new(VecDeque::new()); } +lazy_static! { + pub static ref DEAD_ENTITIES: Mutex> = Mutex::new(VecDeque::new()); +} + pub enum EffectType { Damage { amount: i32 }, Healing { amount: i32 }, @@ -51,6 +55,16 @@ pub fn add_effect(source: Option, effect_type: EffectType, target: Targe /// Iterates through the effects queue, applying each effect to their target. pub fn run_effects_queue(ecs: &mut World) { + // First removes any effect in the EFFECT_QUEUE with a dead entity as its source. + loop { + let dead_entity: Option = DEAD_ENTITIES.lock().unwrap().pop_front(); + if let Some(dead_entity) = dead_entity { + EFFECT_QUEUE.lock().unwrap().retain(|x| x.source != Some(dead_entity)); + } else { + break; + } + } + // Then runs every effect that remains in the queue. loop { let effect: Option = EFFECT_QUEUE.lock().unwrap().pop_front(); if let Some(effect) = effect {