mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Attacks can now reward energy.
This commit is contained in:
@ -9,7 +9,8 @@ use crate::{
|
|||||||
slot::EquipSlot,
|
slot::EquipSlot,
|
||||||
},
|
},
|
||||||
skills::{SkillGroupKind, SkillSet},
|
skills::{SkillGroupKind, SkillSet},
|
||||||
Body, BuffKind, Health, HealthChange, HealthSource, Inventory, Stats,
|
Body, BuffKind, EnergyChange, EnergySource, Health, HealthChange, HealthSource, Inventory,
|
||||||
|
Stats,
|
||||||
},
|
},
|
||||||
effect,
|
effect,
|
||||||
event::ServerEvent,
|
event::ServerEvent,
|
||||||
@ -66,6 +67,7 @@ impl Attack {
|
|||||||
pub fn apply_attack(
|
pub fn apply_attack(
|
||||||
&self,
|
&self,
|
||||||
target_group: GroupTarget,
|
target_group: GroupTarget,
|
||||||
|
attacker_entity: EcsEntity,
|
||||||
target_entity: EcsEntity,
|
target_entity: EcsEntity,
|
||||||
inventory: Option<&Inventory>,
|
inventory: Option<&Inventory>,
|
||||||
uid: Uid,
|
uid: Uid,
|
||||||
@ -99,6 +101,15 @@ impl Attack {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
AttackEffect::EnergyReward(ec) => {
|
||||||
|
server_events.push(ServerEvent::EnergyChange {
|
||||||
|
entity: attacker_entity,
|
||||||
|
change: EnergyChange {
|
||||||
|
amount: *ec as i32,
|
||||||
|
source: EnergySource::HitEnemy,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -146,8 +157,8 @@ pub enum AttackEffect {
|
|||||||
//Heal(f32),
|
//Heal(f32),
|
||||||
//Buff(effect::BuffEffect),
|
//Buff(effect::BuffEffect),
|
||||||
Knockback(Knockback),
|
Knockback(Knockback),
|
||||||
/*EnergyChange(f32),
|
EnergyReward(u32),
|
||||||
*Lifesteal(f32), */
|
//Lifesteal(f32),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
combat::{Attack, AttackEffect, DamageComponent},
|
combat::{Attack, AttackEffect, DamageComponent},
|
||||||
comp::{
|
comp::{CharacterState, MeleeAttack, PoiseChange, PoiseSource, StateUpdate},
|
||||||
CharacterState, EnergyChange, EnergySource, MeleeAttack, PoiseChange, PoiseSource,
|
|
||||||
StateUpdate,
|
|
||||||
},
|
|
||||||
states::{
|
states::{
|
||||||
behavior::{CharacterBehavior, JoinData},
|
behavior::{CharacterBehavior, JoinData},
|
||||||
utils::*,
|
utils::*,
|
||||||
@ -101,8 +98,10 @@ impl CharacterBehavior for Data {
|
|||||||
strength: self.static_data.knockback,
|
strength: self.static_data.knockback,
|
||||||
direction: KnockbackDir::Away,
|
direction: KnockbackDir::Away,
|
||||||
});
|
});
|
||||||
|
let energy = AttackEffect::EnergyReward(50);
|
||||||
let damage = DamageComponent::new(damage, Some(GroupTarget::OutOfGroup))
|
let damage = DamageComponent::new(damage, Some(GroupTarget::OutOfGroup))
|
||||||
.with_effect(knockback);
|
.with_effect(knockback)
|
||||||
|
.with_effect(energy);
|
||||||
let attack = Attack::default().with_damage(damage).with_crit(0.5, 1.3);
|
let attack = Attack::default().with_damage(damage).with_crit(0.5, 1.3);
|
||||||
|
|
||||||
// Hit attempt
|
// Hit attempt
|
||||||
@ -156,17 +155,6 @@ impl CharacterBehavior for Data {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grant energy on successful hit
|
|
||||||
if let Some(attack) = data.melee_attack {
|
|
||||||
if attack.applied && attack.hit_count > 0 {
|
|
||||||
data.updater.remove::<MeleeAttack>(data.entity);
|
|
||||||
update.energy.change_by(EnergyChange {
|
|
||||||
amount: 50,
|
|
||||||
source: EnergySource::HitEnemy,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
update
|
update
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -191,8 +191,14 @@ impl CharacterBehavior for Data {
|
|||||||
strength: self.static_data.stage_data[stage_index].knockback,
|
strength: self.static_data.stage_data[stage_index].knockback,
|
||||||
direction: KnockbackDir::Away,
|
direction: KnockbackDir::Away,
|
||||||
});
|
});
|
||||||
|
let energy = self.static_data.max_energy_gain.min(
|
||||||
|
self.static_data.initial_energy_gain
|
||||||
|
+ self.combo * self.static_data.energy_increase,
|
||||||
|
);
|
||||||
|
let energy = AttackEffect::EnergyReward(energy);
|
||||||
let damage = DamageComponent::new(damage, Some(GroupTarget::OutOfGroup))
|
let damage = DamageComponent::new(damage, Some(GroupTarget::OutOfGroup))
|
||||||
.with_effect(knockback);
|
.with_effect(knockback)
|
||||||
|
.with_effect(energy);
|
||||||
let attack = Attack::default().with_damage(damage).with_crit(0.5, 1.3);
|
let attack = Attack::default().with_damage(damage).with_crit(0.5, 1.3);
|
||||||
|
|
||||||
data.updater.insert(data.entity, MeleeAttack {
|
data.updater.insert(data.entity, MeleeAttack {
|
||||||
@ -287,10 +293,6 @@ impl CharacterBehavior for Data {
|
|||||||
// Grant energy on successful hit
|
// Grant energy on successful hit
|
||||||
if let Some(attack) = data.melee_attack {
|
if let Some(attack) = data.melee_attack {
|
||||||
if attack.applied && attack.hit_count > 0 {
|
if attack.applied && attack.hit_count > 0 {
|
||||||
let energy = self.static_data.max_energy_gain.min(
|
|
||||||
self.static_data.initial_energy_gain
|
|
||||||
+ self.combo * self.static_data.energy_increase,
|
|
||||||
) as i32;
|
|
||||||
update.character = CharacterState::ComboMelee(Data {
|
update.character = CharacterState::ComboMelee(Data {
|
||||||
static_data: self.static_data.clone(),
|
static_data: self.static_data.clone(),
|
||||||
stage: self.stage,
|
stage: self.stage,
|
||||||
@ -300,10 +302,6 @@ impl CharacterBehavior for Data {
|
|||||||
next_stage: self.next_stage,
|
next_stage: self.next_stage,
|
||||||
});
|
});
|
||||||
data.updater.remove::<MeleeAttack>(data.entity);
|
data.updater.remove::<MeleeAttack>(data.entity);
|
||||||
update.energy.change_by(EnergyChange {
|
|
||||||
amount: energy,
|
|
||||||
source: EnergySource::HitEnemy,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,10 +129,18 @@ impl<'a> System<'a> for Sys {
|
|||||||
|
|
||||||
let dir = Dir::new((pos_b.0 - pos.0).try_normalized().unwrap_or(*ori.0));
|
let dir = Dir::new((pos_b.0 - pos.0).try_normalized().unwrap_or(*ori.0));
|
||||||
|
|
||||||
let server_events =
|
let server_events = attack.attack.apply_attack(
|
||||||
attack
|
target_group,
|
||||||
.attack
|
entity,
|
||||||
.apply_attack(target_group, b, inventory_b_maybe, *uid, dir);
|
b,
|
||||||
|
inventory_b_maybe,
|
||||||
|
*uid,
|
||||||
|
dir,
|
||||||
|
);
|
||||||
|
|
||||||
|
if !server_events.is_empty() {
|
||||||
|
attack.hit_count += 1;
|
||||||
|
}
|
||||||
|
|
||||||
for event in server_events {
|
for event in server_events {
|
||||||
server_emitter.emit(event);
|
server_emitter.emit(event);
|
||||||
|
Reference in New Issue
Block a user