Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Автоматические доступы, что выдаются в зависимости от кода станции #1004

Merged
merged 13 commits into from
Jan 6, 2025
79 changes: 78 additions & 1 deletion Content.Server/Access/Systems/AccessSystem.cs
Original file line number Diff line number Diff line change
@@ -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<AlertLevelChangedEvent>(OnAlertLevelChanged);
}
/// <summary>
/// Запускает обновление уровня аварийных доступов на всех сущностях с AccessReaderComponent
/// </summary>
private void OnAlertLevelChanged(AlertLevelChangedEvent ev)
{

if (!TryComp<AlertLevelComponent>(ev.Station, out var alert))
return;

if (alert.AlertLevels == null)
return;

var query = EntityQueryEnumerator<AccessReaderComponent, TransformComponent>();
while (query.MoveNext(out var uid, out var reader, out var xform))
{

if (CompOrNull<StationMemberComponent>(xform.GridUid)?.Station != ev.Station)
continue;

if (alert.AlertLevels == null)
return;

if (!TryComp<AccessReaderComponent>(uid, out var comp))
return;

if (comp.AlertAccesses.Count == 0)
continue;

Update((uid, reader));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Просто передай сюда текущий уровень и запиши его в компоненте двери.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

данная система уникальная и может не только на двери работать. Залог на будущие возможные приколы

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

По проверкам я сделал так что оно проверяет только те AccessReader`ы, в которых есть значения AlertAccesses. То есть пока в прототипе не пропишешь апдейт проводиться не будет

Dirty(uid, reader);
}
}

/// <summary>
/// Устанавливает значение из прототипа в зависимости от кода
/// </summary>
public void Update(Entity<AccessReaderComponent> entity)
{

if (!TryComp<AlertLevelComponent>(_station.GetOwningStation(entity.Owner), out var alerts))
return;

if (alerts.AlertLevels == null)
return;

var alertLevels = new Dictionary<string, AccessReaderComponent.CurrentAlertLevel>
{
{ "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;
}
}
}
}
36 changes: 35 additions & 1 deletion Content.Shared/Access/Components/AccessReaderComponent.cs
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -20,6 +23,29 @@ public sealed partial class AccessReaderComponent : Component
[DataField]
public bool Enabled = true;

// Sunrise-start

/// <summary>
/// Именно от Group происходит проверка аварийных доступов
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public ProtoId<AccessGroupPrototype> Group = string.Empty;

[ViewVariables(VVAccess.ReadWrite)]
[DataField]
public Dictionary<CurrentAlertLevel, ProtoId<AccessGroupPrototype>> AlertAccesses = new();

[Flags]
public enum CurrentAlertLevel : byte
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем данный enum? Эти доступы уже существуют в игре прототипами.

Copy link
Contributor Author

@kanopus952 kanopus952 Jan 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я не могу их добавить в дикт потому что станционные коды на сервере написаны

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я не могу их добавить в дикт потому что станционные коды на сервере написаны

перенеси их в шейред...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а конфликты с оффами? К тому же придется еще редактировать их системы подвязанные на кодах

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

вроде енум не сильно бьет по оптимизации

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я не могу их добавить в дикт потому что станционные коды на сервере написаны

перенеси их в шейред...

не выйдет, я проверял. Тогда ловишь фантомную ошибку о том что нет прототипа с таким Типом и айди. Да и в целом плохая затея

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я не могу их добавить в дикт потому что станционные коды на сервере написаны

перенеси их в шейред...

не выйдет, я проверял. Тогда ловишь фантомную ошибку о том что нет прототипа с таким Типом и айди. Да и в целом плохая затея

ну это бред, если оффы новый код добавлять в прототипы надо сразу пиздовать и тут его добавлять. В чем проблема заюзать enumeratePrototypes?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а зачем новый код, если все из 13 уже перенесены

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а зачем новый код, если все из 13 уже перенесены

оффы могут новые коды добавить

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

та забей и замерджи уже, даже если добавят там всего 2 строки добавлять

{
blue,
red,
yellow,
gamma,
delta
}
// Sunrise-end

/// <summary>
/// The set of tags that will automatically deny an allowed check, if any of them are present.
/// </summary>
Expand Down Expand Up @@ -100,20 +126,28 @@ public sealed class AccessReaderComponentState : ComponentState

public List<HashSet<ProtoId<AccessLevelPrototype>>> AccessLists;

public ProtoId<AccessGroupPrototype> Group; // Sunrise-alertAccesses, нужно для связывания клиента с сервером

public List<(NetEntity, uint)> AccessKeys;

public Queue<AccessRecord> AccessLog;

public int AccessLogLimit;

public AccessReaderComponentState(bool enabled, HashSet<ProtoId<AccessLevelPrototype>> denyTags, List<HashSet<ProtoId<AccessLevelPrototype>>> accessLists, List<(NetEntity, uint)> accessKeys, Queue<AccessRecord> accessLog, int accessLogLimit)
public AccessReaderComponentState(bool enabled, HashSet<ProtoId<AccessLevelPrototype>> denyTags,
List<HashSet<ProtoId<AccessLevelPrototype>>> accessLists,
ProtoId<AccessGroupPrototype> group,
List<(NetEntity, uint)> accessKeys,
Queue<AccessRecord> accessLog,
int accessLogLimit) //Sunrise-edit
{
Enabled = enabled;
DenyTags = denyTags;
AccessLists = accessLists;
AccessKeys = accessKeys;
AccessLog = accessLog;
AccessLogLimit = accessLogLimit;
Group = group; // Sunrise-alertAccesses
}
}

Expand Down
37 changes: 35 additions & 2 deletions Content.Shared/Access/Systems/AccessReaderSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ public override void Initialize()

private void OnGetState(EntityUid uid, AccessReaderComponent component, ref ComponentGetState args)
{
args.State = new AccessReaderComponentState(component.Enabled, component.DenyTags, component.AccessLists,
_recordsSystem.Convert(component.AccessKeys), component.AccessLog, component.AccessLogLimit);
args.State = new AccessReaderComponentState(component.Enabled, component.DenyTags, component.AccessLists, component.Group,
_recordsSystem.Convert(component.AccessKeys), component.AccessLog, component.AccessLogLimit); // Sunrise-edit
}

private void OnHandleState(EntityUid uid, AccessReaderComponent component, ref ComponentHandleState args)
Expand All @@ -64,6 +64,7 @@ private void OnHandleState(EntityUid uid, AccessReaderComponent component, ref C
component.AccessLists = new(state.AccessLists);
component.DenyTags = new(state.DenyTags);
component.AccessLog = new(state.AccessLog);
component.Group = new(state.Group); // Sunrise-alertAccesses
component.AccessLogLimit = state.AccessLogLimit;
}

Expand Down Expand Up @@ -166,6 +167,11 @@ public bool IsAllowed(
if (!TryComp(entity, out AccessReaderComponent? containedReader))
continue;

// Sunrise-start
if (AreAccessTagsAllowedAlert(access, containedReader))
return true;
// Sunrise-end

if (IsAllowed(access, stationKeys, entity, containedReader))
return true;
}
Expand Down Expand Up @@ -209,6 +215,33 @@ public bool AreAccessTagsAllowed(ICollection<ProtoId<AccessLevelPrototype>> acce
return false;
}

// Sunrise-start
/// <summary>
/// Сравнивает список аварийных доступов с доступами на карте.
/// </summary>
public bool AreAccessTagsAllowedAlert(ICollection<ProtoId<AccessLevelPrototype>> access, AccessReaderComponent reader)
{
if (reader.Group == string.Empty)
return false;

if (!_prototype.TryIndex<AccessGroupPrototype>(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

/// <summary>
/// Compares the given stationrecordkeys with the accessreader to see if it is allowed.
/// </summary>
Expand Down
8 changes: 4 additions & 4 deletions Resources/Locale/ru-RU/_strings/alert-levels/alert-levels.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -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 = Все контракты расторгнуты.
Loading
Loading