From 819c2767bcee2311de2622f948bf45b1b7294f13 Mon Sep 17 00:00:00 2001 From: Adam Whitehurst Date: Sat, 21 Mar 2020 14:16:26 -0700 Subject: [PATCH] * move swap loadout to handle_swap_loadout util fn * impl From for StateUpdate --- common/src/comp/character_state.rs | 18 +++++++++++++++++- common/src/states/basic_block.rs | 11 +---------- common/src/states/basic_melee.rs | 12 ++---------- common/src/states/basic_ranged.rs | 12 ++---------- common/src/states/boost.rs | 12 ++---------- common/src/states/climb.rs | 11 +---------- common/src/states/dash_melee.rs | 12 ++---------- common/src/states/equipping.rs | 12 ++---------- common/src/states/glide.rs | 11 +---------- common/src/states/idle.rs | 11 +---------- common/src/states/roll.rs | 12 ++---------- common/src/states/sit.rs | 11 +---------- common/src/states/timed_combo.rs | 12 ++---------- common/src/states/triple_strike.rs | 12 ++---------- common/src/states/utils.rs | 12 ++++++++++++ common/src/states/wielding.rs | 12 ++---------- common/src/sys/character_behavior.rs | 23 ++++++++++++----------- voxygen/src/session.rs | 17 ++--------------- voxygen/src/settings.rs | 2 +- 19 files changed, 67 insertions(+), 168 deletions(-) diff --git a/common/src/comp/character_state.rs b/common/src/comp/character_state.rs index 7aea71d3aa..a51b3ba808 100644 --- a/common/src/comp/character_state.rs +++ b/common/src/comp/character_state.rs @@ -1,7 +1,8 @@ use crate::{ - comp::{Energy, Ori, Pos, Vel}, + comp::{Energy, Loadout, Ori, Pos, Vel}, event::{LocalEvent, ServerEvent}, states::*, + sys::character_behavior::JoinData, }; use serde::{Deserialize, Serialize}; use specs::{Component, FlaggedStorage, HashMapStorage, VecStorage}; @@ -14,10 +15,25 @@ pub struct StateUpdate { pub vel: Vel, pub ori: Ori, pub energy: Energy, + pub loadout: Loadout, pub local_events: VecDeque, pub server_events: VecDeque, } +impl From<&JoinData<'_>> for StateUpdate { + fn from(data: &JoinData) -> Self { + StateUpdate { + pos: *data.pos, + vel: *data.vel, + ori: *data.ori, + energy: *data.energy, + loadout: data.loadout.clone(), + character: data.character.clone(), + local_events: VecDeque::new(), + server_events: VecDeque::new(), + } + } +} #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub enum CharacterState { Idle, diff --git a/common/src/states/basic_block.rs b/common/src/states/basic_block.rs index 7b95b934be..06df786b6d 100644 --- a/common/src/states/basic_block.rs +++ b/common/src/states/basic_block.rs @@ -3,7 +3,6 @@ use crate::{ comp::StateUpdate, sys::character_behavior::{CharacterBehavior, JoinData}, }; -use std::collections::VecDeque; // const BLOCK_ACCEL: f32 = 30.0; // const BLOCK_SPEED: f32 = 75.0; @@ -13,15 +12,7 @@ pub struct Data; impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - character: data.character.clone(), - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); handle_move(&data, &mut update); diff --git a/common/src/states/basic_melee.rs b/common/src/states/basic_melee.rs index 0c1a8d3ea1..e006a6b2da 100644 --- a/common/src/states/basic_melee.rs +++ b/common/src/states/basic_melee.rs @@ -3,7 +3,7 @@ use crate::{ states::utils::*, sys::character_behavior::*, }; -use std::{collections::VecDeque, time::Duration}; +use std::time::Duration; #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)] pub struct Data { @@ -19,15 +19,7 @@ pub struct Data { impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - character: data.character.clone(), - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); handle_move(data, &mut update); diff --git a/common/src/states/basic_ranged.rs b/common/src/states/basic_ranged.rs index f2b9f3c73a..0fb2c699ca 100644 --- a/common/src/states/basic_ranged.rs +++ b/common/src/states/basic_ranged.rs @@ -4,7 +4,7 @@ use crate::{ states::utils::*, sys::character_behavior::*, }; -use std::{collections::VecDeque, time::Duration}; +use std::time::Duration; #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Data { @@ -22,15 +22,7 @@ pub struct Data { impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - character: data.character.clone(), - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); handle_move(data, &mut update); handle_jump(data, &mut update); diff --git a/common/src/states/boost.rs b/common/src/states/boost.rs index 5f0f855557..c4b547eb17 100644 --- a/common/src/states/boost.rs +++ b/common/src/states/boost.rs @@ -3,7 +3,7 @@ use crate::{ states::utils::*, sys::character_behavior::*, }; -use std::{collections::VecDeque, time::Duration}; +use std::time::Duration; #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Data { @@ -14,15 +14,7 @@ pub struct Data { impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - character: data.character.clone(), - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); handle_move(data, &mut update); diff --git a/common/src/states/climb.rs b/common/src/states/climb.rs index 314086ef6f..c98a26dbfc 100644 --- a/common/src/states/climb.rs +++ b/common/src/states/climb.rs @@ -7,7 +7,6 @@ use crate::{ }, util::safe_slerp, }; -use std::collections::VecDeque; use vek::{ vec::{Vec2, Vec3}, Lerp, @@ -21,15 +20,7 @@ pub struct Data; impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - character: data.character.clone(), - energy: *data.energy, - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); if let Err(_) = update.energy.try_change_by(-5, EnergySource::Climb) { update.character = CharacterState::Idle {}; diff --git a/common/src/states/dash_melee.rs b/common/src/states/dash_melee.rs index 7b1cdfd51a..2fbc2016e1 100644 --- a/common/src/states/dash_melee.rs +++ b/common/src/states/dash_melee.rs @@ -3,7 +3,7 @@ use crate::{ sys::character_behavior::*, util::safe_slerp, }; -use std::{collections::VecDeque, time::Duration}; +use std::time::Duration; use vek::Vec3; const DASH_SPEED: f32 = 19.0; @@ -23,15 +23,7 @@ pub struct Data { impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - character: data.character.clone(), - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); if self.initialize { update.vel.0 = data.inputs.look_dir * 20.0; diff --git a/common/src/states/equipping.rs b/common/src/states/equipping.rs index 66506e39c8..6f8e16b54b 100644 --- a/common/src/states/equipping.rs +++ b/common/src/states/equipping.rs @@ -3,7 +3,7 @@ use crate::{ comp::{CharacterState, StateUpdate}, sys::character_behavior::{CharacterBehavior, JoinData}, }; -use std::{collections::VecDeque, time::Duration}; +use std::time::Duration; #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)] pub struct Data { @@ -13,15 +13,7 @@ pub struct Data { impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - character: data.character.clone(), - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); handle_move(&data, &mut update); handle_jump(&data, &mut update); diff --git a/common/src/states/glide.rs b/common/src/states/glide.rs index 3f947399cc..01d3771dfa 100644 --- a/common/src/states/glide.rs +++ b/common/src/states/glide.rs @@ -3,7 +3,6 @@ use crate::{ sys::character_behavior::{CharacterBehavior, JoinData}, util::safe_slerp, }; -use std::collections::VecDeque; use vek::Vec2; // Gravity is 9.81 * 4, so this makes gravity equal to .15 @@ -16,15 +15,7 @@ pub struct Data; impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - character: data.character.clone(), - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); // If glide button isn't held or player is on ground, end glide if !data.inputs.glide.is_pressed() || data.physics.on_ground { diff --git a/common/src/states/idle.rs b/common/src/states/idle.rs index 76be0b8f67..17b07ebc5a 100644 --- a/common/src/states/idle.rs +++ b/common/src/states/idle.rs @@ -3,21 +3,12 @@ use crate::{ comp::StateUpdate, sys::character_behavior::{CharacterBehavior, JoinData}, }; -use std::collections::VecDeque; pub struct Data; impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - character: data.character.clone(), - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); handle_move(data, &mut update); handle_jump(data, &mut update); diff --git a/common/src/states/roll.rs b/common/src/states/roll.rs index e09405c8e1..6eed23d488 100644 --- a/common/src/states/roll.rs +++ b/common/src/states/roll.rs @@ -3,7 +3,7 @@ use crate::{ sys::character_behavior::{CharacterBehavior, JoinData}, util::safe_slerp, }; -use std::{collections::VecDeque, time::Duration}; +use std::time::Duration; use vek::Vec3; const ROLL_SPEED: f32 = 17.0; @@ -15,15 +15,7 @@ pub struct Data { impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - character: data.character.clone(), - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); // Update velocity update.vel.0 = Vec3::new(0.0, 0.0, update.vel.0.z) diff --git a/common/src/states/sit.rs b/common/src/states/sit.rs index 487206094a..576a05fb88 100644 --- a/common/src/states/sit.rs +++ b/common/src/states/sit.rs @@ -3,22 +3,13 @@ use crate::{ comp::{CharacterState, StateUpdate}, sys::character_behavior::{CharacterBehavior, JoinData}, }; -use std::collections::VecDeque; #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)] pub struct Data; impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - character: data.character.clone(), - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); handle_wield(data, &mut update); diff --git a/common/src/states/timed_combo.rs b/common/src/states/timed_combo.rs index 56be959851..0883f9c77a 100644 --- a/common/src/states/timed_combo.rs +++ b/common/src/states/timed_combo.rs @@ -2,7 +2,7 @@ use crate::{ comp::{Attacking, CharacterState, EnergySource, StateUpdate}, sys::character_behavior::{CharacterBehavior, JoinData}, }; -use std::{collections::VecDeque, time::Duration}; +use std::time::Duration; #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)] pub struct Data { /// Denotes what stage (of 3) the attack is in @@ -21,15 +21,7 @@ pub struct Data { impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - character: data.character.clone(), - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); let new_stage_time_active = self .stage_time_active diff --git a/common/src/states/triple_strike.rs b/common/src/states/triple_strike.rs index ee312a7384..d8197f29ab 100644 --- a/common/src/states/triple_strike.rs +++ b/common/src/states/triple_strike.rs @@ -3,7 +3,7 @@ use crate::{ states::utils::*, sys::character_behavior::{CharacterBehavior, JoinData}, }; -use std::{collections::VecDeque, time::Duration}; +use std::time::Duration; use vek::vec::Vec2; // In millis @@ -34,15 +34,7 @@ pub struct Data { impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - character: data.character.clone(), - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update= StateUpdate::from(data); let stage_time_active = self .stage_time_active diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 9e7db75345..ba828a3cba 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -138,6 +138,18 @@ pub fn handle_unwield(data: &JoinData, update: &mut StateUpdate) { } } +/// Checks that player can Swap Weapons and updates `Loadout` if so +pub fn handle_swap_loadout(data: &JoinData, update: &mut StateUpdate) { + if let CharacterState::Wielding { .. } = update.character { + if data.inputs.swap_loadout.is_just_pressed() { + let mut new_loadout = data.loadout.clone(); + new_loadout.active_item = data.loadout.second_item.clone(); + new_loadout.second_item = data.loadout.active_item.clone(); + update.loadout = new_loadout; + } + } +} + /// Checks that player can glide and updates `CharacterState` if so pub fn handle_glide(data: &JoinData, update: &mut StateUpdate) { if let CharacterState::Idle { .. } | CharacterState::Wielding { .. } = update.character { diff --git a/common/src/states/wielding.rs b/common/src/states/wielding.rs index 07f5ba358c..7b0b008a5e 100644 --- a/common/src/states/wielding.rs +++ b/common/src/states/wielding.rs @@ -3,21 +3,12 @@ use crate::{ comp::StateUpdate, sys::character_behavior::{CharacterBehavior, JoinData}, }; -use std::collections::VecDeque; pub struct Data; impl CharacterBehavior for Data { fn behavior(&self, data: &JoinData) -> StateUpdate { - let mut update = StateUpdate { - character: data.character.clone(), - pos: *data.pos, - vel: *data.vel, - ori: *data.ori, - energy: *data.energy, - local_events: VecDeque::new(), - server_events: VecDeque::new(), - }; + let mut update = StateUpdate::from(data); handle_move(&data, &mut update); handle_jump(&data, &mut update); @@ -25,6 +16,7 @@ impl CharacterBehavior for Data { handle_climb(&data, &mut update); handle_glide(&data, &mut update); handle_unwield(&data, &mut update); + handle_swap_loadout(&data, &mut update); handle_primary_input(&data, &mut update); handle_secondary_input(&data, &mut update); handle_dodge_input(&data, &mut update); diff --git a/common/src/sys/character_behavior.rs b/common/src/sys/character_behavior.rs index d51cb719a7..0edf904f4c 100644 --- a/common/src/sys/character_behavior.rs +++ b/common/src/sys/character_behavior.rs @@ -31,9 +31,9 @@ pub struct JoinData<'a> { pub inputs: &'a ControllerInputs, pub stats: &'a Stats, pub energy: &'a Energy, + pub loadout: &'a Loadout, pub body: &'a Body, pub physics: &'a PhysicsState, - pub loadout: &'a Loadout, pub attacking: Option<&'a Attacking>, pub updater: &'a LazyUpdate, } @@ -46,11 +46,11 @@ pub type JoinTuple<'a> = ( &'a mut Vel, &'a mut Ori, &'a mut Energy, + &'a mut Loadout, &'a Controller, &'a Stats, &'a Body, &'a PhysicsState, - &'a Loadout, Option<&'a Attacking>, ); @@ -64,12 +64,12 @@ impl<'a> JoinData<'a> { vel: j.4, ori: j.5, energy: j.6, - controller: j.7, - inputs: &j.7.inputs, - stats: j.8, - body: j.9, - physics: j.10, - loadout: j.11, + loadout: j.7, + controller: j.8, + inputs: &j.8.inputs, + stats: j.9, + body: j.10, + physics: j.11, attacking: j.12, updater, dt, @@ -98,11 +98,11 @@ impl<'a> System<'a> for Sys { WriteStorage<'a, Vel>, WriteStorage<'a, Ori>, WriteStorage<'a, Energy>, + WriteStorage<'a, Loadout>, ReadStorage<'a, Controller>, ReadStorage<'a, Stats>, ReadStorage<'a, Body>, ReadStorage<'a, PhysicsState>, - ReadStorage<'a, Loadout>, ReadStorage<'a, Attacking>, ReadStorage<'a, Uid>, ReadStorage<'a, Mounting>, @@ -122,11 +122,11 @@ impl<'a> System<'a> for Sys { mut velocities, mut orientations, mut energies, + mut loadouts, controllers, stats, bodies, physics_states, - loadouts, attacking_storage, uids, mountings, @@ -140,11 +140,11 @@ impl<'a> System<'a> for Sys { &mut velocities, &mut orientations, &mut energies, + &mut loadouts, &controllers, &stats, &bodies, &physics_states, - &loadouts, attacking_storage.maybe(), ) .join(); @@ -204,6 +204,7 @@ impl<'a> System<'a> for Sys { *tuple.4 = state_update.vel; *tuple.5 = state_update.ori; *tuple.6 = state_update.energy; + *tuple.7 = state_update.loadout; local_bus.emitter().append(&mut state_update.local_events); server_bus.emitter().append(&mut state_update.server_events); } diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index f0e4be378d..db427d26f5 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -323,21 +323,8 @@ impl PlayState for SessionState { self.inputs.toggle_wield.set_state(state); }, Event::InputUpdate(GameInput::SwapLoadout, state) => { - let mut client = self.client.borrow_mut(); - let entity = client.entity(); - let loadout = client - .state() - .read_storage::() - .get(entity) - .cloned(); - - if let Some(loadout) = loadout { - let mut new_loadout = loadout.clone(); - new_loadout.second_item = loadout.active_item; - new_loadout.active_item = loadout.second_item; - - client.state_mut().write_component(entity, new_loadout); - } + println!("{:?}", state); + self.inputs.swap_loadout.set_state(state); }, Event::InputUpdate(GameInput::Mount, true) => { let mut client = self.client.borrow_mut(); diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index d802c3dddd..86dccca346 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -101,7 +101,7 @@ impl Default for ControlSettings { respawn: KeyMouse::Key(VirtualKeyCode::Space), interact: KeyMouse::Mouse(MouseButton::Right), toggle_wield: KeyMouse::Key(VirtualKeyCode::T), - swap_loadout: KeyMouse::Key(VirtualKeyCode::LAlt), + swap_loadout: KeyMouse::Key(VirtualKeyCode::Q), charge: KeyMouse::Key(VirtualKeyCode::Key1), } }