mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Effects on attacks can now require energy.
This commit is contained in:
parent
2b11ae6569
commit
e5caef8a54
@ -11,7 +11,8 @@ use crate::{
|
|||||||
},
|
},
|
||||||
poise::PoiseChange,
|
poise::PoiseChange,
|
||||||
skills::{SkillGroupKind, SkillSet},
|
skills::{SkillGroupKind, SkillSet},
|
||||||
Body, EnergyChange, EnergySource, Health, HealthChange, HealthSource, Inventory, Stats,
|
Body, Energy, EnergyChange, EnergySource, Health, HealthChange, HealthSource, Inventory,
|
||||||
|
Stats,
|
||||||
},
|
},
|
||||||
event::ServerEvent,
|
event::ServerEvent,
|
||||||
uid::Uid,
|
uid::Uid,
|
||||||
@ -71,8 +72,9 @@ impl Attack {
|
|||||||
target_group: GroupTarget,
|
target_group: GroupTarget,
|
||||||
attacker_entity: EcsEntity,
|
attacker_entity: EcsEntity,
|
||||||
target_entity: EcsEntity,
|
target_entity: EcsEntity,
|
||||||
inventory: Option<&Inventory>,
|
target_inventory: Option<&Inventory>,
|
||||||
attacker_uid: Uid,
|
attacker_uid: Uid,
|
||||||
|
attacker_energy: Option<&Energy>,
|
||||||
dir: Dir,
|
dir: Dir,
|
||||||
target_dodging: bool,
|
target_dodging: bool,
|
||||||
) -> Vec<ServerEvent> {
|
) -> Vec<ServerEvent> {
|
||||||
@ -86,7 +88,7 @@ impl Attack {
|
|||||||
.filter(|d| !(matches!(d.target, Some(GroupTarget::OutOfGroup)) && target_dodging))
|
.filter(|d| !(matches!(d.target, Some(GroupTarget::OutOfGroup)) && target_dodging))
|
||||||
{
|
{
|
||||||
let change = damage.damage.modify_damage(
|
let change = damage.damage.modify_damage(
|
||||||
inventory,
|
target_inventory,
|
||||||
Some(attacker_uid),
|
Some(attacker_uid),
|
||||||
is_crit,
|
is_crit,
|
||||||
self.crit_multiplier,
|
self.crit_multiplier,
|
||||||
@ -141,7 +143,7 @@ impl Attack {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
AttackEffect::Poise(p) => {
|
AttackEffect::Poise(p) => {
|
||||||
let change = PoiseChange::from_attack(*p, inventory);
|
let change = PoiseChange::from_attack(*p, target_inventory);
|
||||||
server_events.push(ServerEvent::PoiseChange {
|
server_events.push(ServerEvent::PoiseChange {
|
||||||
entity: target_entity,
|
entity: target_entity,
|
||||||
change,
|
change,
|
||||||
@ -172,6 +174,20 @@ impl Attack {
|
|||||||
{
|
{
|
||||||
if match &effect.requirement {
|
if match &effect.requirement {
|
||||||
Some(CombatRequirement::AnyDamage) => accumulated_damage != 0.0,
|
Some(CombatRequirement::AnyDamage) => accumulated_damage != 0.0,
|
||||||
|
Some(CombatRequirement::SufficientEnergy(r)) => {
|
||||||
|
if attacker_energy.map_or(true, |e| e.current() >= *r) {
|
||||||
|
server_events.push(ServerEvent::EnergyChange {
|
||||||
|
entity: attacker_entity,
|
||||||
|
change: EnergyChange {
|
||||||
|
amount: -(*r as i32),
|
||||||
|
source: EnergySource::Ability,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
},
|
||||||
None => true,
|
None => true,
|
||||||
} {
|
} {
|
||||||
match effect.effect {
|
match effect.effect {
|
||||||
@ -216,7 +232,7 @@ impl Attack {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
AttackEffect::Poise(p) => {
|
AttackEffect::Poise(p) => {
|
||||||
let change = PoiseChange::from_attack(p, inventory);
|
let change = PoiseChange::from_attack(p, target_inventory);
|
||||||
server_events.push(ServerEvent::PoiseChange {
|
server_events.push(ServerEvent::PoiseChange {
|
||||||
entity: target_entity,
|
entity: target_entity,
|
||||||
change,
|
change,
|
||||||
@ -299,6 +315,7 @@ pub enum AttackEffect {
|
|||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub enum CombatRequirement {
|
pub enum CombatRequirement {
|
||||||
AnyDamage,
|
AnyDamage,
|
||||||
|
SufficientEnergy(u32),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
|
@ -138,7 +138,9 @@ impl CharacterBehavior for Data {
|
|||||||
let damage = DamageComponent::new(damage, Some(GroupTarget::OutOfGroup))
|
let damage = DamageComponent::new(damage, Some(GroupTarget::OutOfGroup))
|
||||||
.with_effect(lifesteal);
|
.with_effect(lifesteal);
|
||||||
let heal = EffectComponent::new(Some(GroupTarget::InGroup), heal)
|
let heal = EffectComponent::new(Some(GroupTarget::InGroup), heal)
|
||||||
/*.with_requirement(CombatRequirement::SufficientEnergy(self.static_data.energy_cost))*/;
|
.with_requirement(CombatRequirement::SufficientEnergy(
|
||||||
|
self.static_data.energy_cost,
|
||||||
|
));
|
||||||
let attack = Attack::default()
|
let attack = Attack::default()
|
||||||
.with_damage(damage)
|
.with_damage(damage)
|
||||||
.with_effect(energy)
|
.with_effect(energy)
|
||||||
|
@ -175,6 +175,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
b,
|
b,
|
||||||
inventory_b_maybe,
|
inventory_b_maybe,
|
||||||
owner_uid,
|
owner_uid,
|
||||||
|
energies.get(beam_owner),
|
||||||
ori.0,
|
ori.0,
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
@ -187,77 +188,6 @@ impl<'a> System<'a> for Sys {
|
|||||||
server_emitter.emit(event);
|
server_emitter.emit(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for (target, damage) in beam_segment.damages.iter() {
|
|
||||||
// if let Some(target) = target {
|
|
||||||
// if *target != target_group {
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // Modify damage
|
|
||||||
// let change = damage.modify_damage(
|
|
||||||
// inventories.get(b),
|
|
||||||
// beam_segment.owner,
|
|
||||||
// false,
|
|
||||||
// 0.0,
|
|
||||||
// );
|
|
||||||
|
|
||||||
// match target {
|
|
||||||
// Some(GroupTarget::OutOfGroup) => {
|
|
||||||
// server_emitter.emit(ServerEvent::Damage {
|
|
||||||
// entity: b, change }); if
|
|
||||||
// let Some(entity) = beam_owner {
|
|
||||||
// server_emitter.emit(ServerEvent::Damage {
|
|
||||||
// entity,
|
|
||||||
// change: HealthChange {
|
|
||||||
// amount: (-change.amount as f32
|
|
||||||
// * beam_segment.lifesteal_eff)
|
|
||||||
// as i32,
|
|
||||||
// cause: HealthSource::Heal {
|
|
||||||
// by: beam_segment.owner,
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// server_emitter.emit(ServerEvent::EnergyChange {
|
|
||||||
// entity,
|
|
||||||
// change: EnergyChange {
|
|
||||||
// amount: beam_segment.energy_regen
|
|
||||||
// as i32,
|
|
||||||
// source: EnergySource::HitEnemy,
|
|
||||||
// },
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// Some(GroupTarget::InGroup) => {
|
|
||||||
// if let Some(energy) = beam_owner.and_then(|o|
|
|
||||||
// energies.get(o)) { if
|
|
||||||
// energy.current() > beam_segment.energy_cost {
|
|
||||||
//
|
|
||||||
// server_emitter.emit(ServerEvent::EnergyChange {
|
|
||||||
// entity: beam_owner.unwrap(), /*
|
|
||||||
// If it's able to get an energy
|
|
||||||
// * component, the entity exists */
|
|
||||||
// change: EnergyChange {
|
|
||||||
// amount:
|
|
||||||
// -(beam_segment.energy_cost as i32), // Stamina use
|
|
||||||
// source:
|
|
||||||
// EnergySource::Ability,
|
|
||||||
// }, });
|
|
||||||
// server_emitter
|
|
||||||
// .emit(ServerEvent::Damage {
|
|
||||||
// entity: b, change });
|
|
||||||
// } }
|
|
||||||
// },
|
|
||||||
// None => {},
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // Adds entities that were hit to the hit_entities
|
|
||||||
// list on the beam, sees if // it needs
|
|
||||||
// to purge the hit_entities list
|
|
||||||
// hit_entities.push(*uid_b);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use common::{
|
use common::{
|
||||||
comp::{group, Body, CharacterState, Health, Inventory, MeleeAttack, Ori, Pos, Scale},
|
comp::{group, Body, CharacterState, Energy, Health, Inventory, MeleeAttack, Ori, Pos, Scale},
|
||||||
event::{EventBus, LocalEvent, ServerEvent},
|
event::{EventBus, LocalEvent, ServerEvent},
|
||||||
metrics::SysMetrics,
|
metrics::SysMetrics,
|
||||||
span,
|
span,
|
||||||
@ -26,6 +26,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
ReadStorage<'a, Scale>,
|
ReadStorage<'a, Scale>,
|
||||||
ReadStorage<'a, Body>,
|
ReadStorage<'a, Body>,
|
||||||
ReadStorage<'a, Health>,
|
ReadStorage<'a, Health>,
|
||||||
|
ReadStorage<'a, Energy>,
|
||||||
ReadStorage<'a, Inventory>,
|
ReadStorage<'a, Inventory>,
|
||||||
ReadStorage<'a, group::Group>,
|
ReadStorage<'a, group::Group>,
|
||||||
WriteStorage<'a, MeleeAttack>,
|
WriteStorage<'a, MeleeAttack>,
|
||||||
@ -45,6 +46,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
scales,
|
scales,
|
||||||
bodies,
|
bodies,
|
||||||
healths,
|
healths,
|
||||||
|
energies,
|
||||||
inventories,
|
inventories,
|
||||||
groups,
|
groups,
|
||||||
mut attacking_storage,
|
mut attacking_storage,
|
||||||
@ -133,6 +135,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
b,
|
b,
|
||||||
inventory_b_maybe,
|
inventory_b_maybe,
|
||||||
*uid,
|
*uid,
|
||||||
|
energies.get(entity),
|
||||||
dir,
|
dir,
|
||||||
is_dodge,
|
is_dodge,
|
||||||
);
|
);
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
use common::{
|
use common::{
|
||||||
comp::{projectile, Group, HealthSource, Inventory, Ori, PhysicsState, Pos, Projectile, Vel},
|
comp::{
|
||||||
|
projectile, Energy, Group, HealthSource, Inventory, Ori, PhysicsState, Pos, Projectile, Vel,
|
||||||
|
},
|
||||||
event::{EventBus, ServerEvent},
|
event::{EventBus, ServerEvent},
|
||||||
metrics::SysMetrics,
|
metrics::SysMetrics,
|
||||||
resources::DeltaTime,
|
resources::DeltaTime,
|
||||||
@ -29,6 +31,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
WriteStorage<'a, Projectile>,
|
WriteStorage<'a, Projectile>,
|
||||||
ReadStorage<'a, Inventory>,
|
ReadStorage<'a, Inventory>,
|
||||||
ReadStorage<'a, Group>,
|
ReadStorage<'a, Group>,
|
||||||
|
ReadStorage<'a, Energy>,
|
||||||
);
|
);
|
||||||
|
|
||||||
fn run(
|
fn run(
|
||||||
@ -46,6 +49,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
mut projectiles,
|
mut projectiles,
|
||||||
inventories,
|
inventories,
|
||||||
groups,
|
groups,
|
||||||
|
energies,
|
||||||
): Self::SystemData,
|
): Self::SystemData,
|
||||||
) {
|
) {
|
||||||
let start_time = std::time::Instant::now();
|
let start_time = std::time::Instant::now();
|
||||||
@ -110,6 +114,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
target_entity,
|
target_entity,
|
||||||
inventories.get(target_entity),
|
inventories.get(target_entity),
|
||||||
owner,
|
owner,
|
||||||
|
energies.get(owner_entity),
|
||||||
ori.0,
|
ori.0,
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user