fish-station/Content.Server/_Sunrise/ReplacementVocal/ReplacementVocalSystem.cs

72 lines
2.2 KiB
C#

using Content.Shared.Humanoid;
using Content.Shared.Speech;
using Content.Shared.Speech.Components;
using Robust.Shared.Prototypes;
namespace Content.Server._Sunrise.ReplacementVocal;
public sealed class ReplacementVocalSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
public override void Initialize()
{
SubscribeLocalEvent<ReplacementVocalComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<ReplacementVocalComponent, ComponentShutdown>(OnComponentShutdown);
}
private void OnComponentInit(EntityUid uid, ReplacementVocalComponent component, ComponentInit args)
{
if (!TryComp<VocalComponent>(uid, out var vocalComponent))
return;
if (component.Vocal.Keys == vocalComponent.Sounds?.Keys)
return;
if (!TryComp<SpeechComponent>(uid, out var speechComponent))
return;
component.PreviousVocal = vocalComponent.Sounds;
vocalComponent.Sounds = component.Vocal;
LoadEmotes(uid, vocalComponent);
foreach (var emote in vocalComponent.EmoteSounds!.Sounds.Keys)
{
if (speechComponent.AllowedEmotes.Contains(emote))
continue;
speechComponent.AllowedEmotes.Add(emote);
component.AddedEmotes.Add(emote);
}
}
private void OnComponentShutdown(EntityUid uid, ReplacementVocalComponent component, ComponentShutdown args)
{
if (!TryComp<SpeechComponent>(uid, out var speech))
return;
if (!TryComp<VocalComponent>(uid, out var vocal))
return;
if (component.PreviousVocal != null)
vocal.Sounds = component.PreviousVocal;
LoadEmotes(uid, vocal);
foreach (var emote in component.AddedEmotes)
{
speech.AllowedEmotes.Remove(emote);
}
component.AddedEmotes.Clear();
}
private void LoadEmotes(EntityUid uid, VocalComponent vocalComponent)
{
var sex = CompOrNull<HumanoidAppearanceComponent>(uid)?.Sex ?? Sex.Unsexed;
if (vocalComponent.Sounds?.TryGetValue(sex, out var protoId) == true)
_proto.TryIndex(protoId, out vocalComponent.EmoteSounds);
}
}