mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Added functionality to remove buffs by category.
This commit is contained in:
parent
ccad1fa0b8
commit
de7191b985
@ -29,14 +29,14 @@ pub enum BuffId {
|
||||
/// De/buff category ID.
|
||||
/// Similar to `BuffId`, but to mark a category (for more generic usage, like
|
||||
/// positive/negative buffs).
|
||||
#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)]
|
||||
#[derive(Clone, Copy, Eq, PartialEq, Debug, Serialize, Deserialize)]
|
||||
pub enum BuffCategoryId {
|
||||
Natural,
|
||||
Physical,
|
||||
Magical,
|
||||
Divine,
|
||||
Negative,
|
||||
Positive,
|
||||
Debuff,
|
||||
Buff,
|
||||
}
|
||||
|
||||
/// Data indicating and configuring behaviour of a de/buff.
|
||||
@ -83,8 +83,14 @@ pub enum BuffChange {
|
||||
Add(Buff),
|
||||
/// Removes all buffs with this ID.
|
||||
RemoveById(BuffId),
|
||||
/// Removes buff of this index
|
||||
/// Removes buffs of these indices (first vec is for active buffs, second is
|
||||
/// for inactive buffs)
|
||||
RemoveByIndex(Vec<usize>, Vec<usize>),
|
||||
/// Removes buffs of these categories (first vec is of categories of which
|
||||
/// all are required, second vec is of categories of which at least one is
|
||||
/// required) Note that this functionality is currently untested and
|
||||
/// should be tested when doing so is possible
|
||||
RemoveByCategory(Vec<BuffCategoryId>, Vec<BuffCategoryId>),
|
||||
}
|
||||
|
||||
/// Source of the de/buff
|
||||
|
@ -684,8 +684,9 @@ pub fn handle_buff(server: &mut Server, uid: Uid, buff_change: buff::BuffChange)
|
||||
let mut stats = ecs.write_storage::<comp::Stats>();
|
||||
let (mut active_buff_indices_for_removal, mut inactive_buff_indices_for_removal) =
|
||||
(Vec::new(), Vec::new());
|
||||
use buff::BuffChange;
|
||||
match buff_change {
|
||||
buff::BuffChange::Add(new_buff) => {
|
||||
BuffChange::Add(new_buff) => {
|
||||
if buffs.active_buffs.is_empty() {
|
||||
add_buff_effects(new_buff.clone(), stats.get_mut(entity));
|
||||
buffs.active_buffs.push(new_buff);
|
||||
@ -716,11 +717,11 @@ pub fn handle_buff(server: &mut Server, uid: Uid, buff_change: buff::BuffChange)
|
||||
}
|
||||
}
|
||||
},
|
||||
buff::BuffChange::RemoveByIndex(active_indices, inactive_indices) => {
|
||||
BuffChange::RemoveByIndex(active_indices, inactive_indices) => {
|
||||
active_buff_indices_for_removal = active_indices;
|
||||
inactive_buff_indices_for_removal = inactive_indices;
|
||||
},
|
||||
buff::BuffChange::RemoveById(id) => {
|
||||
BuffChange::RemoveById(id) => {
|
||||
let some_predicate = |current_id: &buff::BuffId| *current_id == id;
|
||||
for i in 0..buffs.active_buffs.len() {
|
||||
if some_predicate(&mut buffs.active_buffs[i].id) {
|
||||
@ -733,6 +734,54 @@ pub fn handle_buff(server: &mut Server, uid: Uid, buff_change: buff::BuffChange)
|
||||
}
|
||||
}
|
||||
},
|
||||
BuffChange::RemoveByCategory(all_required, any_required) => {
|
||||
for i in 0..buffs.active_buffs.len() {
|
||||
let mut required_met = true;
|
||||
for required in &all_required {
|
||||
if !buffs.active_buffs[i]
|
||||
.cat_ids
|
||||
.iter()
|
||||
.any(|cat| cat == required)
|
||||
{
|
||||
required_met = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
let mut any_met = any_required.is_empty();
|
||||
for any in &any_required {
|
||||
if !buffs.active_buffs[i].cat_ids.iter().any(|cat| cat == any) {
|
||||
any_met = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if required_met && any_met {
|
||||
active_buff_indices_for_removal.push(i);
|
||||
}
|
||||
}
|
||||
for i in 0..buffs.inactive_buffs.len() {
|
||||
let mut required_met = true;
|
||||
for required in &all_required {
|
||||
if !buffs.inactive_buffs[i]
|
||||
.cat_ids
|
||||
.iter()
|
||||
.any(|cat| cat == required)
|
||||
{
|
||||
required_met = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
let mut any_met = any_required.is_empty();
|
||||
for any in &any_required {
|
||||
if !buffs.inactive_buffs[i].cat_ids.iter().any(|cat| cat == any) {
|
||||
any_met = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if required_met && any_met {
|
||||
inactive_buff_indices_for_removal.push(i);
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
let mut removed_active_buff_ids = Vec::new();
|
||||
while !active_buff_indices_for_removal.is_empty() {
|
||||
|
Loading…
Reference in New Issue
Block a user