Files
wwdpublic/Content.Server/VoiceMask/VoiceMaskSystem.cs
Bakke d23ec8ec5c Fix voice mask popup location (#21638)
The voice mask confirmation and error popups were placed at the cursor,
which made the popup render hidden under the voice mask UI. This moves
the message to the player entity, and colors the error feedback red to
make it more distinct.
2023-11-19 22:07:07 +01:00

94 lines
3.5 KiB
C#

using Content.Server.Administration.Logs;
using Content.Server.Chat.Systems;
using Content.Server.Popups;
using Content.Shared.Database;
using Content.Shared.Inventory.Events;
using Content.Shared.Popups;
using Content.Shared.Preferences;
using Content.Shared.VoiceMask;
using Robust.Server.GameObjects;
using Robust.Shared.Player;
namespace Content.Server.VoiceMask;
public sealed partial class VoiceMaskSystem : EntitySystem
{
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
public override void Initialize()
{
SubscribeLocalEvent<VoiceMaskComponent, TransformSpeakerNameEvent>(OnSpeakerNameTransform);
SubscribeLocalEvent<VoiceMaskComponent, VoiceMaskChangeNameMessage>(OnChangeName);
SubscribeLocalEvent<VoiceMaskerComponent, GotEquippedEvent>(OnEquip);
SubscribeLocalEvent<VoiceMaskerComponent, GotUnequippedEvent>(OnUnequip);
SubscribeLocalEvent<VoiceMaskSetNameEvent>(OnSetName);
// SubscribeLocalEvent<VoiceMaskerComponent, GetVerbsEvent<AlternativeVerb>>(GetVerbs);
}
private void OnSetName(VoiceMaskSetNameEvent ev)
{
OpenUI(ev.Performer);
}
private void OnChangeName(EntityUid uid, VoiceMaskComponent component, VoiceMaskChangeNameMessage message)
{
if (message.Name.Length > HumanoidCharacterProfile.MaxNameLength || message.Name.Length <= 0)
{
_popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-failure"), uid, message.Session, PopupType.SmallCaution);
return;
}
component.VoiceName = message.Name;
if (message.Session.AttachedEntity != null)
_adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} set voice of {ToPrettyString(uid):mask}: {component.VoiceName}");
else
_adminLogger.Add(LogType.Action, LogImpact.Medium, $"Voice of {ToPrettyString(uid):mask} set: {component.VoiceName}");
_popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), uid, message.Session);
TrySetLastKnownName(uid, message.Name);
UpdateUI(uid, component);
}
private void OnSpeakerNameTransform(EntityUid uid, VoiceMaskComponent component, TransformSpeakerNameEvent args)
{
if (component.Enabled)
{
/*
args.Name = _idCard.TryGetIdCard(uid, out var card) && !string.IsNullOrEmpty(card.FullName)
? card.FullName
: Loc.GetString("voice-mask-unknown");
*/
args.Name = component.VoiceName;
}
}
private void OpenUI(EntityUid player, ActorComponent? actor = null)
{
// Delta-V: `logMissing: false` because of syrinx.
if (!Resolve(player, ref actor, logMissing: false))
return;
if (!_uiSystem.TryGetUi(player, VoiceMaskUIKey.Key, out var bui))
return;
_uiSystem.OpenUi(bui, actor.PlayerSession);
UpdateUI(player);
}
private void UpdateUI(EntityUid owner, VoiceMaskComponent? component = null)
{
// Delta-V: `logMissing: false` because of syrinx
if (!Resolve(owner, ref component, logMissing: false))
{
return;
}
if (_uiSystem.TryGetUi(owner, VoiceMaskUIKey.Key, out var bui))
_uiSystem.SetUiState(bui, new VoiceMaskBuiState(component.VoiceName));
}
}