Speech noise fixies (#8023)
Co-authored-by: metalgearsloth <metalgearsloth@gmail.com>
This commit is contained in:
@@ -12,69 +12,46 @@ namespace Content.Server.Speech
|
|||||||
{
|
{
|
||||||
public sealed class SpeechSoundSystem : EntitySystem
|
public sealed class SpeechSoundSystem : EntitySystem
|
||||||
{
|
{
|
||||||
|
|
||||||
[Dependency] private readonly IPrototypeManager _proto = default!;
|
|
||||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||||
|
[Dependency] private readonly IPrototypeManager _protoManager = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
SubscribeLocalEvent<SharedSpeechComponent, EntitySpokeEvent>(OnEntitySpoke);
|
SubscribeLocalEvent<SharedSpeechComponent, EntitySpokeEvent>(OnEntitySpoke);
|
||||||
SubscribeLocalEvent<SharedSpeechComponent, ComponentStartup>(OnStartup);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnStartup(EntityUid uid, SharedSpeechComponent component, ComponentStartup args)
|
|
||||||
{
|
|
||||||
//Cache prototype on component startup.
|
|
||||||
if (_proto.TryIndex(component.SpeechSoundsId, out SpeechSoundsPrototype? speechsnds))
|
|
||||||
{
|
|
||||||
if (speechsnds != null)
|
|
||||||
{
|
|
||||||
component.SpeechSoundsCache = speechsnds;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void OnEntitySpoke(EntityUid uid, SharedSpeechComponent component, EntitySpokeEvent args)
|
private void OnEntitySpoke(EntityUid uid, SharedSpeechComponent component, EntitySpokeEvent args)
|
||||||
{
|
{
|
||||||
if (!component.PlaySpeechSound) return;
|
if (component.SpeechSounds == null) return;
|
||||||
|
|
||||||
|
var currentTime = _gameTiming.CurTime;
|
||||||
var cooldown = TimeSpan.FromSeconds(component.SoundCooldownTime);
|
var cooldown = TimeSpan.FromSeconds(component.SoundCooldownTime);
|
||||||
//Ensure more than the cooldown time has passed since last speaking
|
|
||||||
if ((_gameTiming.CurTime - component.LastTimeSoundPlayed) < cooldown) return;
|
|
||||||
|
|
||||||
//Play speech sound
|
// Ensure more than the cooldown time has passed since last speaking
|
||||||
|
if (currentTime - component.LastTimeSoundPlayed < cooldown) return;
|
||||||
|
|
||||||
if (component.SpeechSoundsCache != null)
|
// Play speech sound
|
||||||
|
string contextSound;
|
||||||
|
var prototype = _protoManager.Index<SpeechSoundsPrototype>(component.SpeechSounds);
|
||||||
|
|
||||||
|
// Different sounds for ask/exclaim based on last character
|
||||||
|
switch (args.Message[^1])
|
||||||
{
|
{
|
||||||
//Re-Index sounds prototype if cached proto ID is outdated, allows VV and changing the voice.
|
case '?':
|
||||||
if (component.SpeechSoundsCache.ID != component.SpeechSoundsId)
|
contextSound = prototype.AskSound.GetSound();
|
||||||
{
|
break;
|
||||||
if (_proto.TryIndex(component.SpeechSoundsId, out SpeechSoundsPrototype? speechsnds))
|
case '!':
|
||||||
{
|
contextSound = prototype.ExclaimSound.GetSound();
|
||||||
if (speechsnds != null)
|
break;
|
||||||
{
|
default:
|
||||||
component.SpeechSoundsCache = speechsnds;
|
contextSound = prototype.SaySound.GetSound();
|
||||||
}
|
break;
|
||||||
}
|
|
||||||
}
|
|
||||||
var contextSound = component.SpeechSoundsCache.SaySound;
|
|
||||||
//Different sounds for ask/exclaim based on last character
|
|
||||||
switch (args.Message[args.Message.Length-1])
|
|
||||||
{
|
|
||||||
case '?':
|
|
||||||
contextSound = component.SpeechSoundsCache.AskSound;
|
|
||||||
break;
|
|
||||||
case '!':
|
|
||||||
contextSound = component.SpeechSoundsCache.ExclaimSound;
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
component.LastTimeSoundPlayed = _gameTiming.CurTime;
|
|
||||||
SoundSystem.Play(Filter.Pvs(uid), contextSound.GetSound(), uid, component.AudioParams);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
component.LastTimeSoundPlayed = currentTime;
|
||||||
|
SoundSystem.Play(Filter.Pvs(uid, entityManager: EntityManager), contextSound, uid, component.AudioParams);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,12 +21,8 @@ namespace Content.Shared.Speech
|
|||||||
private bool _enabled = true;
|
private bool _enabled = true;
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
[DataField("playSpeechSound")]
|
[DataField("speechSounds", customTypeSerializer:typeof(PrototypeIdSerializer<SpeechSoundsPrototype>))]
|
||||||
public bool PlaySpeechSound = false;
|
public string? SpeechSounds;
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
|
||||||
[DataField("speechSoundsId", customTypeSerializer:typeof(PrototypeIdSerializer<SpeechSoundsPrototype>))]
|
|
||||||
public string SpeechSoundsId { get; set; } = "Alto";
|
|
||||||
|
|
||||||
[DataField("audioParams")]
|
[DataField("audioParams")]
|
||||||
public AudioParams AudioParams = AudioParams.Default.WithVolume(5f);
|
public AudioParams AudioParams = AudioParams.Default.WithVolume(5f);
|
||||||
@@ -37,12 +33,6 @@ namespace Content.Shared.Speech
|
|||||||
|
|
||||||
public TimeSpan LastTimeSoundPlayed = TimeSpan.Zero;
|
public TimeSpan LastTimeSoundPlayed = TimeSpan.Zero;
|
||||||
|
|
||||||
//Don't use this.
|
|
||||||
//Cache for SpeechSoundsPrototype to avoid Indexing every single time someone talks.
|
|
||||||
public SpeechSoundsPrototype? SpeechSoundsCache = null;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public bool Enabled
|
public bool Enabled
|
||||||
{
|
{
|
||||||
get => _enabled;
|
get => _enabled;
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
diagnoser_printing.ogg taken from https://freesound.org/people/RobSp1derp1g/sounds/615419/ and edited
|
circuitprinter.ogg taken from https://freesound.org/people/OroborosNZ/sounds/273649/ and https://freesound.org/people/170048@virtualwindow.co.za/sounds/408041/ and edited
|
||||||
|
|
||||||
vaccinator_running.ogg taken from https://freesound.org/people/RutgerMuller/sounds/365413/ and edited
|
diagnoser_printing.ogg taken from https://freesound.org/people/RobSp1derp1g/sounds/615419/ and edited
|
||||||
|
|
||||||
uniformprinter.ogg taken from https://freesound.org/people/sukaton/sounds/60640/ and edited
|
uniformprinter.ogg taken from https://freesound.org/people/sukaton/sounds/60640/ and edited
|
||||||
|
|
||||||
circuitprinter.ogg taken from https://freesound.org/people/OroborosNZ/sounds/273649/ and https://freesound.org/people/170048@virtualwindow.co.za/sounds/408041/ and edited
|
vaccinator_running.ogg taken from https://freesound.org/people/RutgerMuller/sounds/365413/ and edited
|
||||||
|
|
||||||
|
vending_jingle.ogg made by github.com/hubismal licensed under CC-BY-3.0
|
||||||
@@ -11,5 +11,5 @@ speak_4_ask.ogg
|
|||||||
speak_4_exclaim.ogg
|
speak_4_exclaim.ogg
|
||||||
speak_4.ogg
|
speak_4.ogg
|
||||||
all taken from
|
all taken from
|
||||||
https://github.com/goonstation/goonstation/tree/master/sound/misc/talk
|
https://github.com/goonstation/goonstation/tree/eb3e7df6292d23f6af2f18b4372d3a8ba4b0fda7/sound/misc/talk
|
||||||
licensed under CC BY-NC-SA 3.0
|
licensed under CC BY-NC-SA 3.0
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
sprite: Mobs/Animals/bat.rsi
|
sprite: Mobs/Animals/bat.rsi
|
||||||
- type: Physics
|
- type: Physics
|
||||||
- type: Speech
|
- type: Speech
|
||||||
speechSoundsId: Squeak
|
speechSounds: Squeak
|
||||||
- type: Fixtures
|
- type: Fixtures
|
||||||
fixtures:
|
fixtures:
|
||||||
- shape:
|
- shape:
|
||||||
@@ -666,8 +666,7 @@
|
|||||||
name: mouse
|
name: mouse
|
||||||
description: A hungry and mischievous mouse.
|
description: A hungry and mischievous mouse.
|
||||||
- type: Speech
|
- type: Speech
|
||||||
playSpeechSound: true
|
speechSounds: Squeak
|
||||||
speechSoundsId: Squeak
|
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
drawdepth: FloorObjects
|
drawdepth: FloorObjects
|
||||||
layers:
|
layers:
|
||||||
|
|||||||
@@ -309,7 +309,6 @@
|
|||||||
# - type: Recyclable Turns out turning off recycler safeties without considering the instagib is a bad idea
|
# - type: Recyclable Turns out turning off recycler safeties without considering the instagib is a bad idea
|
||||||
# safe: false
|
# safe: false
|
||||||
- type: Speech
|
- type: Speech
|
||||||
playSpeechSound: true
|
|
||||||
- type: Vocal
|
- type: Vocal
|
||||||
- type: Emoting
|
- type: Emoting
|
||||||
- type: Grammar
|
- type: Grammar
|
||||||
|
|||||||
@@ -53,8 +53,7 @@
|
|||||||
LayoutId: Vending
|
LayoutId: Vending
|
||||||
- type: Anchorable
|
- type: Anchorable
|
||||||
- type: Speech
|
- type: Speech
|
||||||
playSpeechSound: true
|
speechSounds: Vending
|
||||||
speechSoundsId: Vending
|
|
||||||
- type: DoAfter
|
- type: DoAfter
|
||||||
- type: Electrified
|
- type: Electrified
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|||||||
Reference in New Issue
Block a user