diff --git a/Content.Client/Doors/AirlockVisualizer.cs b/Content.Client/Doors/AirlockVisualizer.cs index 6b4b877db8..03a2fb1071 100644 --- a/Content.Client/Doors/AirlockVisualizer.cs +++ b/Content.Client/Doors/AirlockVisualizer.cs @@ -160,7 +160,6 @@ namespace Content.Client.Doors var door = _entMan.GetComponent(component.Owner); var unlitVisible = true; var boltedVisible = false; - var weldedVisible = false; var emergencyLightsVisible = false; if (component.TryGetData(DoorVisuals.BaseRSI, out string baseRsi)) @@ -210,7 +209,6 @@ namespace Content.Client.Doors animPlayer.Play(DenyAnimation, AnimationKey); break; case DoorState.Welded: - weldedVisible = true; break; case DoorState.Emagging: animPlayer.Play(EmaggingAnimation, AnimationKey); @@ -236,7 +234,6 @@ namespace Content.Client.Doors if (!_simpleVisuals) { sprite.LayerSetVisible(DoorVisualLayers.BaseUnlit, unlitVisible && state != DoorState.Closed && state != DoorState.Welded); - sprite.LayerSetVisible(DoorVisualLayers.BaseWelded, weldedVisible); sprite.LayerSetVisible(DoorVisualLayers.BaseBolted, unlitVisible && boltedVisible); if (_emergencyAccessLayer) { @@ -255,7 +252,6 @@ namespace Content.Client.Doors { Base, BaseUnlit, - BaseWelded, BaseBolted, BaseEmergencyAccess, } diff --git a/Content.Client/Storage/Visualizers/StorageVisualizer.cs b/Content.Client/Storage/Visualizers/StorageVisualizer.cs index a48e0535db..0b8216eb40 100644 --- a/Content.Client/Storage/Visualizers/StorageVisualizer.cs +++ b/Content.Client/Storage/Visualizers/StorageVisualizer.cs @@ -76,21 +76,12 @@ namespace Content.Client.Storage.Visualizers sprite.LayerSetState(StorageVisualLayers.Lock, locked ? "locked" : "unlocked"); } } - - if (component.TryGetData(StorageVisuals.CanWeld, out bool canWeld) && canWeld) - { - if (component.TryGetData(StorageVisuals.Welded, out bool weldedVal)) - { - sprite.LayerSetVisible(StorageVisualLayers.Welded, weldedVal); - } - } } } public enum StorageVisualLayers : byte { Door, - Welded, Lock } } diff --git a/Content.Client/Tools/Components/WeldableComponent.cs b/Content.Client/Tools/Components/WeldableComponent.cs new file mode 100644 index 0000000000..36fd9bc911 --- /dev/null +++ b/Content.Client/Tools/Components/WeldableComponent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Tools.Components; + +namespace Content.Client.Tools.Components; + +[RegisterComponent] +public sealed class WeldableComponent : SharedWeldableComponent +{ + +} diff --git a/Content.Client/Tools/Visualizers/WeldableVisualizerSystem.cs b/Content.Client/Tools/Visualizers/WeldableVisualizerSystem.cs new file mode 100644 index 0000000000..42254f27c9 --- /dev/null +++ b/Content.Client/Tools/Visualizers/WeldableVisualizerSystem.cs @@ -0,0 +1,22 @@ +using Content.Client.Tools.Components; +using Content.Shared.Tools.Components; +using Robust.Client.GameObjects; + +namespace Content.Client.Tools.Visualizers; + +public sealed class WeldableVisualizerSystem : VisualizerSystem +{ + protected override void OnAppearanceChange(EntityUid uid, WeldableComponent component, ref AppearanceChangeEvent args) + { + base.OnAppearanceChange(uid, component, ref args); + + if (!TryComp(uid, out SpriteComponent? sprite)) + return; + + args.Component.TryGetData(WeldableVisuals.IsWelded, out bool isWelded); + if (sprite.LayerMapTryGet(WeldableLayers.BaseWelded, out var layer)) + { + sprite.LayerSetVisible(layer, isWelded); + } + } +} diff --git a/Content.Server/Doors/Systems/DoorSystem.cs b/Content.Server/Doors/Systems/DoorSystem.cs index 26f420fae0..b1f539d594 100644 --- a/Content.Server/Doors/Systems/DoorSystem.cs +++ b/Content.Server/Doors/Systems/DoorSystem.cs @@ -18,6 +18,7 @@ using Robust.Shared.Containers; using Robust.Shared.Physics.Dynamics; using Robust.Shared.Player; using System.Linq; +using Content.Server.Tools.Systems; using Content.Shared.Tools.Components; namespace Content.Server.Doors.Systems; @@ -39,8 +40,8 @@ public sealed class DoorSystem : SharedDoorSystem SubscribeLocalEvent(OnPryFinished); SubscribeLocalEvent(OnPryCancelled); - SubscribeLocalEvent(OnWeldFinished); - SubscribeLocalEvent(OnWeldCancelled); + SubscribeLocalEvent(OnWeldAttempt); + SubscribeLocalEvent(OnWeldChanged); SubscribeLocalEvent(OnEmagged); } @@ -129,32 +130,27 @@ public sealed class DoorSystem : SharedDoorSystem args.Handled = TryPryDoor(uid, args.Used, args.User, door); return; } + } - if (door.Weldable && tool.Qualities.Contains(door.WeldingQuality)) + private void OnWeldAttempt(EntityUid uid, DoorComponent component, WeldableAttemptEvent args) + { + if (component.CurrentlyCrushing.Count > 0) { - args.Handled = TryWeldDoor(uid, args.Used, args.User, door); + args.Cancel(); + return; + } + if (component.State != DoorState.Closed && component.State != DoorState.Welded) + { + args.Cancel(); } } - /// - /// Attempt to weld a door shut, or unweld it if it is already welded. This does not actually check if the user - /// is holding the correct tool. - /// - private bool TryWeldDoor(EntityUid target, EntityUid used, EntityUid user, DoorComponent door) + private void OnWeldChanged(EntityUid uid, DoorComponent component, WeldableChangedEvent args) { - if (!door.Weldable || door.BeingWelded || door.CurrentlyCrushing.Count > 0) - return false; - - // is the door in a weld-able state? - if (door.State != DoorState.Closed && door.State != DoorState.Welded) - return false; - - // perform a do-after delay - door.BeingWelded = true; - _toolSystem.UseTool(used, user, target, 3f, 3f, door.WeldingQuality, - new WeldFinishedEvent(), new WeldCancelledEvent(), target); - - return true; // we might not actually succeeded, but a do-after has started + if (component.State == DoorState.Closed) + SetState(uid, DoorState.Welded, component); + else if (component.State == DoorState.Welded) + SetState(uid, DoorState.Closed, component); } /// @@ -182,24 +178,6 @@ public sealed class DoorSystem : SharedDoorSystem return true; // we might not actually succeeded, but a do-after has started } - private void OnWeldCancelled(EntityUid uid, DoorComponent door, WeldCancelledEvent args) - { - door.BeingWelded = false; - } - - private void OnWeldFinished(EntityUid uid, DoorComponent door, WeldFinishedEvent args) - { - door.BeingWelded = false; - - if (!door.Weldable) - return; - - if (door.State == DoorState.Closed) - SetState(uid, DoorState.Welded, door); - else if (door.State == DoorState.Welded) - SetState(uid, DoorState.Closed, door); - } - private void OnPryCancelled(EntityUid uid, DoorComponent door, PryCancelledEvent args) { door.BeingPried = false; @@ -324,5 +302,4 @@ public sealed class DoorSystem : SharedDoorSystem public sealed class PryFinishedEvent : EntityEventArgs { } public sealed class PryCancelledEvent : EntityEventArgs { } -public sealed class WeldFinishedEvent : EntityEventArgs { } -public sealed class WeldCancelledEvent : EntityEventArgs { } + diff --git a/Content.Server/Storage/Components/EntityStorageComponent.cs b/Content.Server/Storage/Components/EntityStorageComponent.cs index 484740399c..2895c0a849 100644 --- a/Content.Server/Storage/Components/EntityStorageComponent.cs +++ b/Content.Server/Storage/Components/EntityStorageComponent.cs @@ -29,7 +29,7 @@ namespace Content.Server.Storage.Components [Virtual] [ComponentReference(typeof(IActivate))] [ComponentReference(typeof(IStorageComponent))] - public class EntityStorageComponent : Component, IActivate, IStorageComponent, IInteractUsing + public class EntityStorageComponent : Component, IActivate, IStorageComponent { [Dependency] private readonly IEntityManager _entMan = default!; @@ -72,15 +72,6 @@ namespace Content.Server.Storage.Components [DataField("open")] public bool Open; - [DataField("weldingQuality", customTypeSerializer:typeof(PrototypeIdSerializer))] - private string _weldingQuality = "Welding"; - - [DataField("CanWeldShut")] - private bool _canWeldShut = true; - - [DataField("IsWeldedShut")] - private bool _isWeldedShut; - [DataField("closeSound")] private SoundSpecifier _closeSound = new SoundPathSpecifier("/Audio/Effects/closetclose.ogg"); @@ -116,32 +107,7 @@ namespace Content.Server.Storage.Components } [ViewVariables(VVAccess.ReadWrite)] - public bool IsWeldedShut - { - get => _isWeldedShut; - set - { - if (_isWeldedShut == value) return; - - _isWeldedShut = value; - UpdateAppearance(); - } - } - - private bool _beingWelded; - - [ViewVariables(VVAccess.ReadWrite)] - public bool CanWeldShut - { - get => _canWeldShut; - set - { - if (_canWeldShut == value) return; - - _canWeldShut = value; - UpdateAppearance(); - } - } + public bool IsWeldedShut; [ViewVariables(VVAccess.ReadWrite)] public float EnteringRange @@ -165,8 +131,6 @@ namespace Content.Server.Storage.Components { EntitySystem.Get().SetPlaceable(Owner, Open, surface); } - - UpdateAppearance(); } public virtual void Activate(ActivateEventArgs eventArgs) @@ -296,15 +260,6 @@ namespace Content.Server.Storage.Components SoundSystem.Play(Filter.Pvs(Owner), _openSound.GetSound(), Owner); } - private void UpdateAppearance() - { - if (_entMan.TryGetComponent(Owner, out AppearanceComponent? appearance)) - { - appearance.SetData(StorageVisuals.CanWeld, _canWeldShut); - appearance.SetData(StorageVisuals.Welded, _isWeldedShut); - } - } - private void ModifyComponents() { if (!_isCollidableWhenOpen && _entMan.TryGetComponent(Owner, out var manager) @@ -409,48 +364,6 @@ namespace Content.Server.Storage.Components return Contents.CanInsert(entity); } - async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) - { - if (_beingWelded) - return false; - - if (Open) - { - _beingWelded = false; - return false; - } - - if (!CanWeldShut) - { - _beingWelded = false; - return false; - } - - if (Contents.Contains(eventArgs.User)) - { - _beingWelded = false; - Owner.PopupMessage(eventArgs.User, Loc.GetString("entity-storage-component-already-contains-user-message")); - return false; - } - - if (_beingWelded) - return false; - - _beingWelded = true; - - var toolSystem = EntitySystem.Get(); - - if (!await toolSystem.UseTool(eventArgs.Using, eventArgs.User, Owner, 1f, 1f, _weldingQuality)) - { - _beingWelded = false; - return false; - } - - _beingWelded = false; - IsWeldedShut ^= true; - return true; - } - protected virtual IEnumerable DetermineCollidingEntities() { var entityLookup = EntitySystem.Get(); diff --git a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs index e4895bf5dc..c5f97b8acc 100644 --- a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs @@ -1,18 +1,47 @@ using System.Linq; +using Content.Server.Popups; using Content.Server.Storage.Components; +using Content.Server.Tools.Systems; using Content.Shared.Destructible; +using Content.Shared.Interaction; using Robust.Shared.Physics; +using Robust.Shared.Player; namespace Content.Server.Storage.EntitySystems; public sealed class EntityStorageSystem : EntitySystem { + [Dependency] private readonly PopupSystem _popupSystem = default!; + public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnWeldableAttempt); + SubscribeLocalEvent(OnWelded); SubscribeLocalEvent(OnDestroy); } + private void OnWeldableAttempt(EntityUid uid, EntityStorageComponent component, WeldableAttemptEvent args) + { + if (component.Open) + { + args.Cancel(); + return; + } + + if (component.Contents.Contains(args.User)) + { + var msg = Loc.GetString("entity-storage-component-already-contains-user-message"); + _popupSystem.PopupEntity(msg, args.User, Filter.Entities(args.User)); + args.Cancel(); + } + } + + private void OnWelded(EntityUid uid, EntityStorageComponent component, WeldableChangedEvent args) + { + component.IsWeldedShut = args.IsWelded; + } + private void OnDestroy(EntityUid uid, EntityStorageComponent component, DestructionEventArgs args) { component.Open = true; diff --git a/Content.Server/Tools/Components/WeldableComponent.cs b/Content.Server/Tools/Components/WeldableComponent.cs new file mode 100644 index 0000000000..289a6f354f --- /dev/null +++ b/Content.Server/Tools/Components/WeldableComponent.cs @@ -0,0 +1,61 @@ +using Content.Server.Tools.Systems; +using Content.Shared.Tools; +using Content.Shared.Tools.Components; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.Tools.Components; + +/// +/// Allows users to weld/unweld doors, crates and lockers. +/// +[RegisterComponent] +[Friend(typeof(WeldableSystem))] +public sealed class WeldableComponent : SharedWeldableComponent +{ + /// + /// Tool quality for welding. + /// + [DataField("weldingQuality", customTypeSerializer: typeof(PrototypeIdSerializer))] + [ViewVariables(VVAccess.ReadWrite)] + public string WeldingQuality = "Welding"; + + /// + /// Whether this entity can ever be welded shut. + /// + [DataField("weldable")] + [ViewVariables(VVAccess.ReadWrite)] + public bool Weldable = true; + + /// + /// How much fuel does it take to weld/unweld entity. + /// + [DataField("fuel")] + [ViewVariables(VVAccess.ReadWrite)] + public float FuelConsumption = 1f; + + /// + /// How much time does it take to weld/unweld entity. + /// + [DataField("time")] + [ViewVariables(VVAccess.ReadWrite)] + public TimeSpan WeldingTime = TimeSpan.FromSeconds(1f); + + /// + /// Shown when welded entity is examined. + /// + [DataField("weldedExamineMessage")] + [ViewVariables(VVAccess.ReadWrite)] + public string? WeldedExamineMessage = "weldable-component-examine-is-welded"; + + /// + /// Whether something is currently using a welder on this so DoAfter isn't spammed. + /// + [ViewVariables(VVAccess.ReadOnly)] + public bool BeingWelded; + + /// + /// Is this entity currently welded shut? + /// + [ViewVariables(VVAccess.ReadOnly)] + public bool IsWelded; +} diff --git a/Content.Server/Tools/Systems/WeldableSystem.cs b/Content.Server/Tools/Systems/WeldableSystem.cs new file mode 100644 index 0000000000..c9205c294b --- /dev/null +++ b/Content.Server/Tools/Systems/WeldableSystem.cs @@ -0,0 +1,159 @@ +using Content.Server.Tools.Components; +using Content.Shared.Examine; +using Content.Shared.Interaction; +using Content.Shared.Tools.Components; + +namespace Content.Server.Tools.Systems; + +public sealed class WeldableSystem : EntitySystem +{ + [Dependency] private readonly ToolSystem _toolSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInteractUsing); + SubscribeLocalEvent(OnWeldFinished); + SubscribeLocalEvent(OnWeldCanceled); + SubscribeLocalEvent(OnExamine); + } + + private void OnExamine(EntityUid uid, WeldableComponent component, ExaminedEvent args) + { + if (component.IsWelded && component.WeldedExamineMessage != null) + args.PushText(Loc.GetString(component.WeldedExamineMessage)); + } + + private void OnInteractUsing(EntityUid uid, WeldableComponent component, InteractUsingEvent args) + { + if (args.Handled) + return; + + args.Handled = TryWeld(uid, args.Used, args.User, component); + } + + private bool CanWeld(EntityUid uid, EntityUid tool, EntityUid user, WeldableComponent? component = null) + { + if (!Resolve(uid, ref component)) + return false; + + // Basic checks + if (!component.Weldable || component.BeingWelded) + return false; + if (!_toolSystem.HasQuality(tool, component.WeldingQuality)) + return false; + + // Other component systems + var attempt = new WeldableAttemptEvent(user, tool); + RaiseLocalEvent(uid, attempt); + if (attempt.Cancelled) + return false; + + return true; + } + + private bool TryWeld(EntityUid uid, EntityUid tool, EntityUid user, WeldableComponent? component = null) + { + if (!Resolve(uid, ref component)) + return false; + + if (!CanWeld(uid, tool, user, component)) + return false; + + component.BeingWelded = true; + _toolSystem.UseTool(tool, user, uid, component.FuelConsumption, + component.WeldingTime.Seconds, component.WeldingQuality, + new WeldFinishedEvent(user, tool), new WeldCancelledEvent(), uid); + + return true; + } + + private void OnWeldFinished(EntityUid uid, WeldableComponent component, WeldFinishedEvent args) + { + component.BeingWelded = false; + + // Check if target is still valid + if (!CanWeld(uid, args.Tool, args.User, component)) + return; + + component.IsWelded = !component.IsWelded; + RaiseLocalEvent(uid, new WeldableChangedEvent(component.IsWelded)); + + UpdateAppearance(uid, component); + } + + private void OnWeldCanceled(EntityUid uid, WeldableComponent component, WeldCancelledEvent args) + { + component.BeingWelded = false; + } + + private void UpdateAppearance(EntityUid uid, WeldableComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + + if (!TryComp(uid, out AppearanceComponent? appearance)) + return; + appearance.SetData(WeldableVisuals.IsWelded, component.IsWelded); + } + + public void SetWeldingTime(EntityUid uid, TimeSpan time, WeldableComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + component.WeldingTime = time; + } + + /// + /// Raised after welding do_after has finished. It doesn't guarantee success, + /// use to get updated status. + /// + private sealed class WeldFinishedEvent : EntityEventArgs + { + public readonly EntityUid User; + public readonly EntityUid Tool; + + public WeldFinishedEvent(EntityUid user, EntityUid tool) + { + User = user; + Tool = tool; + } + } + + /// + /// Raised when entity welding has failed. + /// + private sealed class WeldCancelledEvent : EntityEventArgs + { + + } +} + +/// +/// Checks that entity can be weld/unweld. +/// Raised twice: before do_after and after to check that entity still valid. +/// +public sealed class WeldableAttemptEvent : CancellableEntityEventArgs +{ + public readonly EntityUid User; + public readonly EntityUid Tool; + + public WeldableAttemptEvent(EntityUid user, EntityUid tool) + { + User = user; + Tool = tool; + } +} + +/// +/// Raised when has changed. +/// +public sealed class WeldableChangedEvent : EntityEventArgs +{ + public readonly bool IsWelded; + + public WeldableChangedEvent(bool isWelded) + { + IsWelded = isWelded; + } +} diff --git a/Content.Shared/Doors/Components/DoorComponent.cs b/Content.Shared/Doors/Components/DoorComponent.cs index 5dd2e49636..30eb7a7382 100644 --- a/Content.Shared/Doors/Components/DoorComponent.cs +++ b/Content.Shared/Doors/Components/DoorComponent.cs @@ -75,24 +75,6 @@ public sealed class DoorComponent : Component, ISerializationHooks public bool Partial; #endregion - #region Welding - // TODO WELDING. Consider creating a WeldableComponent for use with doors, crates and lockers? Currently they all - // have their own welding logic. - [DataField("weldingQuality", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string WeldingQuality = "Welding"; - - /// - /// Whether the door can ever be welded shut. - /// - [DataField("weldable")] - public bool Weldable = true; - - /// - /// Whether something is currently using a welder on this so DoAfter isn't spammed. - /// - public bool BeingWelded; - #endregion - public bool BeingPried; #region Sounds diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.cs index 103327b0e9..e94a396bd7 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.cs @@ -47,7 +47,6 @@ public abstract class SharedDoorSystem : EntitySystem SubscribeLocalEvent(OnHandleState); SubscribeLocalEvent(OnActivate); - SubscribeLocalEvent(OnExamine); SubscribeLocalEvent(HandleCollide); SubscribeLocalEvent(PreventCollision); @@ -173,12 +172,6 @@ public abstract class SharedDoorSystem : EntitySystem args.Handled = true; } - private void OnExamine(EntityUid uid, DoorComponent door, ExaminedEvent args) - { - if (door.State == DoorState.Welded) - args.PushText(Loc.GetString("door-component-examine-is-welded")); - } - /// /// Update the door state/visuals and play an access denied sound when a user without access interacts with the /// door. diff --git a/Content.Shared/Storage/SharedStorageComponent.cs b/Content.Shared/Storage/SharedStorageComponent.cs index cf6738ba43..8bd1229c89 100644 --- a/Content.Shared/Storage/SharedStorageComponent.cs +++ b/Content.Shared/Storage/SharedStorageComponent.cs @@ -78,11 +78,9 @@ namespace Content.Shared.Storage [NetSerializable] [Serializable] - public enum StorageVisuals + public enum StorageVisuals : byte { Open, - CanWeld, - Welded, CanLock, Locked } diff --git a/Content.Shared/Tools/Components/SharedWeldable.cs b/Content.Shared/Tools/Components/SharedWeldable.cs new file mode 100644 index 0000000000..b5bf0b6dd5 --- /dev/null +++ b/Content.Shared/Tools/Components/SharedWeldable.cs @@ -0,0 +1,20 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Tools.Components; + +public abstract class SharedWeldableComponent : Component +{ + +} + +[Serializable, NetSerializable] +public enum WeldableVisuals : byte +{ + IsWelded +} + +[Serializable, NetSerializable] +public enum WeldableLayers : byte +{ + BaseWelded +} diff --git a/Resources/Locale/en-US/doors/components/door-component.ftl b/Resources/Locale/en-US/doors/components/door-component.ftl deleted file mode 100644 index dc73a01e5d..0000000000 --- a/Resources/Locale/en-US/doors/components/door-component.ftl +++ /dev/null @@ -1 +0,0 @@ -door-component-examine-is-welded = It has been welded shut. \ No newline at end of file diff --git a/Resources/Locale/en-US/tools/components/weldable-component.ftl b/Resources/Locale/en-US/tools/components/weldable-component.ftl new file mode 100644 index 0000000000..f1a7b21d9d --- /dev/null +++ b/Resources/Locale/en-US/tools/components/weldable-component.ftl @@ -0,0 +1 @@ +weldable-component-examine-is-welded = It has been welded shut. diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml index 9cd03f6b93..d2b79632f4 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml @@ -153,7 +153,6 @@ netsync: false - type: EntityStorage Capacity: 8 - CanWeldShut: false - type: PlaceableSurface placeCentered: true - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml index d09647e366..4a0bf9447a 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml @@ -39,7 +39,6 @@ mask: - Impassable - type: BodyBagEntityStorage - CanWeldShut: false Capacity: 1 IsCollidableWhenOpen: true closeSound: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml index 82d7eeac12..20a425b088 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml @@ -19,7 +19,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: locked map: ["enum.StorageVisualLayers.Lock"] shader: unshaded @@ -42,7 +42,7 @@ state: artifact_container_icon - type: ArtifactStorage Capacity: 1 - CanWeldShut: true + - type: Weldable - type: SuppressArtifactContainer - type: PlaceableSurface - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 9cb2d6d29f..720a8ebb1b 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -15,7 +15,7 @@ shader: unshaded map: ["enum.DoorVisualLayers.BaseUnlit"] - state: welded - map: ["enum.DoorVisualLayers.BaseWelded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: bolted_unlit shader: unshaded map: ["enum.DoorVisualLayers.BaseBolted"] @@ -48,6 +48,9 @@ path: /Audio/Machines/airlock_close.ogg denySound: path: /Audio/Machines/airlock_deny.ogg + - type: Weldable + fuel: 3 + time: 3 - type: Airlock - type: Appearance visuals: diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml index 12652166b0..7b1bda79bc 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml @@ -16,7 +16,7 @@ shader: unshaded map: ["enum.DoorVisualLayers.BaseUnlit"] - state: welded - map: ["enum.DoorVisualLayers.BaseWelded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: bolted_unlit shader: unshaded map: ["enum.DoorVisualLayers.BaseBolted"] @@ -71,7 +71,7 @@ shader: unshaded map: ["enum.DoorVisualLayers.BaseUnlit"] - state: welded - map: ["enum.DoorVisualLayers.BaseWelded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: bolted_unlit shader: unshaded map: ["enum.DoorVisualLayers.BaseBolted"] diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index de7857e72a..9636831c3c 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -36,7 +36,7 @@ shader: unshaded map: ["enum.DoorVisualLayers.BaseUnlit"] - state: welded - map: ["enum.DoorVisualLayers.BaseWelded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: bolted_unlit shader: unshaded map: ["enum.DoorVisualLayers.BaseBolted"] @@ -73,6 +73,9 @@ path: /Audio/Machines/airlock_close.ogg denySound: path: /Audio/Machines/airlock_deny.ogg + - type: Weldable + fuel: 3 + time: 3 - type: Firelock - type: Appearance visuals: diff --git a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml index 9252d97026..118dc3d485 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml @@ -30,7 +30,6 @@ - type: Door bumpOpen: false clickOpen: true - weldable: false canCrush: false closeTimeOne: 0.2 closeTimeTwo: 0.6 @@ -89,7 +88,6 @@ - type: Door bumpOpen: false clickOpen: true - weldable: false closeTimeOne: 0.2 closeTimeTwo: 0.6 openTimeOne: 0.6 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml index a6ed846668..f991ad2dc8 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml @@ -41,6 +41,9 @@ path: /Audio/Machines/blastdoor.ogg closeSound: path: /Audio/Machines/blastdoor.ogg + - type: Weldable + fuel: 3 + time: 3 - type: Appearance visuals: - type: AirlockVisualizer diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml index 9cad63e93a..2ec4aea2d0 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml @@ -30,7 +30,7 @@ shader: unshaded map: ["enum.DoorVisualLayers.BaseUnlit"] - state: welded - map: ["enum.DoorVisualLayers.BaseWelded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: bolted_unlit shader: unshaded map: ["enum.DoorVisualLayers.BaseBolted"] @@ -75,7 +75,6 @@ safety: false - type: Door canCrush: false - weldable: false board: DoorElectronics openSound: path: /Audio/Machines/windoor_open.ogg @@ -123,7 +122,7 @@ shader: unshaded map: [ "enum.DoorVisualLayers.BaseUnlit" ] - state: welded - map: [ "enum.DoorVisualLayers.BaseWelded" ] + map: [ "enum.WeldableLayers.BaseWelded" ] - state: bolted_unlit shader: unshaded map: [ "enum.DoorVisualLayers.BaseBolted" ] diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml index fa7eb140b0..caa1fe0b76 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml @@ -18,7 +18,7 @@ shader: unshaded - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml index df1bbae7a6..4395560024 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml @@ -17,7 +17,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: MovedByPressure - type: DamageOnHighSpeedImpact damage: @@ -41,6 +41,7 @@ - MobImpassable - SmallImpassable - type: EntityStorage + - type: Weldable - type: PlaceableSurface placeCentered: true - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml index caf8af5365..4a41b255e4 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml @@ -16,7 +16,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: InteractionOutline - type: Physics - type: Fixtures @@ -34,7 +34,7 @@ - SmallImpassable - type: EntityStorage Capacity: 500 - CanWeldShut: true + - type: Weldable - type: PlaceableSurface - type: Damageable damageContainer: Inorganic @@ -79,7 +79,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: InteractionOutline - type: Physics - type: Fixtures @@ -97,7 +97,7 @@ - SmallImpassable - type: EntityStorage Capacity: 500 - CanWeldShut: true + - type: Weldable - type: PlaceableSurface - type: Damageable damageContainer: Inorganic diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml index bdbf8db105..3fc29ca444 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml @@ -11,7 +11,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/generic.rsi state: crate_icon @@ -38,7 +38,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/plastic.rsi state: plasticcrate_icon @@ -64,7 +64,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/freezer.rsi state: freezer_icon @@ -90,7 +90,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/hydro.rsi state: hydrocrate_icon @@ -116,7 +116,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/medical.rsi state: medicalcrate_icon @@ -143,7 +143,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/radiation.rsi state: radiationcrate_icon @@ -169,7 +169,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/o2.rsi state: o2crate_icon @@ -195,7 +195,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/electricalcrate.rsi state: electricalcrate_icon @@ -221,7 +221,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/engicrate.rsi state: engicrate_icon @@ -247,7 +247,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/scicrate.rsi state: scicrate_icon @@ -273,7 +273,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - type: Icon sprite: Structures/Storage/Crates/surgerycrate.rsi state: surgerycrate_icon @@ -304,7 +304,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: locked map: ["enum.StorageVisualLayers.Lock"] shader: unshaded @@ -333,7 +333,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: locked map: ["enum.StorageVisualLayers.Lock"] shader: unshaded @@ -362,7 +362,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: locked map: ["enum.StorageVisualLayers.Lock"] shader: unshaded @@ -390,7 +390,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: locked map: ["enum.StorageVisualLayers.Lock"] shader: unshaded @@ -419,7 +419,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: locked map: ["enum.StorageVisualLayers.Lock"] shader: unshaded @@ -448,7 +448,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: locked map: ["enum.StorageVisualLayers.Lock"] shader: unshaded @@ -476,7 +476,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: locked map: ["enum.StorageVisualLayers.Lock"] shader: unshaded @@ -505,7 +505,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: locked map: ["enum.StorageVisualLayers.Lock"] shader: unshaded @@ -560,7 +560,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: welded visible: false - map: ["enum.StorageVisualLayers.Welded"] + map: ["enum.WeldableLayers.BaseWelded"] - state: locked map: ["enum.StorageVisualLayers.Lock"] shader: unshaded @@ -580,7 +580,6 @@ components: - type: EntityStorage Capacity: 500 - CanWeldShut: false - type: Sprite sprite: Structures/Storage/Crates/livestock.rsi layers: diff --git a/Resources/Prototypes/Entities/Structures/Storage/morgue.yml b/Resources/Prototypes/Entities/Structures/Storage/morgue.yml index f48cc49efe..6f41dd72f0 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/morgue.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/morgue.yml @@ -34,7 +34,6 @@ - VaultImpassable - SmallImpassable - type: MorgueEntityStorage - CanWeldShut: false IsCollidableWhenOpen: true Capacity: 1 closeSound: @@ -116,7 +115,6 @@ - VaultImpassable - SmallImpassable - type: CrematoriumEntityStorage - CanWeldShut: false IsCollidableWhenOpen: true Capacity: 1 closeSound: