mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Chasing sounds
This commit is contained in:
parent
a9229e3625
commit
559311e1b0
@ -831,5 +831,11 @@
|
|||||||
],
|
],
|
||||||
threshold: 0.2,
|
threshold: 0.2,
|
||||||
),
|
),
|
||||||
|
Utterance(Angry, BipedLarge((species: Wendigo, body_type: Female))): (
|
||||||
|
files: [
|
||||||
|
"voxygen.audio.sfx.utterance.wendigo_angry",
|
||||||
|
],
|
||||||
|
threshold: 4.0,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
BIN
assets/voxygen/audio/sfx/utterance/ogre_angry.ogg
(Stored with Git LFS)
Normal file
BIN
assets/voxygen/audio/sfx/utterance/ogre_angry.ogg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/voxygen/audio/sfx/utterance/ogre_angry2.ogg
(Stored with Git LFS)
Normal file
BIN
assets/voxygen/audio/sfx/utterance/ogre_angry2.ogg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/voxygen/audio/sfx/utterance/ogre_angry3.ogg
(Stored with Git LFS)
Normal file
BIN
assets/voxygen/audio/sfx/utterance/ogre_angry3.ogg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/voxygen/audio/sfx/utterance/wendigo_angry.mp3
Normal file
BIN
assets/voxygen/audio/sfx/utterance/wendigo_angry.mp3
Normal file
Binary file not shown.
BIN
assets/voxygen/audio/sfx/utterance/wendigo_angry.ogg
(Stored with Git LFS)
Normal file
BIN
assets/voxygen/audio/sfx/utterance/wendigo_angry.ogg
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -1,5 +1,5 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
comp::{humanoid, quadruped_low, quadruped_medium, quadruped_small, ship, Body},
|
comp::{humanoid, quadruped_low, quadruped_medium, quadruped_small, ship, Body, UtteranceKind},
|
||||||
path::Chaser,
|
path::Chaser,
|
||||||
rtsim::RtSimController,
|
rtsim::RtSimController,
|
||||||
trade::{PendingTrade, ReducedInventory, SiteId, SitePrices, TradeId, TradeResult},
|
trade::{PendingTrade, ReducedInventory, SiteId, SitePrices, TradeId, TradeResult},
|
||||||
@ -297,6 +297,7 @@ pub enum SoundKind {
|
|||||||
Explosion,
|
Explosion,
|
||||||
Beam,
|
Beam,
|
||||||
Shockwave,
|
Shockwave,
|
||||||
|
Utterance(UtteranceKind, Body),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
@ -96,6 +96,13 @@ pub enum GroupManip {
|
|||||||
AssignLeader(Uid),
|
AssignLeader(Uid),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
||||||
|
pub enum UtteranceKind {
|
||||||
|
Calm,
|
||||||
|
Angry,
|
||||||
|
Surprised,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||||
pub enum ControlEvent {
|
pub enum ControlEvent {
|
||||||
//ToggleLantern,
|
//ToggleLantern,
|
||||||
@ -111,6 +118,7 @@ pub enum ControlEvent {
|
|||||||
GroupManip(GroupManip),
|
GroupManip(GroupManip),
|
||||||
RemoveBuff(BuffKind),
|
RemoveBuff(BuffKind),
|
||||||
Respawn,
|
Respawn,
|
||||||
|
Utterance(UtteranceKind),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
|
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
@ -67,7 +67,7 @@ pub use self::{
|
|||||||
combo::Combo,
|
combo::Combo,
|
||||||
controller::{
|
controller::{
|
||||||
Climb, ControlAction, ControlEvent, Controller, ControllerInputs, GroupManip, InputAttr,
|
Climb, ControlAction, ControlEvent, Controller, ControllerInputs, GroupManip, InputAttr,
|
||||||
InputKind, InventoryAction, InventoryEvent, InventoryManip, MountState, Mounting,
|
InputKind, InventoryAction, InventoryEvent, InventoryManip, MountState, Mounting, UtteranceKind,
|
||||||
},
|
},
|
||||||
energy::{Energy, EnergyChange, EnergySource},
|
energy::{Energy, EnergyChange, EnergySource},
|
||||||
fluid_dynamics::Fluid,
|
fluid_dynamics::Fluid,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use crate::{comp, uid::Uid};
|
use crate::{comp, uid::Uid};
|
||||||
use comp::{beam, item::Reagent, poise::PoiseState, skills::SkillGroupKind};
|
use comp::{beam, item::Reagent, poise::PoiseState, skills::SkillGroupKind, UtteranceKind};
|
||||||
use hashbrown::HashSet;
|
use hashbrown::HashSet;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use vek::*;
|
use vek::*;
|
||||||
@ -73,6 +73,11 @@ pub enum Outcome {
|
|||||||
GroundSlam {
|
GroundSlam {
|
||||||
pos: Vec3<f32>,
|
pos: Vec3<f32>,
|
||||||
},
|
},
|
||||||
|
Utterance {
|
||||||
|
pos: Vec3<f32>,
|
||||||
|
body: comp::Body,
|
||||||
|
kind: UtteranceKind,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Outcome {
|
impl Outcome {
|
||||||
@ -87,7 +92,8 @@ impl Outcome {
|
|||||||
| Outcome::Damage { pos, .. }
|
| Outcome::Damage { pos, .. }
|
||||||
| Outcome::Block { pos, .. }
|
| Outcome::Block { pos, .. }
|
||||||
| Outcome::PoiseChange { pos, .. }
|
| Outcome::PoiseChange { pos, .. }
|
||||||
| Outcome::GroundSlam { pos } => Some(*pos),
|
| Outcome::GroundSlam { pos }
|
||||||
|
| Outcome::Utterance { pos, .. } => Some(*pos),
|
||||||
Outcome::BreakBlock { pos, .. } => Some(pos.map(|e| e as f32 + 0.5)),
|
Outcome::BreakBlock { pos, .. } => Some(pos.map(|e| e as f32 + 0.5)),
|
||||||
Outcome::ExpChange { .. } | Outcome::ComboChange { .. } => None,
|
Outcome::ExpChange { .. } | Outcome::ComboChange { .. } => None,
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use common::{
|
use common::{
|
||||||
comp::{BuffChange, ControlEvent, Controller},
|
comp::{BuffChange, ControlEvent, Controller, Pos, Body, agent::{Sound, SoundKind}},
|
||||||
event::{EventBus, ServerEvent},
|
event::{EventBus, ServerEvent},
|
||||||
uid::UidAllocator,
|
uid::UidAllocator,
|
||||||
};
|
};
|
||||||
@ -7,7 +7,7 @@ use common_ecs::{Job, Origin, Phase, System};
|
|||||||
use specs::{
|
use specs::{
|
||||||
saveload::{Marker, MarkerAllocator},
|
saveload::{Marker, MarkerAllocator},
|
||||||
shred::ResourceId,
|
shred::ResourceId,
|
||||||
Entities, Join, Read, SystemData, World, WriteStorage,
|
Entities, Join, Read, SystemData, World, WriteStorage, ReadStorage,
|
||||||
};
|
};
|
||||||
use vek::*;
|
use vek::*;
|
||||||
|
|
||||||
@ -16,6 +16,8 @@ pub struct ReadData<'a> {
|
|||||||
entities: Entities<'a>,
|
entities: Entities<'a>,
|
||||||
uid_allocator: Read<'a, UidAllocator>,
|
uid_allocator: Read<'a, UidAllocator>,
|
||||||
server_bus: Read<'a, EventBus<ServerEvent>>,
|
server_bus: Read<'a, EventBus<ServerEvent>>,
|
||||||
|
positions: ReadStorage<'a, Pos>,
|
||||||
|
bodies: ReadStorage<'a, Body>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
@ -92,6 +94,20 @@ impl<'a> System<'a> for Sys {
|
|||||||
server_emitter.emit(ServerEvent::GroupManip(entity, manip))
|
server_emitter.emit(ServerEvent::GroupManip(entity, manip))
|
||||||
},
|
},
|
||||||
ControlEvent::Respawn => server_emitter.emit(ServerEvent::Respawn(entity)),
|
ControlEvent::Respawn => server_emitter.emit(ServerEvent::Respawn(entity)),
|
||||||
|
ControlEvent::Utterance(kind) => {
|
||||||
|
if let (Some(pos), Some(body)) = (
|
||||||
|
read_data.positions.get(entity),
|
||||||
|
read_data.bodies.get(entity),
|
||||||
|
) {
|
||||||
|
let sound = Sound::new(
|
||||||
|
SoundKind::Utterance(kind, *body),
|
||||||
|
pos.0,
|
||||||
|
8.0, // TODO: Come up with a better way of determining this
|
||||||
|
1.0,
|
||||||
|
);
|
||||||
|
server_emitter.emit(ServerEvent::Sound { sound });
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ use common::{
|
|||||||
assets,
|
assets,
|
||||||
comp::{
|
comp::{
|
||||||
self,
|
self,
|
||||||
agent::{AgentEvent, Sound, MAX_LISTEN_DIST},
|
agent::{AgentEvent, Sound, MAX_LISTEN_DIST, SoundKind},
|
||||||
dialogue::Subject,
|
dialogue::Subject,
|
||||||
inventory::slot::EquipSlot,
|
inventory::slot::EquipSlot,
|
||||||
item,
|
item,
|
||||||
@ -386,6 +386,7 @@ pub fn handle_sound(server: &mut Server, sound: &Sound) {
|
|||||||
let positions = &ecs.read_storage::<comp::Pos>();
|
let positions = &ecs.read_storage::<comp::Pos>();
|
||||||
let agents = &mut ecs.write_storage::<comp::Agent>();
|
let agents = &mut ecs.write_storage::<comp::Agent>();
|
||||||
|
|
||||||
|
// TODO: Reduce the complexity of this problem by using spatial partitioning system
|
||||||
for (agent, agent_pos) in (agents, positions).join() {
|
for (agent, agent_pos) in (agents, positions).join() {
|
||||||
// TODO: Use pathfinding for more dropoff around obstacles
|
// TODO: Use pathfinding for more dropoff around obstacles
|
||||||
let agent_dist_sqrd = agent_pos.0.distance_squared(sound.pos);
|
let agent_dist_sqrd = agent_pos.0.distance_squared(sound.pos);
|
||||||
@ -402,5 +403,19 @@ pub fn handle_sound(server: &mut Server, sound: &Sound) {
|
|||||||
.inbox
|
.inbox
|
||||||
.push_back(AgentEvent::ServerSound(propagated_sound));
|
.push_back(AgentEvent::ServerSound(propagated_sound));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Attempt to turn this sound into an outcome to be received by frontends.
|
||||||
|
if let Some(outcome) = match sound.kind {
|
||||||
|
SoundKind::Utterance(kind, body) => Some(Outcome::Utterance {
|
||||||
|
kind,
|
||||||
|
pos: sound.pos,
|
||||||
|
body,
|
||||||
|
}),
|
||||||
|
_ => None,
|
||||||
|
} {
|
||||||
|
ecs
|
||||||
|
.write_resource::<Vec<Outcome>>()
|
||||||
|
.push(outcome);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ use common::{
|
|||||||
Agent, Alignment, BehaviorCapability, BehaviorState, Body, CharacterAbility,
|
Agent, Alignment, BehaviorCapability, BehaviorState, Body, CharacterAbility,
|
||||||
CharacterState, ControlAction, ControlEvent, Controller, Energy, Health, HealthChange,
|
CharacterState, ControlAction, ControlEvent, Controller, Energy, Health, HealthChange,
|
||||||
InputKind, Inventory, InventoryAction, LightEmitter, MountState, Ori, PhysicsState, Pos,
|
InputKind, Inventory, InventoryAction, LightEmitter, MountState, Ori, PhysicsState, Pos,
|
||||||
Scale, SkillSet, Stats, UnresolvedChatMsg, Vel,
|
Scale, SkillSet, Stats, UnresolvedChatMsg, Vel, UtteranceKind,
|
||||||
},
|
},
|
||||||
consts::GRAVITY,
|
consts::GRAVITY,
|
||||||
effect::{BuffEffect, Effect},
|
effect::{BuffEffect, Effect},
|
||||||
@ -1548,6 +1548,10 @@ impl<'a> AgentData<'a> {
|
|||||||
.min_by_key(|(_, e_pos, _, _, _, _, _)| (e_pos.0.distance_squared(self.pos.0) * 100.0) as i32) // TODO choose target by more than just distance
|
.min_by_key(|(_, e_pos, _, _, _, _, _)| (e_pos.0.distance_squared(self.pos.0) * 100.0) as i32) // TODO choose target by more than just distance
|
||||||
.map(|(e, _, _, _, _, _, _)| e);
|
.map(|(e, _, _, _, _, _, _)| e);
|
||||||
|
|
||||||
|
if agent.target.is_none() && target.is_some() {
|
||||||
|
controller.push_event(ControlEvent::Utterance(UtteranceKind::Angry));
|
||||||
|
}
|
||||||
|
|
||||||
agent.target = target.map(|target| Target {
|
agent.target = target.map(|target| Target {
|
||||||
target,
|
target,
|
||||||
hostile: true,
|
hostile: true,
|
||||||
|
@ -96,6 +96,7 @@ use common::{
|
|||||||
object,
|
object,
|
||||||
poise::PoiseState,
|
poise::PoiseState,
|
||||||
Body, CharacterAbilityType, InventoryUpdateEvent,
|
Body, CharacterAbilityType, InventoryUpdateEvent,
|
||||||
|
UtteranceKind,
|
||||||
},
|
},
|
||||||
outcome::Outcome,
|
outcome::Outcome,
|
||||||
terrain::{BlockKind, TerrainChunk},
|
terrain::{BlockKind, TerrainChunk},
|
||||||
@ -182,6 +183,7 @@ pub enum SfxEvent {
|
|||||||
FlameThrower,
|
FlameThrower,
|
||||||
PoiseChange(PoiseState),
|
PoiseChange(PoiseState),
|
||||||
GroundSlam,
|
GroundSlam,
|
||||||
|
Utterance(UtteranceKind, Body),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Deserialize, Hash, Eq)]
|
#[derive(Clone, Debug, PartialEq, Deserialize, Hash, Eq)]
|
||||||
@ -452,6 +454,10 @@ impl SfxMgr {
|
|||||||
audio.emit_sfx(sfx_trigger_item, *pos, None, false);
|
audio.emit_sfx(sfx_trigger_item, *pos, None, false);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Outcome::Utterance { pos, kind, body } => {
|
||||||
|
let sfx_trigger_item = triggers.get_key_value(&SfxEvent::Utterance(*kind, *body));
|
||||||
|
audio.emit_sfx(sfx_trigger_item, *pos, None, false);
|
||||||
|
},
|
||||||
Outcome::ExpChange { .. }
|
Outcome::ExpChange { .. }
|
||||||
| Outcome::ComboChange { .. }
|
| Outcome::ComboChange { .. }
|
||||||
| Outcome::SummonedCreature { .. } => {},
|
| Outcome::SummonedCreature { .. } => {},
|
||||||
|
@ -248,7 +248,8 @@ impl ParticleMgr {
|
|||||||
| Outcome::SkillPointGain { .. }
|
| Outcome::SkillPointGain { .. }
|
||||||
| Outcome::ComboChange { .. }
|
| Outcome::ComboChange { .. }
|
||||||
| Outcome::Damage { .. }
|
| Outcome::Damage { .. }
|
||||||
| Outcome::PoiseChange { .. } => {},
|
| Outcome::PoiseChange { .. }
|
||||||
|
| Outcome::Utterance { .. } => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user