diff --git a/assets/all.headsdb.ron b/assets/all.headsdb.ron index dbbb2c7..e54c343 100644 --- a/assets/all.headsdb.ron +++ b/assets/all.headsdb.ron @@ -9,7 +9,7 @@ /*07*/(key:"green grocer", ability:Curver, range:60, ammo:10, damage:25, projectile:"carrot"), /*08*/(key:"highland hammer thrower", ability:Thrown, aps:2, ammo:10, damage:25, range:80, projectile:"hammer", interrupt_shoot:false), /*09*/(key:"legionnaire", ability:Gun, aps:2, ammo:25, range:60, damage:13, shoot_offset:0.1667), - /*10*/(key:"mig pilot", ability:Missile, ammo:5, range:60, damage:100, controls:Plane), + /*10*/(key:"mig pilot", ability:Missile, ammo:5, range:60, damage:100, controls:Plane, interrupt_shoot:false), /*11*/(key:"nanny", ability:Thrown, range:60), /*12*/(key:"panic attack", ability:Turbo), /*13*/(key:"salty sea dog", ability:Boat), diff --git a/crates/shared/src/control/controller_common.rs b/crates/shared/src/control/controller_common.rs index 19ed8ea..6d1a3f6 100644 --- a/crates/shared/src/control/controller_common.rs +++ b/crates/shared/src/control/controller_common.rs @@ -1,9 +1,12 @@ use super::{ControllerSet, ControllerSwitchEvent}; use crate::{ GameState, - control::{SelectedController, controls::ControllerSettings}, + abilities::TriggerStateRes, + animation::AnimationFlags, + character::HasCharacterAnimations, + control::{Controls, SelectedController, controls::ControllerSettings}, heads_database::HeadControls, - player::PlayerBodyMesh, + player::{Player, PlayerBodyMesh}, }; use avian3d::{math::*, prelude::*}; use bevy::prelude::*; @@ -27,13 +30,57 @@ pub fn plugin(app: &mut App) { .run_if(in_state(GameState::Playing)) .before(ControllerSet::ApplyControlsRun) .before(ControllerSet::ApplyControlsFly), - ) - .add_systems( + ); + + app.add_systems( + PreUpdate, + set_animation_flags + .run_if(in_state(GameState::Playing)) + .after(ControllerSet::ApplyControlsRun) + .after(ControllerSet::ApplyControlsFly), + ); + + app.add_systems( FixedPreUpdate, decelerate.run_if(in_state(GameState::Playing)), ); } +fn set_animation_flags( + mut flags: Query<&mut AnimationFlags>, + controls: Res, + trigger: Res, + player: Single<(&Grounding, &HasCharacterAnimations), With>, +) { + let mut direction = controls.keyboard_state.move_dir; + let deadzone = 0.2; + + let (grounding, has_anims) = *player; + let mut flags = flags.get_mut(*has_anims.collection()).unwrap(); + + if let Some(gamepad) = controls.gamepad_state { + direction += gamepad.move_dir; + } + + if flags.any_direction { + if direction.length_squared() < deadzone { + flags.any_direction = false; + } + } else if direction.length_squared() > deadzone { + flags.any_direction = true; + } + + if flags.shooting != trigger.is_active() { + flags.shooting = trigger.is_active(); + } + + // `apply_controls` sets the jump flag when the player actually jumps. + // Unset the flag on hitting the ground + if grounding.is_grounded() { + flags.jumping = false; + } +} + /// Reset the pitch and velocity of the character if the controller was switched. pub fn reset_upon_switch( mut c: Commands, diff --git a/crates/shared/src/control/controller_running.rs b/crates/shared/src/control/controller_running.rs index 67858e8..dcc509b 100644 --- a/crates/shared/src/control/controller_running.rs +++ b/crates/shared/src/control/controller_running.rs @@ -1,11 +1,10 @@ -use super::{ControlState, ControllerSet, Controls}; +use super::{ControlState, ControllerSet}; use crate::{ GameState, - abilities::TriggerStateRes, animation::AnimationFlags, character::HasCharacterAnimations, control::{controller_common::MovementSpeedFactor, controls::ControllerSettings}, - player::{Player, PlayerBodyMesh}, + player::PlayerBodyMesh, }; use bevy::prelude::*; use happy_feet::prelude::{Grounding, KinematicVelocity, MoveInput}; @@ -16,7 +15,7 @@ impl Plugin for CharacterControllerPlugin { fn build(&self, app: &mut App) { app.add_systems( PreUpdate, - (set_animation_flags, rotate_view, apply_controls) + (rotate_view, apply_controls) .chain() .in_set(ControllerSet::ApplyControlsRun) .run_if(in_state(GameState::Playing)), @@ -24,42 +23,6 @@ impl Plugin for CharacterControllerPlugin { } } -/// Sets the movement flag, which is an indicator for the rig animation and the braking system. -fn set_animation_flags( - mut flags: Query<&mut AnimationFlags>, - controls: Res, - trigger: Res, - player: Single<(&Grounding, &HasCharacterAnimations), With>, -) { - let mut direction = controls.keyboard_state.move_dir; - let deadzone = 0.2; - - let (grounding, has_anims) = *player; - let mut flags = flags.get_mut(*has_anims.collection()).unwrap(); - - if let Some(gamepad) = controls.gamepad_state { - direction += gamepad.move_dir; - } - - if flags.any_direction { - if direction.length_squared() < deadzone { - flags.any_direction = false; - } - } else if direction.length_squared() > deadzone { - flags.any_direction = true; - } - - if flags.shooting != trigger.is_active() { - flags.shooting = trigger.is_active(); - } - - // `apply_controls` sets the jump flag when the player actually jumps. - // Unset the flag on hitting the ground - if grounding.is_grounded() { - flags.jumping = false; - } -} - fn rotate_view( controls: Res, mut player: Query<&mut Transform, With>,