diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron index ca53f57f08..d6964cff60 100644 --- a/assets/voxygen/audio/sfx.ron +++ b/assets/voxygen/audio/sfx.ron @@ -259,19 +259,26 @@ files: [ "voxygen.audio.sfx.character.glider_open", ], - threshold: 0.5, + threshold: 0.1, ), - //Glide: ( - // files: [ - // // Event Missing or not implemented? - // ], - // threshold: 0.5, - //), GliderClose: ( files: [ "voxygen.audio.sfx.character.glider_close", ], - threshold: 0.5, + threshold: 0.1, + ), + Glide: ( + files: [ + "voxygen.audio.sfx.character.catch_air_1", + "voxygen.audio.sfx.character.catch_air_2", + "voxygen.audio.sfx.character.catch_air_3", + "voxygen.audio.sfx.character.catch_air_4", + "voxygen.audio.sfx.character.catch_air_5", + "voxygen.audio.sfx.character.catch_air_6", + "voxygen.audio.sfx.character.catch_air_7", + "voxygen.audio.sfx.character.catch_air_8", + ], + threshold: 0.85, ), // diff --git a/assets/voxygen/audio/sfx/character/catch_air_1.ogg b/assets/voxygen/audio/sfx/character/catch_air_1.ogg new file mode 100644 index 0000000000..f801bf40aa --- /dev/null +++ b/assets/voxygen/audio/sfx/character/catch_air_1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31eec6cbcead67adce6f6f455a90cf747594ab2219d8941939f9909bace635ac +size 22142 diff --git a/assets/voxygen/audio/sfx/character/catch_air_2.ogg b/assets/voxygen/audio/sfx/character/catch_air_2.ogg new file mode 100644 index 0000000000..15ce21928a --- /dev/null +++ b/assets/voxygen/audio/sfx/character/catch_air_2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:524e15e8c36c65a727fb93271a94ae478a3e7952f4a2cdf3c677a296bf00f78a +size 24212 diff --git a/assets/voxygen/audio/sfx/character/catch_air_3.ogg b/assets/voxygen/audio/sfx/character/catch_air_3.ogg new file mode 100644 index 0000000000..8c310f269e --- /dev/null +++ b/assets/voxygen/audio/sfx/character/catch_air_3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3f203a6a9d7498330ed8308a003b69bb1914030b578123bf68d8a4c65f5a9bb +size 29923 diff --git a/assets/voxygen/audio/sfx/character/catch_air_4.ogg b/assets/voxygen/audio/sfx/character/catch_air_4.ogg new file mode 100644 index 0000000000..6854f09f33 --- /dev/null +++ b/assets/voxygen/audio/sfx/character/catch_air_4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb3177b9d9d5a5074775f8e109b8d6fa44748a03b49d49a650a9958f7a489e1d +size 24339 diff --git a/assets/voxygen/audio/sfx/character/catch_air_5.ogg b/assets/voxygen/audio/sfx/character/catch_air_5.ogg new file mode 100644 index 0000000000..3056ed0b4f --- /dev/null +++ b/assets/voxygen/audio/sfx/character/catch_air_5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c34cd5ee26f3a18ba35597447572be59435767dae6d00bdd60dfb880ca4f133 +size 26011 diff --git a/assets/voxygen/audio/sfx/character/catch_air_6.ogg b/assets/voxygen/audio/sfx/character/catch_air_6.ogg new file mode 100644 index 0000000000..b3fca782f6 --- /dev/null +++ b/assets/voxygen/audio/sfx/character/catch_air_6.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b297bbdd99df0b1a94f8b64c68e20642a0de00a6ead42cc36a205f23be578a63 +size 23144 diff --git a/assets/voxygen/audio/sfx/character/catch_air_7.ogg b/assets/voxygen/audio/sfx/character/catch_air_7.ogg new file mode 100644 index 0000000000..aba822ec0d --- /dev/null +++ b/assets/voxygen/audio/sfx/character/catch_air_7.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42c6220e384f6d4399f59e9d83fb5a73f6bf405c2bcb2f1b63f9f0bdf820a1c1 +size 21422 diff --git a/assets/voxygen/audio/sfx/character/catch_air_8.ogg b/assets/voxygen/audio/sfx/character/catch_air_8.ogg new file mode 100644 index 0000000000..e4ea4e23ee --- /dev/null +++ b/assets/voxygen/audio/sfx/character/catch_air_8.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01ad2747a741f13904343152c950f1aac1ee417df0c33a49ce8122452282bb42 +size 22312 diff --git a/assets/voxygen/audio/sfx/footsteps/water_splash_1.ogg b/assets/voxygen/audio/sfx/footsteps/water_splash_1.ogg index ba2ec8f00e..97fa36235f 100644 --- a/assets/voxygen/audio/sfx/footsteps/water_splash_1.ogg +++ b/assets/voxygen/audio/sfx/footsteps/water_splash_1.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bab5d822ef669790e531a453551acb92f82623c0e10e46480d00e70630fc7c61 -size 20086 +oid sha256:a8084fa0264e21ecc34e50420de1050ac4d554f4ad199085cf7da5942f4e31b7 +size 17654 diff --git a/assets/voxygen/audio/sfx/footsteps/water_splash_2.ogg b/assets/voxygen/audio/sfx/footsteps/water_splash_2.ogg index ae03f24bc6..324a4d10f1 100644 --- a/assets/voxygen/audio/sfx/footsteps/water_splash_2.ogg +++ b/assets/voxygen/audio/sfx/footsteps/water_splash_2.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06f4d71243b06105794b67b32f74dd3d7b95a558f075dc722eb30852a64f2536 -size 23947 +oid sha256:012f1467f032f2d0738a33788cb70669c588c2ab7ced8fd2439ca1f28d50febd +size 16164 diff --git a/assets/voxygen/audio/sfx/footsteps/water_splash_3.ogg b/assets/voxygen/audio/sfx/footsteps/water_splash_3.ogg index de6bd55237..12ff0e630b 100644 --- a/assets/voxygen/audio/sfx/footsteps/water_splash_3.ogg +++ b/assets/voxygen/audio/sfx/footsteps/water_splash_3.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f0f5fa67424893403bb7543fa7b56add91d1701cbac43d5bfe6de5a6cd8ffcf9 -size 16378 +oid sha256:c682db0e7b367769a0926b81ae3ed39a1f092cb20fcfc3a72345d2b34a179a11 +size 15244 diff --git a/assets/voxygen/audio/sfx/footsteps/water_splash_4.ogg b/assets/voxygen/audio/sfx/footsteps/water_splash_4.ogg index 02639003ee..d7f11dbf79 100644 --- a/assets/voxygen/audio/sfx/footsteps/water_splash_4.ogg +++ b/assets/voxygen/audio/sfx/footsteps/water_splash_4.ogg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f24f666b44b86376d7f1dd433f811587c1b44c83ff6ffb125fcf63e84468dc76 -size 16794 +oid sha256:8211ff922d7f75cb44a7c4e1472dab16ce52c8d2b3c81fa54976240a40f1c036 +size 13963 diff --git a/common/src/outcome.rs b/common/src/outcome.rs index b8974ff327..f702c80905 100644 --- a/common/src/outcome.rs +++ b/common/src/outcome.rs @@ -81,6 +81,10 @@ pub enum Outcome { body: comp::Body, kind: UtteranceKind, }, + Glider { + pos: Vec3, + wielded: bool, + }, } impl Outcome { @@ -97,7 +101,8 @@ impl Outcome { | Outcome::Block { pos, .. } | Outcome::PoiseChange { pos, .. } | Outcome::GroundSlam { pos } - | Outcome::Utterance { pos, .. } => Some(*pos), + | Outcome::Utterance { pos, .. } + | Outcome::Glider { pos, .. } => Some(*pos), Outcome::BreakBlock { pos, .. } => Some(pos.map(|e| e as f32 + 0.5)), Outcome::ExpChange { .. } | Outcome::ComboChange { .. } => None, } diff --git a/common/src/states/glide.rs b/common/src/states/glide.rs index 5641c66a2e..35ecfd3ffd 100644 --- a/common/src/states/glide.rs +++ b/common/src/states/glide.rs @@ -4,6 +4,8 @@ use crate::{ character_state::OutputEvents, fluid_dynamics::angle_of_attack, inventory::slot::EquipSlot, CharacterState, Ori, StateUpdate, Vel, }, + event::LocalEvent, + outcome::Outcome, states::{ behavior::{CharacterBehavior, JoinData}, glide_wield, idle, @@ -199,8 +201,12 @@ impl CharacterBehavior for Data { update } - fn unwield(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate { + fn unwield(&self, data: &JoinData, output_events: &mut OutputEvents) -> StateUpdate { let mut update = StateUpdate::from(data); + output_events.emit_local(LocalEvent::CreateOutcome(Outcome::Glider { + pos: data.pos.0, + wielded: false, + })); update.character = CharacterState::Idle(idle::Data { is_sneaking: false }); update } diff --git a/common/src/states/glide_wield.rs b/common/src/states/glide_wield.rs index 1fbc49278e..50261ecae5 100644 --- a/common/src/states/glide_wield.rs +++ b/common/src/states/glide_wield.rs @@ -4,6 +4,8 @@ use crate::{ character_state::OutputEvents, slot::EquipSlot, CharacterState, InventoryAction, Ori, StateUpdate, }, + event::LocalEvent, + outcome::Outcome, states::{ behavior::{CharacterBehavior, JoinData}, glide, idle, @@ -90,8 +92,12 @@ impl CharacterBehavior for Data { update } - fn unwield(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate { + fn unwield(&self, data: &JoinData, output_events: &mut OutputEvents) -> StateUpdate { let mut update = StateUpdate::from(data); + output_events.emit_local(LocalEvent::CreateOutcome(Outcome::Glider { + pos: data.pos.0, + wielded: false, + })); update.character = CharacterState::Idle(idle::Data { is_sneaking: false }); update } diff --git a/common/src/states/idle.rs b/common/src/states/idle.rs index fe6c7ec3c4..207f544264 100644 --- a/common/src/states/idle.rs +++ b/common/src/states/idle.rs @@ -55,9 +55,9 @@ impl CharacterBehavior for Data { update } - fn glide_wield(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate { + fn glide_wield(&self, data: &JoinData, output_events: &mut OutputEvents) -> StateUpdate { let mut update = StateUpdate::from(data); - attempt_glide_wield(data, &mut update); + attempt_glide_wield(data, &mut update, output_events); update } diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 01931f1a6e..1f991ebb2b 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -13,6 +13,7 @@ use crate::{ }, consts::{FRIC_GROUND, GRAVITY, MAX_PICKUP_RANGE}, event::{LocalEvent, ServerEvent}, + outcome::Outcome, states::{behavior::JoinData, *}, util::Dir, vol::ReadVol, @@ -837,7 +838,11 @@ pub fn handle_manipulate_loadout( } /// Checks that player can wield the glider and updates `CharacterState` if so -pub fn attempt_glide_wield(data: &JoinData<'_>, update: &mut StateUpdate) { +pub fn attempt_glide_wield( + data: &JoinData<'_>, + update: &mut StateUpdate, + output_events: &mut OutputEvents, +) { if data .inventory .and_then(|inv| inv.equipped(EquipSlot::Glider)) @@ -849,6 +854,10 @@ pub fn attempt_glide_wield(data: &JoinData<'_>, update: &mut StateUpdate) { .unwrap_or(false) && data.body.is_humanoid() { + output_events.emit_local(LocalEvent::CreateOutcome(Outcome::Glider { + pos: data.pos.0, + wielded: true, + })); update.character = CharacterState::GlideWield(glide_wield::Data::from(data)); } } diff --git a/common/src/states/wielding.rs b/common/src/states/wielding.rs index c49471bcaa..c750cfe42b 100644 --- a/common/src/states/wielding.rs +++ b/common/src/states/wielding.rs @@ -66,9 +66,9 @@ impl CharacterBehavior for Data { update } - fn glide_wield(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate { + fn glide_wield(&self, data: &JoinData, output_events: &mut OutputEvents) -> StateUpdate { let mut update = StateUpdate::from(data); - attempt_glide_wield(data, &mut update); + attempt_glide_wield(data, &mut update, output_events); update } diff --git a/voxygen/src/audio/sfx/event_mapper/movement/mod.rs b/voxygen/src/audio/sfx/event_mapper/movement/mod.rs index 8f573f1296..539f1e9a70 100644 --- a/voxygen/src/audio/sfx/event_mapper/movement/mod.rs +++ b/voxygen/src/audio/sfx/event_mapper/movement/mod.rs @@ -179,7 +179,7 @@ impl MovementEventMapper { } } - /// Voxygen has an existing list of character states however that list does + /// Voxygen has an existing list of character states; however that list does /// not provide enough resolution to target specific entity events, such /// as opening or closing the glider. These methods translate those /// entity states with some additional data into more specific @@ -220,14 +220,7 @@ impl MovementEventMapper { // Match all other Movemement and Action states match (previous_state.event.clone(), character_state) { (_, CharacterState::Climb { .. }) => SfxEvent::Climb, - (SfxEvent::Glide, CharacterState::Idle { .. }) => SfxEvent::GliderClose, - (previous_event, CharacterState::Glide { .. }) => { - if previous_event != SfxEvent::GliderOpen && previous_event != SfxEvent::Glide { - SfxEvent::GliderOpen - } else { - SfxEvent::Glide - } - }, + (_, CharacterState::Glide { .. }) => SfxEvent::Glide, _ => SfxEvent::Idle, } } diff --git a/voxygen/src/audio/sfx/event_mapper/movement/tests.rs b/voxygen/src/audio/sfx/event_mapper/movement/tests.rs index 8a31168fc9..1a393dcef0 100644 --- a/voxygen/src/audio/sfx/event_mapper/movement/tests.rs +++ b/voxygen/src/audio/sfx/event_mapper/movement/tests.rs @@ -233,25 +233,6 @@ fn maps_land_on_ground_to_run() { assert_eq!(result, SfxEvent::Run(BlockKind::Grass)); } -#[test] -fn maps_glider_open() { - let result = MovementEventMapper::map_movement_event( - &CharacterState::Glide(states::glide::Data::new(10.0, 1.0, Ori::default())), - &Default::default(), - &PreviousEntityState { - event: SfxEvent::Jump, - time: Instant::now(), - on_ground: false, - in_water: false, - distance_travelled: 0.0, - }, - Vec3::zero(), - BlockKind::Grass, - ); - - assert_eq!(result, SfxEvent::GliderOpen); -} - #[test] fn maps_glide() { let result = MovementEventMapper::map_movement_event( @@ -271,48 +252,6 @@ fn maps_glide() { assert_eq!(result, SfxEvent::Glide); } -#[test] -fn maps_glider_close_when_closing_mid_flight() { - let result = MovementEventMapper::map_movement_event( - &CharacterState::Idle(common::states::idle::Data { is_sneaking: false }), - &Default::default(), - &PreviousEntityState { - event: SfxEvent::Glide, - time: Instant::now(), - on_ground: false, - in_water: false, - distance_travelled: 0.0, - }, - Vec3::zero(), - BlockKind::Grass, - ); - - assert_eq!(result, SfxEvent::GliderClose); -} - -#[test] -#[ignore] -fn maps_glider_close_when_landing() { - let result = MovementEventMapper::map_movement_event( - &CharacterState::Idle(common::states::idle::Data { is_sneaking: false }), - &PhysicsState { - on_ground: Some(Block::empty()), - ..Default::default() - }, - &PreviousEntityState { - event: SfxEvent::Glide, - time: Instant::now(), - on_ground: false, - in_water: false, - distance_travelled: 0.0, - }, - Vec3::zero(), - BlockKind::Grass, - ); - - assert_eq!(result, SfxEvent::GliderClose); -} - #[test] fn maps_quadrupeds_running() { let result = MovementEventMapper::map_non_humanoid_movement_event( diff --git a/voxygen/src/audio/sfx/mod.rs b/voxygen/src/audio/sfx/mod.rs index 25bdcde277..9e2d238c8e 100644 --- a/voxygen/src/audio/sfx/mod.rs +++ b/voxygen/src/audio/sfx/mod.rs @@ -161,6 +161,7 @@ pub enum SfxEvent { GliderOpen, Glide, GliderClose, + CatchAir, Jump, Fall, ExperienceGained, @@ -569,6 +570,15 @@ impl SfxMgr { Outcome::ExpChange { .. } | Outcome::ComboChange { .. } | Outcome::SummonedCreature { .. } => {}, + Outcome::Glider { pos, wielded } => { + if *wielded { + let sfx_trigger_item = triggers.get_key_value(&SfxEvent::GliderOpen); + audio.emit_sfx(sfx_trigger_item, *pos, Some(1.0), false); + } else { + let sfx_trigger_item = triggers.get_key_value(&SfxEvent::GliderClose); + audio.emit_sfx(sfx_trigger_item, *pos, Some(1.0), false); + } + }, } } diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs index 44e52f0326..4843f7b791 100644 --- a/voxygen/src/scene/particle.rs +++ b/voxygen/src/scene/particle.rs @@ -265,7 +265,8 @@ impl ParticleMgr { | Outcome::ComboChange { .. } | Outcome::Damage { .. } | Outcome::PoiseChange { .. } - | Outcome::Utterance { .. } => {}, + | Outcome::Utterance { .. } + | Outcome::Glider { .. } => {}, } }