diff --git a/Content.Client/Access/UI/IdCardConsoleBoundUserInterface.cs b/Content.Client/Access/UI/IdCardConsoleBoundUserInterface.cs index c5d0227e40..1591193eea 100644 --- a/Content.Client/Access/UI/IdCardConsoleBoundUserInterface.cs +++ b/Content.Client/Access/UI/IdCardConsoleBoundUserInterface.cs @@ -59,7 +59,7 @@ namespace Content.Client.Access.UI _window?.UpdateState(castState); } - public void SubmitData(string newFullName, string newJobTitle, List newAccessList) + public void SubmitData(string newFullName, string newJobTitle, List newAccessList, string newJobPrototype) { if (newFullName.Length > MaxFullNameLength) newFullName = newFullName[..MaxFullNameLength]; @@ -70,7 +70,8 @@ namespace Content.Client.Access.UI SendMessage(new WriteToTargetIdMessage( newFullName, newJobTitle, - newAccessList)); + newAccessList, + newJobPrototype)); } } } diff --git a/Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs b/Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs index 359ad44d52..e4594856f9 100644 --- a/Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs +++ b/Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs @@ -26,8 +26,10 @@ namespace Content.Client.Access.UI private string? _lastFullName; private string? _lastJobTitle; + private string? _lastJobProto; - public IdCardConsoleWindow(IdCardConsoleBoundUserInterface owner, IPrototypeManager prototypeManager, List accessLevels) + public IdCardConsoleWindow(IdCardConsoleBoundUserInterface owner, IPrototypeManager prototypeManager, + List accessLevels) { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); @@ -101,6 +103,7 @@ namespace Content.Client.Access.UI } JobTitleLineEdit.Text = Loc.GetString(job.Name); + args.Button.SelectId(args.Id); ClearAllAccess(); @@ -181,17 +184,29 @@ namespace Content.Client.Access.UI } } + var jobIndex = _jobPrototypeIds.IndexOf(state.TargetIdJobPrototype); + if (jobIndex >= 0) + { + JobPresetOptionButton.SelectId(jobIndex); + } + _lastFullName = state.TargetIdFullName; _lastJobTitle = state.TargetIdJobTitle; + _lastJobProto = state.TargetIdJobPrototype; } private void SubmitData() { + // Don't send this if it isn't dirty. + var jobProtoDirty = _lastJobProto != null && + _jobPrototypeIds[JobPresetOptionButton.SelectedId] != _lastJobProto; + _owner.SubmitData( FullNameLineEdit.Text, JobTitleLineEdit.Text, // Iterate over the buttons dictionary, filter by `Pressed`, only get key from the key/value pair - _accessButtons.Where(x => x.Value.Pressed).Select(x => x.Key).ToList()); + _accessButtons.Where(x => x.Value.Pressed).Select(x => x.Key).ToList(), + jobProtoDirty ? _jobPrototypeIds[JobPresetOptionButton.SelectedId] : string.Empty); } } } diff --git a/Content.Client/CrewManifest/CrewManifestUi.xaml.cs b/Content.Client/CrewManifest/CrewManifestUi.xaml.cs index d36fa3a2c0..5c7d371a09 100644 --- a/Content.Client/CrewManifest/CrewManifestUi.xaml.cs +++ b/Content.Client/CrewManifest/CrewManifestUi.xaml.cs @@ -131,11 +131,11 @@ public sealed partial class CrewManifestUi : DefaultWindow foreach (var entry in entries) { - var name = new Label() + var name = new RichTextLabel() { HorizontalExpand = true, - Text = entry.Name }; + name.SetMessage(entry.Name); var titleContainer = new BoxContainer() { @@ -143,10 +143,8 @@ public sealed partial class CrewManifestUi : DefaultWindow HorizontalExpand = true }; - var title = new Label() - { - Text = Loc.GetString(entry.JobTitle) - }; + var title = new RichTextLabel(); + title.SetMessage(Loc.GetString(entry.JobTitle)); if (rsi != null) diff --git a/Content.Server/Access/Components/IdCardConsoleComponent.cs b/Content.Server/Access/Components/IdCardConsoleComponent.cs index 1dd27f87d8..da00c06aec 100644 --- a/Content.Server/Access/Components/IdCardConsoleComponent.cs +++ b/Content.Server/Access/Components/IdCardConsoleComponent.cs @@ -8,7 +8,9 @@ using Content.Shared.Access.Systems; using Content.Shared.StationRecords; using Content.Server.Administration.Logs; using Content.Shared.Database; +using Content.Shared.Roles; using Robust.Server.GameObjects; +using Robust.Shared.Prototypes; namespace Content.Server.Access.Components { @@ -18,9 +20,13 @@ namespace Content.Server.Access.Components { [Dependency] private readonly IEntityManager _entities = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(IdCardConsoleUiKey.Key); + private StationRecordsSystem? _recordSystem; + private StationSystem? _stationSystem; + protected override void Initialize() { base.Initialize(); @@ -28,6 +34,9 @@ namespace Content.Server.Access.Components Owner.EnsureComponentWarn(); Owner.EnsureComponentWarn(); + _stationSystem = _entities.EntitySysManager.GetEntitySystem(); + _recordSystem = _entities.EntitySysManager.GetEntitySystem(); + if (UserInterface != null) { UserInterface.OnReceiveMessage += OnUiReceiveMessage; @@ -45,7 +54,7 @@ namespace Content.Server.Access.Components switch (obj.Message) { case WriteToTargetIdMessage msg: - TryWriteToTargetId(msg.FullName, msg.JobTitle, msg.AccessList, player); + TryWriteToTargetId(msg.FullName, msg.JobTitle, msg.AccessList, msg.JobPrototype, player); UpdateUserInterface(); break; } @@ -62,7 +71,7 @@ namespace Content.Server.Access.Components } var privilegedIdEntity = PrivilegedIdSlot.Item; - var accessSystem = EntitySystem.Get(); + var accessSystem = _entities.EntitySysManager.GetEntitySystem(); return privilegedIdEntity != null && accessSystem.IsAllowed(privilegedIdEntity.Value, reader); } @@ -70,12 +79,12 @@ namespace Content.Server.Access.Components /// Called whenever an access button is pressed, adding or removing that access from the target ID card. /// Writes data passed from the UI into the ID stored in , if present. /// - private void TryWriteToTargetId(string newFullName, string newJobTitle, List newAccessList, EntityUid player) + private void TryWriteToTargetId(string newFullName, string newJobTitle, List newAccessList, string newJobProto, EntityUid player) { if (TargetIdSlot.Item is not {Valid: true} targetIdEntity || !PrivilegedIdIsAuthorized()) return; - var cardSystem = EntitySystem.Get(); + var cardSystem = _entities.EntitySysManager.GetEntitySystem(); cardSystem.TryChangeFullName(targetIdEntity, newFullName, player: player); cardSystem.TryChangeJobTitle(targetIdEntity, newJobTitle, player: player); @@ -85,7 +94,7 @@ namespace Content.Server.Access.Components return; } - var accessSystem = EntitySystem.Get(); + var accessSystem = _entities.EntitySysManager.GetEntitySystem(); accessSystem.TrySetTags(targetIdEntity, newAccessList); /*TODO: ECS IdCardConsoleComponent and then log on card ejection, together with the save. @@ -93,17 +102,17 @@ namespace Content.Server.Access.Components _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{_entities.ToPrettyString(player):player} has modified {_entities.ToPrettyString(targetIdEntity):entity} with the following accesses: [{string.Join(", ", newAccessList)}]"); - UpdateStationRecord(targetIdEntity, newFullName, newJobTitle); + UpdateStationRecord(targetIdEntity, newFullName, newJobTitle, newJobProto); } - private void UpdateStationRecord(EntityUid idCard, string newFullName, string newJobTitle) + private void UpdateStationRecord(EntityUid idCard, string newFullName, string newJobTitle, string newJobProto) { - var station = EntitySystem.Get().GetOwningStation(Owner); - var recordSystem = EntitySystem.Get(); + var station = _stationSystem?.GetOwningStation(Owner); if (station == null + || _recordSystem == null || !_entities.TryGetComponent(idCard, out StationRecordKeyStorageComponent? keyStorage) || keyStorage.Key == null - || !recordSystem.TryGetRecord(station.Value, keyStorage.Key.Value, out GeneralStationRecord? record)) + || !_recordSystem.TryGetRecord(station.Value, keyStorage.Key.Value, out GeneralStationRecord? record)) { return; } @@ -111,7 +120,13 @@ namespace Content.Server.Access.Components record.Name = newFullName; record.JobTitle = newJobTitle; - recordSystem.Synchronize(station.Value); + if (_prototypeManager.TryIndex(newJobProto, out JobPrototype? job)) + { + record.JobPrototype = newJobProto; + record.JobIcon = job.Icon; + } + + _recordSystem.Synchronize(station.Value); } public void UpdateUserInterface() @@ -137,6 +152,7 @@ namespace Content.Server.Access.Components null, null, privilegedIdName, + string.Empty, string.Empty); } else @@ -146,6 +162,19 @@ namespace Content.Server.Access.Components var name = string.Empty; if (PrivilegedIdSlot.Item is {Valid: true} item) name = _entities.GetComponent(item).EntityName; + + var station = _stationSystem?.GetOwningStation(Owner); + var jobProto = string.Empty; + if (_recordSystem != null + && station != null + && _entities.TryGetComponent(targetIdEntity, out StationRecordKeyStorageComponent? keyStorage) + && keyStorage.Key != null + && _recordSystem.TryGetRecord(station.Value, keyStorage.Key.Value, + out GeneralStationRecord? record)) + { + jobProto = record.JobPrototype; + } + newState = new IdCardConsoleBoundUserInterfaceState( PrivilegedIdSlot.HasItem, PrivilegedIdIsAuthorized(), @@ -153,6 +182,7 @@ namespace Content.Server.Access.Components targetIdComponent.FullName, targetIdComponent.JobTitle, targetAccessComponent.Tags.ToArray(), + jobProto, name, _entities.GetComponent(targetIdEntity).EntityName); } diff --git a/Content.Shared/Access/Components/SharedIdCardConsoleComponent.cs b/Content.Shared/Access/Components/SharedIdCardConsoleComponent.cs index 49406d059a..75e7fb7607 100644 --- a/Content.Shared/Access/Components/SharedIdCardConsoleComponent.cs +++ b/Content.Shared/Access/Components/SharedIdCardConsoleComponent.cs @@ -26,12 +26,14 @@ namespace Content.Shared.Access.Components public readonly string FullName; public readonly string JobTitle; public readonly List AccessList; + public readonly string JobPrototype; - public WriteToTargetIdMessage(string fullName, string jobTitle, List accessList) + public WriteToTargetIdMessage(string fullName, string jobTitle, List accessList, string jobPrototype) { FullName = fullName; JobTitle = jobTitle; AccessList = accessList; + JobPrototype = jobPrototype; } } @@ -82,6 +84,7 @@ namespace Content.Shared.Access.Components public readonly string? TargetIdFullName; public readonly string? TargetIdJobTitle; public readonly string[]? TargetIdAccessList; + public readonly string TargetIdJobPrototype; public IdCardConsoleBoundUserInterfaceState(bool isPrivilegedIdPresent, bool isPrivilegedIdAuthorized, @@ -89,6 +92,7 @@ namespace Content.Shared.Access.Components string? targetIdFullName, string? targetIdJobTitle, string[]? targetIdAccessList, + string targetIdJobPrototype, string privilegedIdName, string targetIdName) { @@ -98,6 +102,7 @@ namespace Content.Shared.Access.Components TargetIdFullName = targetIdFullName; TargetIdJobTitle = targetIdJobTitle; TargetIdAccessList = targetIdAccessList; + TargetIdJobPrototype = targetIdJobPrototype; PrivilegedIdName = privilegedIdName; TargetIdName = targetIdName; } diff --git a/Resources/Locale/en-US/access/components/id-card-console-component.ftl b/Resources/Locale/en-US/access/components/id-card-console-component.ftl index 79e9aedb78..be5d3f0bc3 100644 --- a/Resources/Locale/en-US/access/components/id-card-console-component.ftl +++ b/Resources/Locale/en-US/access/components/id-card-console-component.ftl @@ -5,7 +5,7 @@ id-card-console-window-save-button = Save id-card-console-window-job-title-label = Job title: id-card-console-window-eject-button = Eject id-card-console-window-insert-button = Insert -id-card-console-window-job-selection-label = Job presets: +id-card-console-window-job-selection-label = Job presets (sets department and job icon): access-id-card-console-component-no-hands-error = You have no hands. id-card-console-privileged-id = Privileged ID