From 20509a7818999f3f9f787736ba6c31ce6edfc3a0 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sun, 16 Jan 2022 19:27:11 +0000 Subject: [PATCH] Removed mounted combat edge cases --- common/src/comp/character_state.rs | 26 ++++++++++++++++++++++++ common/systems/src/character_behavior.rs | 11 ++++------ common/systems/src/lib.rs | 2 +- common/systems/src/mount.rs | 16 ++++++++------- 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/common/src/comp/character_state.rs b/common/src/comp/character_state.rs index 46350e7cca..10671b318e 100644 --- a/common/src/comp/character_state.rs +++ b/common/src/comp/character_state.rs @@ -243,6 +243,32 @@ impl CharacterState { || matches!(self, CharacterState::Roll(s) if s.stage_section == StageSection::Movement) } + pub fn can_perform_mounted(&self) -> bool { + matches!( + self, + CharacterState::Idle(_) + | CharacterState::Sit + | CharacterState::Talk + | CharacterState::GlideWield(_) + | CharacterState::Stunned(_) + | CharacterState::BasicBlock(_) + | CharacterState::Equipping(_) + | CharacterState::Wielding(_) + | CharacterState::BasicMelee(_) + | CharacterState::BasicRanged(_) + | CharacterState::ComboMelee(_) + | CharacterState::ChargedRanged(_) + | CharacterState::RepeaterRanged(_) + | CharacterState::BasicBeam(_) + | CharacterState::BasicAura(_) + | CharacterState::BasicSummon(_) + | CharacterState::SelfBuff(_) + | CharacterState::SpriteSummon(_) + | CharacterState::UseItem(_) + | CharacterState::SpriteInteract(_) + ) + } + pub fn is_sitting(&self) -> bool { use use_item::{Data, ItemUseKind, StaticData}; matches!( diff --git a/common/systems/src/character_behavior.rs b/common/systems/src/character_behavior.rs index f0712c5531..cfd9e6cc1e 100644 --- a/common/systems/src/character_behavior.rs +++ b/common/systems/src/character_behavior.rs @@ -210,13 +210,10 @@ impl<'a> System<'a> for Sys { // Mounted occurs after control actions have been handled // If mounted, character state is controlled by mount - if is_rider.is_some() { - let idle_state = CharacterState::Idle(idle::Data { is_sneaking: false }); - // TODO: A better way to swap between mount inputs and rider - // inputs if *join_struct.char_state != - // idle_state { *join_struct.char_state = - // idle_state; } - // continue; + if is_rider.is_some() && !join_struct.char_state.can_perform_mounted() { + // TODO: A better way to swap between mount inputs and rider inputs + *join_struct.char_state = CharacterState::Idle(idle::Data { is_sneaking: false }); + continue; } let j = JoinData::new( diff --git a/common/systems/src/lib.rs b/common/systems/src/lib.rs index 8a97a47771..a88b20b9b9 100644 --- a/common/systems/src/lib.rs +++ b/common/systems/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(bool_to_option, let_else)] +#![feature(bool_to_option, let_else, btree_drain_filter)] #![allow(clippy::option_map_unit_fn)] mod aura; diff --git a/common/systems/src/mount.rs b/common/systems/src/mount.rs index ddc2edb3bf..82b43dbf13 100644 --- a/common/systems/src/mount.rs +++ b/common/systems/src/mount.rs @@ -51,8 +51,14 @@ impl<'a> System<'a> for Sys { .retrieve_entity_internal(is_mount.rider.id()) .and_then(|rider| { controllers - .get(rider) - .map(|c| (c.inputs.clone(), c.queued_inputs.clone(), rider)) + .get_mut(rider) + .map(|c| { + let queued_inputs = c.queued_inputs + // TODO: Formalise ways to pass inputs to mounts + .drain_filter(|i, _| matches!(i, InputKind::Jump | InputKind::Fly | InputKind::Roll)) + .collect(); + (c.inputs.clone(), queued_inputs, rider) + }) }) else { continue }; @@ -72,11 +78,7 @@ impl<'a> System<'a> for Sys { if let Some(controller) = controllers.get_mut(entity) { *controller = Controller { inputs, - queued_inputs: queued_inputs - .into_iter() - // TODO: Formalise ways to pass inputs to mounts - .filter(|(i, _)| matches!(i, InputKind::Jump | InputKind::Fly | InputKind::Roll)) - .collect(), + queued_inputs, ..Default::default() } }