using Content.Shared.DoAfter; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Lock; /// /// Allows locking/unlocking, with access determined by AccessReader /// [RegisterComponent, NetworkedComponent] [Access(typeof(LockSystem))] [AutoGenerateComponentState] public sealed partial class LockComponent : Component { /// /// Whether or not the lock is locked. /// [DataField("locked"), ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] public bool Locked = true; /// /// Whether or not the lock is locked by simply clicking. /// [DataField("lockOnClick"), ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] public bool LockOnClick; /// /// Whether or not the lock is unlocked by simply clicking. /// [DataField, AutoNetworkedField] public bool UnlockOnClick = true; /// /// The sound played when unlocked. /// [DataField("unlockingSound"), ViewVariables(VVAccess.ReadWrite)] public SoundSpecifier UnlockSound = new SoundPathSpecifier("/Audio/Machines/door_lock_off.ogg") { Params = AudioParams.Default.WithVolume(-5f), }; /// /// The sound played when locked. /// [DataField("lockingSound"), ViewVariables(VVAccess.ReadWrite)] public SoundSpecifier LockSound = new SoundPathSpecifier("/Audio/Machines/door_lock_on.ogg") { Params = AudioParams.Default.WithVolume(-5f) }; /// /// Whether or not an emag disables it. /// [DataField] [AutoNetworkedField] public bool BreakOnAccessBreaker = true; /// /// Amount of do-after time needed to lock the entity. /// /// /// If set to zero, no do-after will be used. /// [DataField] [AutoNetworkedField] public TimeSpan LockTime; /// /// Amount of do-after time needed to unlock the entity. /// /// /// If set to zero, no do-after will be used. /// [DataField] [AutoNetworkedField] public TimeSpan UnlockTime; } /// /// Event raised on the lock when a toggle is attempted. /// Can be cancelled to prevent it. /// [ByRefEvent] public record struct LockToggleAttemptEvent(EntityUid User, bool Silent = false, bool Cancelled = false); /// /// Event raised on the user when a toggle is attempted. /// Can be cancelled to prevent it. /// [ByRefEvent] public record struct UserLockToggleAttemptEvent(EntityUid Target, bool Silent = false, bool Cancelled = false); /// /// Event raised on a lock after it has been toggled. /// [ByRefEvent] public readonly record struct LockToggledEvent(bool Locked); /// /// Used to lock a lockable entity that has a lock time configured. /// /// /// [Serializable, NetSerializable] public sealed partial class LockDoAfter : DoAfterEvent { public override DoAfterEvent Clone() { return this; } } /// /// Used to unlock a lockable entity that has an unlock time configured. /// /// /// [Serializable, NetSerializable] public sealed partial class UnlockDoAfter : DoAfterEvent { public override DoAfterEvent Clone() { return this; } } [NetSerializable] [Serializable] public enum LockVisuals : byte { Locked }