From 04830bf704d58943d36742db290898096005ce12 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 24 Apr 2023 03:42:09 +1000 Subject: [PATCH] Add wallbonk sound to BaseItem (#15689) Uses a chisel sound. --- Content.Server/Sound/EmitSoundSystem.cs | 14 +- .../EmitSoundOnActivateComponent.cs | 33 ++-- .../Components/EmitSoundOnCollideComponent.cs | 22 +++ .../Components/EmitSoundOnDropComponent.cs | 15 +- .../Components/EmitSoundOnLandComponent.cs | 15 +- .../Components/EmitSoundOnPickupComponent.cs | 15 +- .../Components/EmitSoundOnThrowComponent.cs | 15 +- .../Components/EmitSoundOnUseComponent.cs | 33 ++-- Content.Shared/Sound/SharedEmitSoundSystem.cs | 172 ++++++++++-------- Resources/Audio/Effects/licenses.txt | 5 + Resources/Audio/Effects/wall_bonk.ogg | Bin 0 -> 5033 bytes .../Prototypes/Entities/Objects/base_item.yml | 5 + 12 files changed, 195 insertions(+), 149 deletions(-) create mode 100644 Content.Shared/Sound/Components/EmitSoundOnCollideComponent.cs create mode 100644 Resources/Audio/Effects/wall_bonk.ogg diff --git a/Content.Server/Sound/EmitSoundSystem.cs b/Content.Server/Sound/EmitSoundSystem.cs index bc271a8351..e4f9ebcb43 100644 --- a/Content.Server/Sound/EmitSoundSystem.cs +++ b/Content.Server/Sound/EmitSoundSystem.cs @@ -11,7 +11,9 @@ public sealed class EmitSoundSystem : SharedEmitSoundSystem public override void Update(float frameTime) { base.Update(frameTime); - foreach (var soundSpammer in EntityQuery()) + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var soundSpammer)) { if (!soundSpammer.Enabled) continue; @@ -26,8 +28,8 @@ public sealed class EmitSoundSystem : SharedEmitSoundSystem if (Random.Prob(soundSpammer.PlayChance)) { if (soundSpammer.PopUp != null) - Popup.PopupEntity(Loc.GetString(soundSpammer.PopUp), soundSpammer.Owner); - TryEmitSound(soundSpammer); + Popup.PopupEntity(Loc.GetString(soundSpammer.PopUp), uid); + TryEmitSound(uid, soundSpammer); } } } @@ -40,14 +42,14 @@ public sealed class EmitSoundSystem : SharedEmitSoundSystem SubscribeLocalEvent(HandleEmitSoundOnUIOpen); } - private void HandleEmitSoundOnUIOpen(EntityUid eUI, EmitSoundOnUIOpenComponent component, AfterActivatableUIOpenEvent args) + private void HandleEmitSoundOnUIOpen(EntityUid uid, EmitSoundOnUIOpenComponent component, AfterActivatableUIOpenEvent args) { - TryEmitSound(component, args.User); + TryEmitSound(uid, component, args.User); } private void HandleEmitSoundOnTrigger(EntityUid uid, EmitSoundOnTriggerComponent component, TriggerEvent args) { - TryEmitSound(component); + TryEmitSound(uid, component); args.Handled = true; } } diff --git a/Content.Shared/Sound/Components/EmitSoundOnActivateComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnActivateComponent.cs index 501195eb79..5b5330a6d3 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnActivateComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnActivateComponent.cs @@ -1,23 +1,22 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Sound.Components +namespace Content.Shared.Sound.Components; + +/// +/// Simple sound emitter that emits sound on ActivateInWorld +/// +[RegisterComponent, NetworkedComponent] +public sealed class EmitSoundOnActivateComponent : BaseEmitSoundComponent { /// - /// Simple sound emitter that emits sound on ActivateInWorld + /// Whether or not to mark an interaction as handled after playing the sound. Useful if this component is + /// used to play sound for some other component with activation functionality. /// - [RegisterComponent, NetworkedComponent] - public sealed class EmitSoundOnActivateComponent : BaseEmitSoundComponent - { - /// - /// Whether or not to mark an interaction as handled after playing the sound. Useful if this component is - /// used to play sound for some other component with activation functionality. - /// - /// - /// If false, you should be confident that the interaction will also be handled by some other system, as - /// otherwise this might enable sound spamming, as use-delays are only initiated if the interaction was - /// handled. - /// - [DataField("handle")] - public bool Handle = true; - } + /// + /// If false, you should be confident that the interaction will also be handled by some other system, as + /// otherwise this might enable sound spamming, as use-delays are only initiated if the interaction was + /// handled. + /// + [DataField("handle")] + public bool Handle = true; } diff --git a/Content.Shared/Sound/Components/EmitSoundOnCollideComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnCollideComponent.cs new file mode 100644 index 0000000000..e800124818 --- /dev/null +++ b/Content.Shared/Sound/Components/EmitSoundOnCollideComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Sound.Components; + +[RegisterComponent, NetworkedComponent] +public sealed class EmitSoundOnCollideComponent : BaseEmitSoundComponent +{ + public static readonly TimeSpan CollideCooldown = TimeSpan.FromSeconds(0.2); + + /// + /// Minimum velocity required for the sound to play. + /// + [ViewVariables(VVAccess.ReadWrite), DataField("minVelocity")] + public float MinimumVelocity = 0.25f; + + /// + /// To avoid sound spam add a cooldown to it. + /// + [ViewVariables(VVAccess.ReadWrite), DataField("nextSound", customTypeSerializer:typeof(TimeOffsetSerializer))] + public TimeSpan NextSound; +} diff --git a/Content.Shared/Sound/Components/EmitSoundOnDropComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnDropComponent.cs index 16a8e9995d..d3c4206e91 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnDropComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnDropComponent.cs @@ -1,12 +1,11 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Sound.Components +namespace Content.Shared.Sound.Components; + +/// +/// Simple sound emitter that emits sound on entity drop +/// +[RegisterComponent, NetworkedComponent] +public sealed class EmitSoundOnDropComponent : BaseEmitSoundComponent { - /// - /// Simple sound emitter that emits sound on entity drop - /// - [RegisterComponent, NetworkedComponent] - public sealed class EmitSoundOnDropComponent : BaseEmitSoundComponent - { - } } diff --git a/Content.Shared/Sound/Components/EmitSoundOnLandComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnLandComponent.cs index 8507d2d15e..5bf3416bbe 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnLandComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnLandComponent.cs @@ -1,12 +1,11 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Sound.Components +namespace Content.Shared.Sound.Components; + +/// +/// Simple sound emitter that emits sound on LandEvent +/// +[RegisterComponent, NetworkedComponent] +public sealed class EmitSoundOnLandComponent : BaseEmitSoundComponent { - /// - /// Simple sound emitter that emits sound on LandEvent - /// - [RegisterComponent, NetworkedComponent] - public sealed class EmitSoundOnLandComponent : BaseEmitSoundComponent - { - } } diff --git a/Content.Shared/Sound/Components/EmitSoundOnPickupComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnPickupComponent.cs index 5fbb920f63..2b9cd96d05 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnPickupComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnPickupComponent.cs @@ -1,12 +1,11 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Sound.Components +namespace Content.Shared.Sound.Components; + +/// +/// Simple sound emitter that emits sound on entity pickup +/// +[RegisterComponent, NetworkedComponent] +public sealed class EmitSoundOnPickupComponent : BaseEmitSoundComponent { - /// - /// Simple sound emitter that emits sound on entity pickup - /// - [RegisterComponent, NetworkedComponent] - public sealed class EmitSoundOnPickupComponent : BaseEmitSoundComponent - { - } } diff --git a/Content.Shared/Sound/Components/EmitSoundOnThrowComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnThrowComponent.cs index d53d691e18..0b76e3305e 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnThrowComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnThrowComponent.cs @@ -1,12 +1,11 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Sound.Components +namespace Content.Shared.Sound.Components; + +/// +/// Simple sound emitter that emits sound on ThrowEvent +/// +[RegisterComponent, NetworkedComponent] +public sealed class EmitSoundOnThrowComponent : BaseEmitSoundComponent { - /// - /// Simple sound emitter that emits sound on ThrowEvent - /// - [RegisterComponent, NetworkedComponent] - public sealed class EmitSoundOnThrowComponent : BaseEmitSoundComponent - { - } } diff --git a/Content.Shared/Sound/Components/EmitSoundOnUseComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnUseComponent.cs index 6a7b1e120e..5bb95a5c11 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnUseComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnUseComponent.cs @@ -1,23 +1,22 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Sound.Components +namespace Content.Shared.Sound.Components; + +/// +/// Simple sound emitter that emits sound on UseInHand +/// +[RegisterComponent] +public sealed class EmitSoundOnUseComponent : BaseEmitSoundComponent { /// - /// Simple sound emitter that emits sound on UseInHand + /// Whether or not to mark an interaction as handled after playing the sound. Useful if this component is + /// used to play sound for some other component with on-use functionality /// - [RegisterComponent] - public sealed class EmitSoundOnUseComponent : BaseEmitSoundComponent - { - /// - /// Whether or not to mark an interaction as handled after playing the sound. Useful if this component is - /// used to play sound for some other component with on-use functionality - /// - /// - /// If false, you should be confident that the interaction will also be handled by some other system, as - /// otherwise this might enable sound spamming, as use-delays are only initiated if the interaction was - /// handled. - /// - [DataField("handle")] - public bool Handle = true; - } + /// + /// If false, you should be confident that the interaction will also be handled by some other system, as + /// otherwise this might enable sound spamming, as use-delays are only initiated if the interaction was + /// handled. + /// + [DataField("handle")] + public bool Handle = true; } diff --git a/Content.Shared/Sound/SharedEmitSoundSystem.cs b/Content.Shared/Sound/SharedEmitSoundSystem.cs index c7bf5cf137..86433d4967 100644 --- a/Content.Shared/Sound/SharedEmitSoundSystem.cs +++ b/Content.Shared/Sound/SharedEmitSoundSystem.cs @@ -8,104 +8,122 @@ using Content.Shared.Throwing; using JetBrains.Annotations; using Robust.Shared.Map; using Robust.Shared.Network; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Events; using Robust.Shared.Random; +using Robust.Shared.Timing; -namespace Content.Shared.Sound +namespace Content.Shared.Sound; + +/// +/// Will play a sound on various events if the affected entity has a component derived from BaseEmitSoundComponent +/// +[UsedImplicitly] +public abstract class SharedEmitSoundSystem : EntitySystem { - /// - /// Will play a sound on various events if the affected entity has a component derived from BaseEmitSoundComponent - /// - [UsedImplicitly] - public abstract class SharedEmitSoundSystem : EntitySystem + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly INetManager _netMan = default!; + [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly ITileDefinitionManager _tileDefMan = default!; + [Dependency] protected readonly IRobustRandom Random = default!; + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] protected readonly SharedPopupSystem Popup = default!; + + public override void Initialize() { - [Dependency] private readonly INetManager _netMan = default!; - [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly ITileDefinitionManager _tileDefMan = default!; - [Dependency] protected readonly IRobustRandom Random = default!; - [Dependency] private readonly SharedAudioSystem _audioSystem = default!; - [Dependency] protected readonly SharedPopupSystem Popup = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(HandleEmitSpawnOnInit); - SubscribeLocalEvent(OnEmitSoundOnLand); - SubscribeLocalEvent(HandleEmitSoundOnUseInHand); - SubscribeLocalEvent(HandleEmitSoundOnThrown); - SubscribeLocalEvent(HandleEmitSoundOnActivateInWorld); - SubscribeLocalEvent(HandleEmitSoundOnPickup); - SubscribeLocalEvent(HandleEmitSoundOnDrop); - } + base.Initialize(); + SubscribeLocalEvent(OnEmitSpawnOnInit); + SubscribeLocalEvent(OnEmitSoundOnLand); + SubscribeLocalEvent(OnEmitSoundOnUseInHand); + SubscribeLocalEvent(OnEmitSoundOnThrown); + SubscribeLocalEvent(OnEmitSoundOnActivateInWorld); + SubscribeLocalEvent(OnEmitSoundOnPickup); + SubscribeLocalEvent(OnEmitSoundOnDrop); + SubscribeLocalEvent(OnEmitSoundOnCollide); + } - private void HandleEmitSpawnOnInit(EntityUid uid, EmitSoundOnSpawnComponent component, ComponentInit args) - { - TryEmitSound(component, predict: false); - } + private void OnEmitSpawnOnInit(EntityUid uid, EmitSoundOnSpawnComponent component, ComponentInit args) + { + TryEmitSound(uid, component, predict: false); + } - private void OnEmitSoundOnLand(EntityUid uid, BaseEmitSoundComponent component, ref LandEvent args) - { - if (!TryComp(uid, out var xform) || - !_mapManager.TryGetGrid(xform.GridUid, out var grid)) - return; + private void OnEmitSoundOnLand(EntityUid uid, BaseEmitSoundComponent component, ref LandEvent args) + { + if (!TryComp(uid, out var xform) || + !_mapManager.TryGetGrid(xform.GridUid, out var grid)) + return; - var tile = grid.GetTileRef(xform.Coordinates); + var tile = grid.GetTileRef(xform.Coordinates); - // Handle maps being grids (we'll still emit the sound). - if (xform.GridUid != xform.MapUid && tile.IsSpace(_tileDefMan)) - return; + // Handle maps being grids (we'll still emit the sound). + if (xform.GridUid != xform.MapUid && tile.IsSpace(_tileDefMan)) + return; - // hand throwing not predicted sadly - TryEmitSound(component, args.User, false); - } + // hand throwing not predicted sadly + TryEmitSound(uid, component, args.User, false); + } - private void HandleEmitSoundOnUseInHand(EntityUid eUI, EmitSoundOnUseComponent component, UseInHandEvent args) - { - // Intentionally not checking whether the interaction has already been handled. - TryEmitSound(component, args.User); + private void OnEmitSoundOnUseInHand(EntityUid uid, EmitSoundOnUseComponent component, UseInHandEvent args) + { + // Intentionally not checking whether the interaction has already been handled. + TryEmitSound(uid, component, args.User); - if (component.Handle) - args.Handled = true; - } + if (component.Handle) + args.Handled = true; + } - private void HandleEmitSoundOnThrown(EntityUid eUI, BaseEmitSoundComponent component, ThrownEvent args) - { - TryEmitSound(component, args.User, false); - } + private void OnEmitSoundOnThrown(EntityUid uid, BaseEmitSoundComponent component, ThrownEvent args) + { + TryEmitSound(uid, component, args.User, false); + } - private void HandleEmitSoundOnActivateInWorld(EntityUid eUI, EmitSoundOnActivateComponent component, ActivateInWorldEvent args) - { - // Intentionally not checking whether the interaction has already been handled. - TryEmitSound(component, args.User); + private void OnEmitSoundOnActivateInWorld(EntityUid uid, EmitSoundOnActivateComponent component, ActivateInWorldEvent args) + { + // Intentionally not checking whether the interaction has already been handled. + TryEmitSound(uid, component, args.User); - if (component.Handle) - args.Handled = true; - } + if (component.Handle) + args.Handled = true; + } + + private void OnEmitSoundOnPickup(EntityUid uid, EmitSoundOnPickupComponent component, GotEquippedHandEvent args) + { + TryEmitSound(uid, component, args.User); + } + + private void OnEmitSoundOnDrop(EntityUid uid, EmitSoundOnDropComponent component, DroppedEvent args) + { + TryEmitSound(uid, component, args.User); + } - private void HandleEmitSoundOnPickup(EntityUid uid, EmitSoundOnPickupComponent component, GotEquippedHandEvent args) + protected void TryEmitSound(EntityUid uid, BaseEmitSoundComponent component, EntityUid? user=null, bool predict=true) + { + if (component.Sound == null) + return; + + if (predict) { - TryEmitSound(component, args.User); + _audioSystem.PlayPredicted(component.Sound, uid, user); } - - private void HandleEmitSoundOnDrop(EntityUid uid, EmitSoundOnDropComponent component, DroppedEvent args) + else if (_netMan.IsServer) { - TryEmitSound(component, args.User); + // don't predict sounds that client couldn't have played already + _audioSystem.PlayPvs(component.Sound, uid); } + } - protected void TryEmitSound(BaseEmitSoundComponent component, EntityUid? user=null, bool predict=true) + private void OnEmitSoundOnCollide(EntityUid uid, EmitSoundOnCollideComponent component, ref StartCollideEvent args) + { + if (!args.OurFixture.Hard || + !args.OtherFixture.Hard || + !TryComp(uid, out var physics) || + physics.LinearVelocity.Length < component.MinimumVelocity || + _timing.CurTime < component.NextSound) { - if (component.Sound == null) - return; - - if (predict) - { - _audioSystem.PlayPredicted(component.Sound, component.Owner, user); - } - else if (_netMan.IsServer) - { - // don't predict sounds that client couldn't have played already - _audioSystem.PlayPvs(component.Sound, component.Owner); - } + return; } + + component.NextSound = _timing.CurTime + EmitSoundOnCollideComponent.CollideCooldown; + TryEmitSound(uid, component, predict: false); } } - diff --git a/Resources/Audio/Effects/licenses.txt b/Resources/Audio/Effects/licenses.txt index 95d0d98f70..719cc77cd1 100644 --- a/Resources/Audio/Effects/licenses.txt +++ b/Resources/Audio/Effects/licenses.txt @@ -50,4 +50,9 @@ box_deploy.ogg and chime.ogg taken from Citadel Station at commit: https://githu license: "Royalty free" copyright: "Sonniss.com - GDC 2016 - Game Audio Bundle - Levan Nadashvili - Soldier Footsteps - FS Concrete Soldier Crouch N02, mixed from stereo to mono" +- files: + - "wall_bonk.ogg" + license: "Royalty free" + copyright: "Sonniss.com - GDC 2023 - Game Audio Bundle - 344 Audio - Nuts and Bolts" + # Do not add to this list, I only did the above because yaml scheme validator doesn't like custom licenses. diff --git a/Resources/Audio/Effects/wall_bonk.ogg b/Resources/Audio/Effects/wall_bonk.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b1c5505f61d4a1b46c3756f3511ab40c52418519 GIT binary patch literal 5033 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 U-B%25bR0DTyWV-$U<42MzaVuRdH?_b literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Entities/Objects/base_item.yml b/Resources/Prototypes/Entities/Objects/base_item.yml index a9b70dd662..bd17cea822 100644 --- a/Resources/Prototypes/Entities/Objects/base_item.yml +++ b/Resources/Prototypes/Entities/Objects/base_item.yml @@ -8,6 +8,11 @@ - type: Clickable - type: InteractionOutline - type: MovedByPressure + - type: EmitSoundOnCollide + sound: + path: /Audio/Effects/wall_bonk.ogg + params: + volume: 2 - type: EmitSoundOnLand sound: path: /Audio/Effects/drop.ogg -- 2.51.2