using System; using System.Collections.Generic; using Content.Server.GameObjects.Components.Doors; using JetBrains.Annotations; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; namespace Content.Server.GameObjects.EntitySystems { [UsedImplicitly] class DoorSystem : EntitySystem { /// /// Determines the base access behavior of all doors on the station. /// public AccessTypes AccessType { get; set; } /// /// How door access should be handled. /// public enum AccessTypes { /// ID based door access. Id, /// /// Allows everyone to open doors, except external which airlocks are still handled with ID's /// AllowAllIdExternal, /// /// Allows everyone to open doors, except external airlocks which are never allowed, even if the user has /// ID access. /// AllowAllNoExternal, /// Allows everyone to open all doors. AllowAll } private readonly List _activeDoors = new(); public override void Initialize() { base.Initialize(); AccessType = AccessTypes.Id; SubscribeLocalEvent(HandleDoorState); } private void HandleDoorState(DoorStateMessage message) { switch (message.State) { case ServerDoorComponent.DoorState.Closed: _activeDoors.Remove(message.Component); break; case ServerDoorComponent.DoorState.Open: _activeDoors.Add(message.Component); break; case ServerDoorComponent.DoorState.Closing: case ServerDoorComponent.DoorState.Opening: break; default: throw new ArgumentOutOfRangeException(); } } /// public override void Update(float frameTime) { for (var i = _activeDoors.Count - 1; i >= 0; i--) { var comp = _activeDoors[i]; if (comp.Deleted) _activeDoors.RemoveAt(i); comp.OnUpdate(frameTime); } } } }