veloren/common/src/states/equipping.rs

46 lines
1.3 KiB
Rust
Raw Normal View History

2020-03-07 18:15:02 +00:00
use super::utils::*;
use crate::{
comp::{CharacterState, StateUpdate},
2020-03-14 21:17:27 +00:00
sys::character_behavior::{CharacterBehavior, JoinData},
2020-03-07 18:15:02 +00:00
};
use std::{collections::VecDeque, time::Duration};
2020-03-14 21:17:27 +00:00
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
pub struct Data {
/// Time left before next state
pub time_left: Duration,
}
impl CharacterBehavior for Data {
fn behavior(&self, data: &JoinData) -> StateUpdate {
let mut update = StateUpdate {
character: data.character.clone(),
2020-03-14 21:17:27 +00:00
pos: *data.pos,
vel: *data.vel,
ori: *data.ori,
energy: *data.energy,
local_events: VecDeque::new(),
server_events: VecDeque::new(),
};
2020-03-07 18:15:02 +00:00
2020-03-14 21:17:27 +00:00
handle_move(&data, &mut update);
handle_jump(&data, &mut update);
2020-03-07 18:15:02 +00:00
2020-03-14 21:17:27 +00:00
if self.time_left == Duration::default() {
2020-03-07 18:15:02 +00:00
// Wield delay has expired
update.character = CharacterState::Wielding;
2020-03-07 18:15:02 +00:00
} else {
// Wield delay hasn't expired yet
// Update wield delay
2020-03-14 21:17:27 +00:00
update.character = CharacterState::Equipping(Data {
time_left: self
.time_left
2020-03-07 18:15:02 +00:00
.checked_sub(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(),
2020-03-14 21:17:27 +00:00
});
2020-03-07 18:15:02 +00:00
}
2020-03-14 21:17:27 +00:00
update
2020-03-07 18:15:02 +00:00
}
}