diff --git a/Content.Server/Access/Systems/AccessSystem.cs b/Content.Server/Access/Systems/AccessSystem.cs index f185d0ff980..1533f877431 100644 --- a/Content.Server/Access/Systems/AccessSystem.cs +++ b/Content.Server/Access/Systems/AccessSystem.cs @@ -1,7 +1,84 @@ using Content.Shared.Access.Systems; +using Content.Shared.Access.Components; +using Content.Server.Station.Systems; +using Content.Server.AlertLevel; +using Content.Shared.Station.Components; -namespace Content.Server.Access.Systems; +namespace Content.Server.Access.Systems; //Sunrise-edited public sealed class AccessSystem : SharedAccessSystem { + [Dependency] private readonly StationSystem _station = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAlertLevelChanged); + } + /// + /// Запускает обновление уровня аварийных доступов на всех сущностях с AccessReaderComponent + /// + private void OnAlertLevelChanged(AlertLevelChangedEvent ev) + { + + if (!TryComp(ev.Station, out var alert)) + return; + + if (alert.AlertLevels == null) + return; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var reader, out var xform)) + { + + if (CompOrNull(xform.GridUid)?.Station != ev.Station) + continue; + + if (alert.AlertLevels == null) + return; + + if (!TryComp(uid, out var comp)) + return; + + if (comp.AlertAccesses.Count == 0) + continue; + + Update((uid, reader)); + Dirty(uid, reader); + } + } + + /// + /// Устанавливает значение из прототипа в зависимости от кода + /// + public void Update(Entity entity) + { + + if (!TryComp(_station.GetOwningStation(entity.Owner), out var alerts)) + return; + + if (alerts.AlertLevels == null) + return; + + var alertLevels = new Dictionary + { + { "blue", AccessReaderComponent.CurrentAlertLevel.blue }, + { "red", AccessReaderComponent.CurrentAlertLevel.red }, + { "yellow", AccessReaderComponent.CurrentAlertLevel.yellow }, + { "gamma", AccessReaderComponent.CurrentAlertLevel.gamma }, + { "delta", AccessReaderComponent.CurrentAlertLevel.delta } + }; + + entity.Comp.Group = string.Empty; // Значение по умолчанию + foreach (var level in alertLevels) + { + if (alerts.CurrentLevel.Contains(level.Key)) + { + entity.Comp.AlertAccesses.TryGetValue(level.Value, out var value); + entity.Comp.Group = value; + break; + } + } + } } diff --git a/Content.Shared/Access/Components/AccessReaderComponent.cs b/Content.Shared/Access/Components/AccessReaderComponent.cs index 903ceab186d..17279ebced7 100644 --- a/Content.Shared/Access/Components/AccessReaderComponent.cs +++ b/Content.Shared/Access/Components/AccessReaderComponent.cs @@ -1,8 +1,11 @@ +using System.Text.RegularExpressions; using Content.Shared.StationRecords; +using Content.Shared.Weapons.Melee; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; +using Robust.Shared.Toolshed.Syntax; namespace Content.Shared.Access.Components; @@ -20,6 +23,29 @@ public sealed partial class AccessReaderComponent : Component [DataField] public bool Enabled = true; + // Sunrise-start + + /// + /// Именно от Group происходит проверка аварийных доступов + /// + [ViewVariables(VVAccess.ReadWrite)] + public ProtoId Group = string.Empty; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField] + public Dictionary> AlertAccesses = new(); + + [Flags] + public enum CurrentAlertLevel : byte + { + blue, + red, + yellow, + gamma, + delta + } + // Sunrise-end + /// /// The set of tags that will automatically deny an allowed check, if any of them are present. /// @@ -100,13 +126,20 @@ public sealed class AccessReaderComponentState : ComponentState public List>> AccessLists; + public ProtoId Group; // Sunrise-alertAccesses, нужно для связывания клиента с сервером + public List<(NetEntity, uint)> AccessKeys; public Queue AccessLog; public int AccessLogLimit; - public AccessReaderComponentState(bool enabled, HashSet> denyTags, List>> accessLists, List<(NetEntity, uint)> accessKeys, Queue accessLog, int accessLogLimit) + public AccessReaderComponentState(bool enabled, HashSet> denyTags, + List>> accessLists, + ProtoId group, + List<(NetEntity, uint)> accessKeys, + Queue accessLog, + int accessLogLimit) //Sunrise-edit { Enabled = enabled; DenyTags = denyTags; @@ -114,6 +147,7 @@ public AccessReaderComponentState(bool enabled, HashSet> acce return false; } + // Sunrise-start + /// + /// Сравнивает список аварийных доступов с доступами на карте. + /// + public bool AreAccessTagsAllowedAlert(ICollection> access, AccessReaderComponent reader) + { + if (reader.Group == string.Empty) + return false; + + if (!_prototype.TryIndex(reader.Group, out var accessTags)) + return false; + + if (accessTags == null) + return false; + + if (accessTags.Tags.Count == 0) + return false; + foreach (var ent in accessTags.Tags) + { + if (access.Contains(ent)) + return true; + } + + return false; + } + // Sunrise-end + /// /// Compares the given stationrecordkeys with the accessreader to see if it is allowed. /// diff --git a/Resources/Locale/ru-RU/_strings/alert-levels/alert-levels.ftl b/Resources/Locale/ru-RU/_strings/alert-levels/alert-levels.ftl index 14f78a8ac70..b95e46becc1 100644 --- a/Resources/Locale/ru-RU/_strings/alert-levels/alert-levels.ftl +++ b/Resources/Locale/ru-RU/_strings/alert-levels/alert-levels.ftl @@ -9,19 +9,19 @@ alert-level-blue-announcement = На станции присутствует н alert-level-blue-instructions = Каждый сотрудник обязан носить свою ID-карту в своём КПК. Также членам экипажа рекомендуется проявлять бдительность и сообщать службе безопасности o любой подозрительной активности. alert-level-red = Красный alert-level-red-announcement = На станции присутствует известная угроза. Служба безопасности имеет право применять летальную силу по необходимости. Все члены экипажа, за исключением должностных лиц, обязаны проследовать в свои отделы и ожидать дальнейших инструкций до отмены кода. -alert-level-red-instructions = Экипаж обязан подчиняться правомерным приказам сотрудников Службы Безопасности. Переключите режим работы своего костюма в режим "Координаты" и находитесь в своём отделе. +alert-level-red-instructions = Экипаж обязан подчиняться правомерным приказам сотрудников Службы Безопасности. Переключите режим работы своего костюма в режим "Координаты" и находитесь в своём отделе. Доступы службы безопасности расширены. alert-level-violet = Фиолетовый alert-level-violet-announcement = На станции присутствует угроза вируса. Членам экипажа рекомендуется держать дистанцию между собой и соблюдать меры безопасности по предотвращению дальнейшего распространения вируса. alert-level-violet-instructions = Членам экипажа рекомендуется держать дистанцию между собой и соблюдать меры безопасности по предотвращению дальнейшего распространения вируса. Если вы чувствуете себя плохо - вам следует незамедлительно пройти на обследование, надев заранее стерильную маску. alert-level-yellow = Жёлтый -alert-level-yellow-announcement = На станции присутствует структурная или атмосферная угроза. Инженерно-техническому персоналу требуется немедленно предпринять меры по устранению угрозы. Всем остальным сотрудникам запрещено находиться в опасном участке. +alert-level-yellow-announcement = На станции присутствует структурная или атмосферная угроза. Инженерно-техническому персоналу выданы дополнительные доступы, им требуется немедленно предпринять меры по устранению угрозы. Всем остальным сотрудникам запрещено находиться в опасном участке. alert-level-yellow-instructions = Членам экипажа необходимо в срочном порядке покинуть опасную зону и, по возможности, оставаться на своих рабочих местах. alert-level-gamma = Гамма alert-level-gamma-announcement = Центральное командование объявило на станции уровень угрозы "Гамма". Служба безопасности должна постоянно иметь при себе оружие, гражданский персонал обязан немедленно обратиться к главам отделов для получения указаний к эвакуации. -alert-level-gamma-instructions = Гражданский персонал обязан немедленно обратиться к главам отделов для получения указаний к эвакуации. Корпорация Nanotrasen заверяет вас - опасность скоро будет нейтрализована. +alert-level-gamma-instructions = Гражданский персонал обязан немедленно обратиться к главам отделов для получения указаний к эвакуации. Корпорация Nanotrasen заверяет вас - опасность скоро будет нейтрализована. Доступы службы безопасности расширены. alert-level-delta = Дельта alert-level-delta-announcement = Станция находится под угрозой неминуемого уничтожения. Членам экипажа рекомендуется слушать глав отделов для получения дополнительной информации. Службе Безопасности приказано работать по протоколу Дельта. -alert-level-delta-instructions = Членам экипажа необходимо слушать глав отделов для получения дополнительной информации. От этого зависит ваше здоровье и безопасность. +alert-level-delta-instructions = Членам экипажа необходимо слушать глав отделов для получения дополнительной информации. От этого зависит ваше здоровье и безопасность. Доступ на всех шлюзах переведен в аварийный. alert-level-epsilon = Эпсилон alert-level-epsilon-announcement = Центральное командование объявило на станции уровень угрозы "Эпсилон". Все контракты расторгнуты. Спасибо, что выбрали Nanotrasen. alert-level-epsilon-instructions = Все контракты расторгнуты. diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml index f75fa2584e2..68225fbe94e 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml @@ -6,6 +6,12 @@ components: - type: AccessReader access: [["Captain"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end - type: entity parent: DoorElectronics @@ -14,6 +20,10 @@ components: - type: AccessReader access: [["HeadOfPersonnel"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end - type: entity parent: DoorElectronics @@ -22,6 +32,14 @@ components: - type: AccessReader access: [["Command"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + + # Service - type: entity @@ -31,6 +49,15 @@ components: - type: AccessReader access: [["Bar"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + + - type: entity parent: DoorElectronics @@ -39,6 +66,15 @@ components: - type: AccessReader access: [["Bar"], ["Kitchen"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + + - type: entity parent: DoorElectronics @@ -47,6 +83,14 @@ components: - type: AccessReader access: [["Hydroponics"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -55,6 +99,15 @@ components: - type: AccessReader access: [["Chapel"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + + - type: entity parent: DoorElectronics @@ -63,6 +116,15 @@ components: - type: AccessReader access: [["Theatre"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + + - type: entity parent: DoorElectronics @@ -71,6 +133,15 @@ components: - type: AccessReader access: [["Kitchen"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + + - type: entity parent: DoorElectronics @@ -79,6 +150,15 @@ components: - type: AccessReader access: [["Kitchen"], ["Hydroponics"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + + - type: entity parent: DoorElectronics @@ -87,6 +167,14 @@ components: - type: AccessReader access: [["Janitor"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -95,6 +183,15 @@ components: - type: AccessReader access: [["Lawyer"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + + - type: entity parent: DoorElectronics @@ -103,6 +200,14 @@ components: - type: AccessReader access: [["Service"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + # Cargo - type: entity @@ -112,6 +217,10 @@ components: - type: AccessReader access: [["Quartermaster"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end - type: entity parent: DoorElectronics @@ -120,6 +229,14 @@ components: - type: AccessReader access: [["Salvage"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -128,6 +245,14 @@ components: - type: AccessReader access: [["Cargo"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + # Engineering - type: entity @@ -137,6 +262,10 @@ components: - type: AccessReader access: [["ChiefEngineer"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end - type: entity parent: DoorElectronics @@ -145,6 +274,13 @@ components: - type: AccessReader access: [["Atmospherics"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -153,6 +289,13 @@ components: - type: AccessReader access: [["Engineering"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + # Science - type: entity @@ -162,6 +305,14 @@ components: - type: AccessReader access: [["Medical"], ["Detective"], ["Chapel"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -170,6 +321,10 @@ components: - type: AccessReader access: [["ResearchDirector"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end - type: entity parent: DoorElectronics @@ -178,6 +333,14 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -186,6 +349,13 @@ components: - type: AccessReader access: [["Research"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end # Security - type: entity @@ -195,6 +365,11 @@ components: - type: AccessReader access: [["HeadOfSecurity"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -203,6 +378,10 @@ components: - type: AccessReader access: [["Armory"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end - type: entity parent: DoorElectronics @@ -211,6 +390,11 @@ components: - type: AccessReader access: [["Detective"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + gamma: GammaAlertAccesses + # Sunrise-end - type: entity parent: DoorElectronics @@ -219,6 +403,11 @@ components: - type: AccessReader access: [["Security"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -227,6 +416,11 @@ components: - type: AccessReader access: [["Security"], ["Lawyer"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -235,6 +429,11 @@ components: - type: AccessReader access: [["Brig"]] + # Sunrise-start + alertAccesses: + yellow: YellowAlertAccesses + delta: AllAccess + # Sunrise-end # Medical - type: entity @@ -244,6 +443,11 @@ components: - type: AccessReader access: [["ChiefMedicalOfficer"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -252,6 +456,13 @@ components: - type: AccessReader access: [["Chemistry"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end - type: entity parent: DoorElectronics @@ -260,6 +471,13 @@ components: - type: AccessReader access: [["Medical"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + yellow: YellowAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end # Syndicate - type: entity @@ -294,6 +512,12 @@ components: - type: AccessReader access: [["External"]] + # Sunrise-start + alertAccesses: + red: RedAlertAccesses + gamma: GammaAlertAccesses + delta: AllAccess + # Sunrise-end - type: entity parent: DoorElectronics @@ -302,6 +526,11 @@ components: - type: AccessReader access: [["Maintenance"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end + - type: entity parent: DoorElectronics @@ -310,3 +539,8 @@ components: - type: AccessReader access: [["Security"], ["Command"]] + # Sunrise-start + alertAccesses: + delta: AllAccess + # Sunrise-end + diff --git a/Resources/Prototypes/_Sunrise/Access/AccessGroup/access_group.yml b/Resources/Prototypes/_Sunrise/Access/AccessGroup/access_group.yml new file mode 100644 index 00000000000..2fcad8782a6 --- /dev/null +++ b/Resources/Prototypes/_Sunrise/Access/AccessGroup/access_group.yml @@ -0,0 +1,29 @@ +- type: accessGroup + id: RedAlertAccesses + tags: + - HeadOfSecurity + - Security + - Armory + - Detective + +- type: accessGroup + id: BlueAlertAccesses + tags: + - HeadOfSecurity + - Security + - Detective + +- type: accessGroup + id: YellowAlertAccesses + tags: + - ChiefEngineer + - Atmospherics + +- type: accessGroup + id: GammaAlertAccesses + tags: + - HeadOfSecurity + - Security + - Armory + - Detective +