From 4500b66f28f6de43dcfa9309d164d1ba4b0ebd20 Mon Sep 17 00:00:00 2001 From: Galactic Chimp Date: Sat, 10 Jul 2021 11:20:23 +0200 Subject: [PATCH] #4219 upgraded EmitSoundSystem to use SoundSpecifier --- .../Components/BaseEmitSoundComponent.cs | 14 +++-- Content.Server/Sound/EmitSoundSystem.cs | 56 +++++++------------ .../Entities/Objects/Fun/bike_horn.yml | 3 +- .../Prototypes/Entities/Objects/Fun/skub.yml | 3 +- .../Prototypes/Entities/Objects/Fun/toys.yml | 51 +++++++++++------ 5 files changed, 66 insertions(+), 61 deletions(-) diff --git a/Content.Server/Sound/Components/BaseEmitSoundComponent.cs b/Content.Server/Sound/Components/BaseEmitSoundComponent.cs index dc68cca91f..6b9ee8ff75 100644 --- a/Content.Server/Sound/Components/BaseEmitSoundComponent.cs +++ b/Content.Server/Sound/Components/BaseEmitSoundComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Sound; using Robust.Shared.GameObjects; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; @@ -6,13 +7,16 @@ namespace Content.Server.Sound.Components { /// /// Base sound emitter which defines most of the data fields. - /// Default behavior is to first try to play the sound collection, - /// and if one isn't assigned, then try to play the single sound. + /// Accepts both single sounds and sound collections. /// public abstract class BaseEmitSoundComponent : Component { - [ViewVariables(VVAccess.ReadWrite)] [DataField("sound")] public string? SoundName { get; set; } = default!; - [ViewVariables(VVAccess.ReadWrite)] [DataField("variation")] public float PitchVariation { get; set; } = 0.0f; - [ViewVariables(VVAccess.ReadWrite)] [DataField("soundCollection")] public string? SoundCollectionName { get; set; } = default!; + [ViewVariables(VVAccess.ReadWrite)] + [DataField("sound")] + public SoundSpecifier Sound { get; set; } = default!; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("variation")] + public float PitchVariation { get; set; } = 0.0f; } } diff --git a/Content.Server/Sound/EmitSoundSystem.cs b/Content.Server/Sound/EmitSoundSystem.cs index 0e777cf5a5..af8efc8213 100644 --- a/Content.Server/Sound/EmitSoundSystem.cs +++ b/Content.Server/Sound/EmitSoundSystem.cs @@ -1,68 +1,50 @@ -using Content.Shared.Audio; -using Content.Shared.Interaction; -using Content.Shared.Throwing; using Content.Server.Interaction.Components; using Content.Server.Sound.Components; using Content.Server.Throwing; +using Content.Shared.Audio; +using Content.Shared.Interaction; +using Content.Shared.Throwing; using JetBrains.Annotations; using Robust.Shared.Audio; using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Prototypes; -using Robust.Shared.Player; -using Robust.Shared.Random; using Robust.Shared.Log; +using Robust.Shared.Player; namespace Content.Server.Sound { + /// + /// Will play a sound on various events if the affected entity has a component derived from BaseEmitSoundComponent + /// [UsedImplicitly] public class EmitSoundSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IRobustRandom _random = default!; - /// public override void Initialize() { base.Initialize(); - SubscribeLocalEvent((eUI, comp, arg) => PlaySound(comp)); - SubscribeLocalEvent((eUI, comp, arg) => PlaySound(comp)); - SubscribeLocalEvent((eUI, comp, arg) => PlaySound(comp)); - SubscribeLocalEvent((eUI, comp, args) => PlaySound(comp)); + SubscribeLocalEvent((eUI, comp, arg) => HandleEmitSoundOn(comp)); + SubscribeLocalEvent((eUI, comp, arg) => HandleEmitSoundOn(comp)); + SubscribeLocalEvent((eUI, comp, arg) => HandleEmitSoundOn(comp)); + SubscribeLocalEvent((eUI, comp, args) => HandleEmitSoundOn(comp)); } - private void PlaySound(BaseEmitSoundComponent component) + private void HandleEmitSoundOn(BaseEmitSoundComponent component) { - if (!string.IsNullOrWhiteSpace(component.SoundCollectionName)) - { - PlayRandomSoundFromCollection(component); - } - else if (!string.IsNullOrWhiteSpace(component.SoundName)) - { - PlaySingleSound(component.SoundName, component); + var soundName = component.Sound.GetSound(); + + if (!string.IsNullOrWhiteSpace(soundName)) + { + PlaySingleSound(soundName, component); } else { - Logger.Warning($"{nameof(component)} Uid:{component.Owner.Uid} has neither {nameof(component.SoundCollectionName)} nor {nameof(component.SoundName)} to play."); + Logger.Warning($"{nameof(component)} Uid:{component.Owner.Uid} has no {nameof(component.Sound)} to play."); } } - private void PlayRandomSoundFromCollection(BaseEmitSoundComponent component) - { - var file = SelectRandomSoundFromSoundCollection(component.SoundCollectionName!); - PlaySingleSound(file, component); - } - - private string SelectRandomSoundFromSoundCollection(string soundCollectionName) - { - var soundCollection = _prototypeManager.Index(soundCollectionName); - return _random.Pick(soundCollection.PickFiles); - } - private static void PlaySingleSound(string soundName, BaseEmitSoundComponent component) { - SoundSystem.Play(Filter.Pvs(component.Owner), soundName, component.Owner, - AudioHelpers.WithVariation(component.PitchVariation).WithVolume(-2f)); + SoundSystem.Play(Filter.Pvs(component.Owner), soundName, component.Owner, AudioHelpers.WithVariation(component.PitchVariation).WithVolume(-2f)); } } } diff --git a/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml b/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml index 29b4d5647e..8e7c24eb47 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml @@ -14,7 +14,8 @@ QuickEquip: false - type: ItemCooldown - type: EmitSoundOnUse - sound: /Audio/Items/bikehorn.ogg + sound: + path: /Audio/Items/bikehorn.ogg semitoneVariation: 6 - type: UseDelay delay: 0.5 diff --git a/Resources/Prototypes/Entities/Objects/Fun/skub.yml b/Resources/Prototypes/Entities/Objects/Fun/skub.yml index d885ac09a7..e4695f5062 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/skub.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/skub.yml @@ -12,6 +12,7 @@ - type: ItemCooldown - type: LoopingSound - type: EmitSoundOnUse - sound: /Audio/Items/skub.ogg + sound: + path: /Audio/Items/skub.ogg - type: UseDelay delay: 2.0 diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 442133249c..0d8babe815 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -5,11 +5,14 @@ id: BasePlushie components: - type: EmitSoundOnUse - soundCollection: ToySqueak + sound: + collection: ToySqueak - type: EmitSoundOnLand - soundCollection: ToySqueak + sound: + collection: ToySqueak - type: EmitSoundOnActivate - soundCollection: ToySqueak + sound: + collection: ToySqueak - type: LoopingSound - type: ItemCooldown - type: UseDelay @@ -90,7 +93,8 @@ - type: ItemCooldown - type: LoopingSound - type: EmitSoundOnUse - sound: /Audio/Items/Toys/rattle.ogg + sound: + path: /Audio/Items/Toys/rattle.ogg - type: UseDelay delay: 1.0 @@ -106,7 +110,8 @@ - type: ItemCooldown - type: LoopingSound - type: EmitSoundOnUse - sound: /Audio/Items/Toys/mousesqueek.ogg + sound: + path: /Audio/Items/Toys/mousesqueek.ogg - type: UseDelay delay: 1.0 @@ -122,7 +127,8 @@ - type: ItemCooldown - type: LoopingSound - type: EmitSoundOnUse - sound: /Audio/Voice/Vox/shriek1.ogg + sound: + path: /Audio/Voice/Vox/shriek1.ogg - type: UseDelay delay: 1.0 @@ -142,11 +148,13 @@ - type: Item sprite: Objects/Misc/carvings.rsi - type: EmitSoundOnThrow - sound: /Audio/Items/Toys/helpme.ogg + sound: + path: /Audio/Items/Toys/helpme.ogg - type: ItemCooldown - type: LoopingSound - type: EmitSoundOnUse - sound: /Audio/Items/Toys/helpme.ogg + sound: + path: /Audio/Items/Toys/helpme.ogg - type: UseDelay delay: 1.0 @@ -162,11 +170,13 @@ - type: Item sprite: Objects/Misc/carvings.rsi - type: EmitSoundOnThrow - sound: /Audio/Items/Toys/hellothere.ogg + sound: + path: /Audio/Items/Toys/hellothere.ogg - type: ItemCooldown - type: LoopingSound - type: EmitSoundOnUse - sound: /Audio/Items/Toys/hellothere.ogg + sound: + path: /Audio/Items/Toys/hellothere.ogg - type: UseDelay delay: 1.0 @@ -182,11 +192,13 @@ - type: Item sprite: Objects/Misc/carvings.rsi - type: EmitSoundOnThrow - sound: /Audio/Items/Toys/thankyou.ogg + sound: + path: /Audio/Items/Toys/thankyou.ogg - type: ItemCooldown - type: LoopingSound - type: EmitSoundOnUse - sound: /Audio/Items/Toys/thankyou.ogg + sound: + path: /Audio/Items/Toys/thankyou.ogg - type: UseDelay delay: 1.0 @@ -202,11 +214,13 @@ - type: Item sprite: Objects/Misc/carvings.rsi - type: EmitSoundOnThrow - sound: /Audio/Items/Toys/verygood.ogg + sound: + path: /Audio/Items/Toys/verygood.ogg - type: ItemCooldown - type: LoopingSound - type: EmitSoundOnUse - sound: /Audio/Items/Toys/verygood.ogg + sound: + path: /Audio/Items/Toys/verygood.ogg - type: UseDelay delay: 1.0 @@ -222,11 +236,13 @@ - type: Item sprite: Objects/Misc/carvings.rsi - type: EmitSoundOnThrow - sound: /Audio/Items/Toys/imsorry.ogg + sound: + path: /Audio/Items/Toys/imsorry.ogg - type: ItemCooldown - type: LoopingSound - type: EmitSoundOnUse - sound: /Audio/Items/Toys/imsorry.ogg + sound: + path: /Audio/Items/Toys/imsorry.ogg - type: UseDelay delay: 1.0 @@ -297,7 +313,8 @@ - type: ItemCooldown - type: LoopingSound - type: EmitSoundOnUse - sound: /Audio/Items/Toys/ian.ogg + sound: + path: /Audio/Items/Toys/ian.ogg - type: UseDelay delay: 1.0