diff --git a/common/src/comp/buff.rs b/common/src/comp/buff.rs index 9b0c947368..4193771b28 100644 --- a/common/src/comp/buff.rs +++ b/common/src/comp/buff.rs @@ -16,12 +16,18 @@ use std::time::Duration; #[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)] pub enum BuffId { /// Restores health/time for some period - Regeneration { strength: f32 }, + Regeneration { + strength: f32, + duration: Option, + }, /// Lowers health over time for some duration - Bleeding { strength: f32 }, + Bleeding { + strength: f32, + duration: Option, + }, /// Prefixes an entity's name with "Cursed" /// Currently placeholder buff to show other stuff is possible - Cursed, + Cursed { duration: Option }, } /// De/buff category ID. @@ -143,30 +149,34 @@ impl Buffs { } impl Buff { - pub fn new( - id: BuffId, - time: Option, - cat_ids: Vec, - source: BuffSource, - ) -> Self { - let effects = match id { - BuffId::Bleeding { strength } => vec![ - BuffEffect::HealthChangeOverTime { - rate: -strength, + pub fn new(id: BuffId, cat_ids: Vec, source: BuffSource) -> Self { + let (effects, time) = match id { + BuffId::Bleeding { strength, duration } => ( + vec![ + BuffEffect::HealthChangeOverTime { + rate: -strength, + accumulated: 0.0, + }, + // This effect is for testing purposes + BuffEffect::NameChange { + prefix: String::from("Injured "), + }, + ], + duration, + ), + BuffId::Regeneration { strength, duration } => ( + vec![BuffEffect::HealthChangeOverTime { + rate: strength, accumulated: 0.0, - }, - // This effect is for testing purposes - BuffEffect::NameChange { - prefix: String::from("Injured "), - }, - ], - BuffId::Regeneration { strength } => vec![BuffEffect::HealthChangeOverTime { - rate: strength, - accumulated: 0.0, - }], - BuffId::Cursed => vec![BuffEffect::NameChange { - prefix: String::from("Cursed "), - }], + }], + duration, + ), + BuffId::Cursed { duration } => ( + vec![BuffEffect::NameChange { + prefix: String::from("Cursed "), + }], + duration, + ), }; Buff { id, diff --git a/common/src/sys/combat.rs b/common/src/sys/combat.rs index f577a95fcf..be54208631 100644 --- a/common/src/sys/combat.rs +++ b/common/src/sys/combat.rs @@ -157,8 +157,8 @@ impl<'a> System<'a> for Sys { buff_change: buff::BuffChange::Add(buff::Buff::new( buff::BuffId::Bleeding { strength: -damage.healthchange, + duration: Some(Duration::from_millis(10000)), }, - Some(Duration::from_millis(10000)), vec![buff::BuffCategoryId::Physical], buff::BuffSource::Character { by: *uid }, )), diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index 9d106d3d61..d61cf9f6cf 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -862,9 +862,11 @@ fn determine_replace_active_buff(active_buff: buff::Buff, new_buff: buff::Buff) match new_buff.id { BuffId::Bleeding { strength: new_strength, + duration: _, } => { if let BuffId::Bleeding { strength: active_strength, + duration: _, } = active_buff.id { new_strength > active_strength @@ -874,9 +876,11 @@ fn determine_replace_active_buff(active_buff: buff::Buff, new_buff: buff::Buff) }, BuffId::Regeneration { strength: new_strength, + duration: _, } => { if let BuffId::Regeneration { strength: active_strength, + duration: _, } = active_buff.id { new_strength > active_strength @@ -884,7 +888,7 @@ fn determine_replace_active_buff(active_buff: buff::Buff, new_buff: buff::Buff) false } }, - BuffId::Cursed => false, + BuffId::Cursed { duration: _ } => false, } }