using Content.Server.Access.Systems; using Content.Server.CriminalRecords.Systems; using Content.Server.Popups; using Content.Server.Radio.EntitySystems; using Content.Server.StationRecords.Systems; using Content.Shared._White.SecurityHud; using Content.Shared.Access.Components; using Content.Shared.Access.Systems; using Content.Shared.CriminalRecords; using Content.Shared.Humanoid; using Content.Shared.Inventory; using Content.Shared.Overlays; using Content.Shared.Popups; using Content.Shared.Security; using Content.Shared.StationRecords; using Content.Shared.Verbs; using Robust.Server.GameObjects; using Robust.Shared.Player; namespace Content.Server._White.SecurityHud; public sealed class SecurityHudSystem : EntitySystem { [Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly CriminalRecordsSystem _criminalRecordsSystem = default!; [Dependency] private readonly StationRecordsSystem _stationRecordsSystem = default!; [Dependency] private readonly IdCardSystem _idCardSystem = default!; [Dependency] private readonly RadioSystem _radio = default!; [Dependency] private readonly InventorySystem _invSlotsSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly AccessReaderSystem _accessReaderSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(OnAltVerb); SubscribeLocalEvent(OnStatusSelected); } private void OnAltVerb(GetVerbsEvent args) { if (!HasComp(args.Target)) return; if (!_invSlotsSystem.TryGetSlotEntity(args.User, "eyes", out var ent)) return; if (!TryComp(ent, out var component)) return; if (!TryComp(ent, out var accessReaderComponent)) return; if (!_accessReaderSystem.IsAllowed(args.User, (EntityUid) ent, accessReaderComponent)) { _popupSystem.PopupEntity(Loc.GetString("security-hud-not-allowed"), args.User, args.User, PopupType.Medium); return; } AlternativeVerb verb = new() { Act = () => { SetWanted(args.User, args.Target, ent.Value, component); }, Disabled = false, Priority = 3, Text = Loc.GetString("security-hud-verb"), }; args.Verbs.Add(verb); } private void SetWanted(EntityUid uid, EntityUid target, EntityUid hud, ShowCriminalRecordIconsComponent component) { if (!HasComp(uid)) return; _ui.SetUiState(hud, SecurityHudUiKey.Key, new SecurityHudBUIState(component.Status, GetNetEntity(uid), GetNetEntity(target))); _ui.OpenUi(hud, SecurityHudUiKey.Key, uid); } private void OnStatusSelected(EntityUid uid, ShowCriminalRecordIconsComponent component, SecurityHudStatusSelectedMessage args) { var user = GetEntity(args.User); var target = GetEntity(args.Target); if (!_idCardSystem.TryFindIdCard(target, out var idCard)) { _popupSystem.PopupEntity(Loc.GetString("security-hud-id-unknown"), user, user, PopupType.Medium); return; } if (!TryComp(idCard, out var stationRecordKeyComp)) return; if (stationRecordKeyComp.Key == null) { _popupSystem.PopupEntity(Loc.GetString("security-hud-key-null"), user, user, PopupType.Medium); return; } var key = stationRecordKeyComp.Key.Value; if (!SetCriminalStatus(key, args.Status, uid, user, idCard.Comp, Loc.GetString("security-changed-via-hud"), component.SecurityChannel)) { _popupSystem.PopupEntity(Loc.GetString("security-hud-cant-set-status"), user, user, PopupType.Medium); } } private bool SetCriminalStatus(StationRecordKey key, SecurityStatus status, EntityUid hud, EntityUid officer, IdCardComponent idCard, string reason, string securityChannel) { if (!_stationRecordsSystem.TryGetRecord(key, out var generalRecord)) return false; if (!_stationRecordsSystem.TryGetRecord(key, out var record) || record.Status == status) return false; var name = generalRecord.Name; var officerName = Loc.GetString("criminal-records-console-unknown-officer"); if (_idCardSystem.TryFindIdCard(officer, out var id) && id.Comp.FullName is { } fullName) officerName = fullName; _criminalRecordsSystem.TryChangeStatus(key, status, reason); var locArgs = new (string, object)[] { ("name", name), ("officer", officerName), ("reason", reason) }; var statusString = (record.Status, status) switch { (_, SecurityStatus.Detained) => "detained", (_, SecurityStatus.Suspected) => "suspected", (_, SecurityStatus.Paroled) => "paroled", (_, SecurityStatus.Demote) => "demoted", // WD start (_, SecurityStatus.Wanted) => "wanted", (_, SecurityStatus.Monitoring) => "monitoring", (_, SecurityStatus.Released) => "released", (_, SecurityStatus.Search) => "search", (_, SecurityStatus.Execute) => "execute", (SecurityStatus.Suspected, SecurityStatus.None) => "not-suspected", (SecurityStatus.Wanted, SecurityStatus.None) => "not-wanted", (SecurityStatus.Detained, SecurityStatus.None) => "released", (SecurityStatus.Paroled, SecurityStatus.None) => "not-parole", _ => "not-wanted" }; _radio.SendRadioMessage(hud, Loc.GetString($"criminal-records-console-{statusString}", locArgs), securityChannel, hud); _criminalRecordsSystem.UpdateCriminalIdentity(name, status); return true; } }