Make npcs roll correctly

This commit is contained in:
timokoesters 2019-08-28 15:55:35 +02:00 committed by jshipsey
parent 77a48c61a1
commit b99bac87db
4 changed files with 12 additions and 75 deletions

View File

@ -279,10 +279,7 @@ impl Client {
// 2) Build up a list of events for this frame, to be passed to the frontend.
let mut frontend_events = Vec::new();
// Handle new messages from the server.
frontend_events.append(&mut self.handle_new_messages()?);
// 3) Update client local data
// Prepare for new events
{
let ecs = self.state.ecs_mut();
for (entity, _) in (&ecs.entities(), &ecs.read_storage::<comp::Body>()).join() {
@ -307,6 +304,10 @@ impl Client {
}
}
}
// Handle new messages from the server.
frontend_events.append(&mut self.handle_new_messages()?);
// 3) Update client local data
// 4) Tick the client's LocalState
self.state.tick(dt);

View File

@ -1,65 +0,0 @@
use crate::{
comp::{
ActionState::*, Animation, AnimationInfo, CharacterState, MovementState::*, PhysicsState,
Stats,
},
state::DeltaTime,
};
use specs::{Entities, Join, Read, ReadStorage, System, WriteStorage};
use std::fmt::Debug;
/// This system will apply the animation that fits best to the users actions
pub struct Sys;
impl<'a> System<'a> for Sys {
type SystemData = (
Entities<'a>,
Read<'a, DeltaTime>,
ReadStorage<'a, Stats>,
ReadStorage<'a, CharacterState>,
ReadStorage<'a, PhysicsState>,
WriteStorage<'a, AnimationInfo>,
);
fn run(
&mut self,
(entities, dt, stats, character_states, physics_states, mut animation_infos): Self::SystemData,
) {
for (entity, stats, character, physics) in
(&entities, &stats, &character_states, &physics_states).join()
{
if stats.is_dead {
continue;
}
let animation = match (physics.on_ground, &character.movement, &character.action) {
//(_, Roll { .. }, _) => Animation::Roll,
//(true, Stand, _) => Animation::Stand, //if standing still, legs still
//(true, Stand, Idle) => Animation::Idle, //if standing still and not acting, idle the body
//(true, Run, _) => Animation::Run, //if running, legs run
//(true, Run, Idle) => Animation::Lean, //if running and not acting, lean the body
//(false, Jump, Idle) => Animation::Jump,
//(true, Stand, Wield { .. }) => Animation::Cidle,
//(true, Run, Wield { .. }) => Animation::Crun,
//(false, Jump, Wield { .. }) => Animation::Cjump,
//(_, Glide, Idle) => Animation::Gliding,
//(_, _, Attack { .. }) => Animation::Attack,
//(_, _, Block { .. }) => Animation::Block,
// Impossible animation (Caused by missing animations or syncing delays)
_ => Animation::Gliding,
};
let new_time = animation_infos
.get(entity)
.filter(|i| i.animation == animation)
.map(|i| i.time + f64::from(dt.0));
let _ = animation_infos.insert(
entity,
AnimationInfo {
animation,
time: new_time.unwrap_or(0.0),
},
);
}
}
}

View File

@ -1,5 +1,4 @@
pub mod agent;
pub mod animation;
mod cleanup;
pub mod combat;
pub mod controller;
@ -16,7 +15,6 @@ const CONTROLLER_SYS: &str = "controller_sys";
const PHYS_SYS: &str = "phys_sys";
const MOVEMENT_SYS: &str = "movement_sys";
const COMBAT_SYS: &str = "combat_sys";
const ANIMATION_SYS: &str = "animation_sys";
const STATS_SYS: &str = "stats_sys";
const CLEANUP_SYS: &str = "cleanup_sys";
@ -26,7 +24,6 @@ pub fn add_local_systems(dispatch_builder: &mut DispatcherBuilder) {
dispatch_builder.add(phys::Sys, PHYS_SYS, &[CONTROLLER_SYS]);
dispatch_builder.add(movement::Sys, MOVEMENT_SYS, &[PHYS_SYS]);
dispatch_builder.add(combat::Sys, COMBAT_SYS, &[CONTROLLER_SYS]);
dispatch_builder.add(animation::Sys, ANIMATION_SYS, &[MOVEMENT_SYS]);
dispatch_builder.add(stats::Sys, STATS_SYS, &[COMBAT_SYS]);
dispatch_builder.add(cleanup::Sys, CLEANUP_SYS, &[STATS_SYS, ANIMATION_SYS]);
dispatch_builder.add(cleanup::Sys, CLEANUP_SYS, &[STATS_SYS, MOVEMENT_SYS]);
}

View File

@ -782,7 +782,9 @@ impl FigureMgr {
_ => continue,
};
if last_character.0.movement != character.movement {
if std::mem::discriminant(&last_character.0.movement)
!= std::mem::discriminant(&character.movement)
{
state.last_movement_change = Instant::now();
}
@ -829,7 +831,9 @@ impl FigureMgr {
_ => continue,
};
if last_character.0.movement != character.movement {
if std::mem::discriminant(&last_character.0.movement)
!= std::mem::discriminant(&character.movement)
{
state.last_movement_change = Instant::now();
}