veloren/common/src/sys/controller.rs

109 lines
3.0 KiB
Rust
Raw Normal View History

2019-06-09 14:20:20 +00:00
use crate::{
comp::{
phys::{ForceUpdate, Ori, Pos, Vel},
2019-06-09 19:33:20 +00:00
Animation, AnimationInfo, Attacking, Controller, Gliding, HealthSource, Jumping, MoveDir,
OnGround, Respawning, Stats,
2019-06-09 14:20:20 +00:00
},
state::{DeltaTime, Uid},
terrain::TerrainMap,
vol::{ReadVol, Vox},
};
use log::warn;
use specs::{Entities, Join, Read, ReadExpect, ReadStorage, System, WriteStorage};
use vek::*;
2019-06-09 19:33:20 +00:00
/// This system is responsible for validating controller inputs
2019-06-09 14:20:20 +00:00
pub struct Sys;
impl<'a> System<'a> for Sys {
type SystemData = (
Entities<'a>,
Read<'a, DeltaTime>,
ReadStorage<'a, Controller>,
ReadStorage<'a, Stats>,
ReadExpect<'a, TerrainMap>,
ReadStorage<'a, Pos>,
WriteStorage<'a, Vel>,
WriteStorage<'a, Ori>,
2019-06-09 19:33:20 +00:00
WriteStorage<'a, MoveDir>,
WriteStorage<'a, OnGround>,
2019-06-09 14:20:20 +00:00
WriteStorage<'a, Jumping>,
WriteStorage<'a, Attacking>,
2019-06-09 19:33:20 +00:00
WriteStorage<'a, Respawning>,
2019-06-09 14:20:20 +00:00
WriteStorage<'a, Gliding>,
WriteStorage<'a, ForceUpdate>,
);
fn run(
&mut self,
(
entities,
dt,
controllers,
stats,
terrain,
positions,
mut velocities,
mut orientations,
2019-06-09 19:33:20 +00:00
mut move_dirs,
mut on_grounds,
mut jumpings,
mut attackings,
mut respawns,
mut glidings,
2019-06-09 14:20:20 +00:00
mut force_updates,
): Self::SystemData,
) {
2019-06-09 19:33:20 +00:00
for (entity, controller, stats, pos, mut vel, mut ori, on_ground) in (
2019-06-09 14:20:20 +00:00
&entities,
&controllers,
&stats,
&positions,
&mut velocities,
&mut orientations,
2019-06-09 19:33:20 +00:00
on_grounds.maybe(),
2019-06-09 14:20:20 +00:00
)
.join()
{
if stats.is_dead {
2019-06-09 19:33:20 +00:00
// Respawn
if controller.respawn {
respawns.insert(entity, Respawning);
}
2019-06-09 14:20:20 +00:00
continue;
}
2019-06-09 19:33:20 +00:00
// Glide
if controller.glide && on_ground.is_none() && attackings.get(entity).is_none() {
glidings.insert(entity, Gliding);
2019-06-09 14:20:20 +00:00
} else {
2019-06-09 19:33:20 +00:00
glidings.remove(entity);
2019-06-09 14:20:20 +00:00
}
2019-06-09 19:33:20 +00:00
// Move dir
move_dirs.insert(
entity,
MoveDir(if controller.move_dir.magnitude() > 1.0 {
controller.move_dir.normalized()
} else {
controller.move_dir
}),
);
2019-06-09 14:20:20 +00:00
// Attack
2019-06-09 19:33:20 +00:00
if controller.attack
&& attackings.get(entity).is_none()
&& glidings.get(entity).is_none()
{
attackings.insert(entity, Attacking::start());
}
// Jump
if on_grounds.get(entity).is_some() && controller.jump && vel.0.z <= 0.0 {
jumpings.insert(entity, Jumping);
} else {
jumpings.remove(entity);
2019-06-09 14:20:20 +00:00
}
}
}
}