From cc6acae145f72193ebe8272376095cdfb55bb3d7 Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Wed, 28 Oct 2020 22:51:43 +0000 Subject: [PATCH] Mortician's Menagerie (#2391) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Body bags! * Morgue Trays and the Crematorium! Reorganised body bags to be under Morgue, not Medical * Fix. Things outside of EntityStorageComponents now use the Try*Storage() not just *Storage() methods - Allows mobs to be trapped in a morgue/crematorium whose tray can't open. * Fix tests. Modernise component dependency and nullability. * Update Content.Server/GameObjects/Components/Morgue/MorgueTrayComponent.cs Co-authored-by: Víctor Aguilera Puerto <6766154+Zumorica@users.noreply.github.com> --- .../Components/Morgue/BodyBagVisualizer.cs | 30 +++ .../Morgue/CrematoriumVisualizer.cs | 75 +++++++ .../Components/Morgue/MorgueVisualizer.cs | 81 +++++++ .../Components/Storage/StorageVisualizer.cs | 9 +- Content.Client/IgnoredComponents.cs | 6 +- .../Storage/CursedEntityStorageComponent.cs | 4 +- .../Items/Storage/EntityStorageComponent.cs | 74 +++++-- .../Storage/SecureEntityStorageComponent.cs | 7 +- .../Morgue/BodyBagEntityStorageComponent.cs | 123 +++++++++++ .../CrematoriumEntityStorageComponent.cs | 104 +++++++++ .../Morgue/MorgueEntityStorageComponent.cs | 178 +++++++++++++++ .../Components/Morgue/MorgueTrayComponent.cs | 29 +++ .../Components/Paper/PaperComponent.cs | 8 +- .../GameObjects/EntitySystems/MorgueSystem.cs | 27 +++ .../EntitySystems/StandingStateSystem.cs | 16 ++ .../Components/Storage/SharedMorgue.cs | 26 +++ .../Storage/SharedStorageComponent.cs | 3 +- Resources/Audio/Machines/ding.ogg | Bin 0 -> 25226 bytes Resources/Audio/Misc/zip.ogg | Bin 0 -> 15223 bytes .../Entities/Objects/Specific/medical.yml | 2 +- .../Entities/Objects/Specific/morgue.yml | 202 +++++++++++++++++ .../Specific/Morgue/bodybags.rsi/bag.png | Bin 0 -> 317 bytes .../Specific/Morgue/bodybags.rsi/item.png | Bin 0 -> 227 bytes .../Morgue/bodybags.rsi/label_overlay.png | Bin 0 -> 167 bytes .../Specific/Morgue/bodybags.rsi/meta.json | 47 ++++ .../Morgue/bodybags.rsi/open_overlay.png | Bin 0 -> 377 bytes .../Morgue/morgue.rsi/crema_active_light.png | Bin 0 -> 452 bytes .../Morgue/morgue.rsi/crema_closed.png | Bin 0 -> 1713 bytes .../morgue.rsi/crema_contents_light.png | Bin 0 -> 202 bytes .../Specific/Morgue/morgue.rsi/crema_open.png | Bin 0 -> 1949 bytes .../Specific/Morgue/morgue.rsi/crema_tray.png | Bin 0 -> 1105 bytes .../Specific/Morgue/morgue.rsi/meta.json | 209 ++++++++++++++++++ .../Morgue/morgue.rsi/morgue_closed.png | Bin 0 -> 2616 bytes .../Morgue/morgue.rsi/morgue_nomob_light.png | Bin 0 -> 302 bytes .../Morgue/morgue.rsi/morgue_nosoul_light.png | Bin 0 -> 393 bytes .../Morgue/morgue.rsi/morgue_open.png | Bin 0 -> 2648 bytes .../Morgue/morgue.rsi/morgue_soul_light.png | Bin 0 -> 464 bytes .../Morgue/morgue.rsi/morgue_tray.png | Bin 0 -> 923 bytes 38 files changed, 1225 insertions(+), 35 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Morgue/BodyBagVisualizer.cs create mode 100644 Content.Client/GameObjects/Components/Morgue/CrematoriumVisualizer.cs create mode 100644 Content.Client/GameObjects/Components/Morgue/MorgueVisualizer.cs create mode 100644 Content.Server/GameObjects/Components/Morgue/BodyBagEntityStorageComponent.cs create mode 100644 Content.Server/GameObjects/Components/Morgue/CrematoriumEntityStorageComponent.cs create mode 100644 Content.Server/GameObjects/Components/Morgue/MorgueEntityStorageComponent.cs create mode 100644 Content.Server/GameObjects/Components/Morgue/MorgueTrayComponent.cs create mode 100644 Content.Server/GameObjects/EntitySystems/MorgueSystem.cs create mode 100644 Content.Shared/GameObjects/Components/Storage/SharedMorgue.cs create mode 100644 Resources/Audio/Machines/ding.ogg create mode 100644 Resources/Audio/Misc/zip.ogg create mode 100644 Resources/Prototypes/Entities/Objects/Specific/morgue.yml create mode 100644 Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/bag.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/item.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/label_overlay.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/open_overlay.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/crema_active_light.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/crema_closed.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/crema_contents_light.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/crema_open.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/crema_tray.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/morgue_closed.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/morgue_nomob_light.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/morgue_nosoul_light.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/morgue_open.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/morgue_soul_light.png create mode 100644 Resources/Textures/Objects/Specific/Morgue/morgue.rsi/morgue_tray.png diff --git a/Content.Client/GameObjects/Components/Morgue/BodyBagVisualizer.cs b/Content.Client/GameObjects/Components/Morgue/BodyBagVisualizer.cs new file mode 100644 index 0000000000..a8aa86b777 --- /dev/null +++ b/Content.Client/GameObjects/Components/Morgue/BodyBagVisualizer.cs @@ -0,0 +1,30 @@ +#nullable enable +using Content.Shared.GameObjects.Components.Morgue; +using Robust.Client.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; + +namespace Content.Client.GameObjects.Components.Morgue +{ + public sealed class BodyBagVisualizer : AppearanceVisualizer + { + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + if (!component.Owner.TryGetComponent(out ISpriteComponent? sprite)) + { + return; + } + + if (component.TryGetData(BodyBagVisuals.Label, out bool labelVal)) + { + sprite.LayerSetVisible(BodyBagVisualLayers.Label, labelVal); + } + } + } + + public enum BodyBagVisualLayers + { + Label, + } +} diff --git a/Content.Client/GameObjects/Components/Morgue/CrematoriumVisualizer.cs b/Content.Client/GameObjects/Components/Morgue/CrematoriumVisualizer.cs new file mode 100644 index 0000000000..b7b5b9d8c8 --- /dev/null +++ b/Content.Client/GameObjects/Components/Morgue/CrematoriumVisualizer.cs @@ -0,0 +1,75 @@ +#nullable enable +using Content.Shared.GameObjects.Components.Morgue; +using Robust.Client.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Utility; +using YamlDotNet.RepresentationModel; + +namespace Content.Client.GameObjects.Components.Storage +{ + public sealed class CrematoriumVisualizer : AppearanceVisualizer + { + private string _stateOpen = ""; + private string _stateClosed = ""; + + private string _lightContents = ""; + private string _lightBurning = ""; + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + + if (node.TryGetNode("state_open", out var child)) + { + _stateOpen = child.AsString(); + } + if (node.TryGetNode("state_closed", out child)) + { + _stateClosed = child.AsString(); + } + + if (node.TryGetNode("light_contents", out child)) + { + _lightContents = child.AsString(); + } + if (node.TryGetNode("light_burning", out child)) + { + _lightBurning = child.AsString(); + } + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + if (!component.Owner.TryGetComponent(out ISpriteComponent? sprite)) return; + + sprite.LayerSetState( + CrematoriumVisualLayers.Base, + component.GetData(MorgueVisuals.Open) + ? _stateOpen + : _stateClosed + ); + + var lightState = ""; + if (component.TryGetData(MorgueVisuals.HasContents, out bool hasContents) && hasContents) lightState = _lightContents; + if (component.TryGetData(CrematoriumVisuals.Burning, out bool isBurning) && isBurning) lightState = _lightBurning; + + if (!string.IsNullOrEmpty(lightState)) + { + sprite.LayerSetState(CrematoriumVisualLayers.Light, lightState); + sprite.LayerSetVisible(CrematoriumVisualLayers.Light, true); + } + else + { + sprite.LayerSetVisible(CrematoriumVisualLayers.Light, false); + } + } + } + + public enum CrematoriumVisualLayers + { + Base, + Light, + } +} diff --git a/Content.Client/GameObjects/Components/Morgue/MorgueVisualizer.cs b/Content.Client/GameObjects/Components/Morgue/MorgueVisualizer.cs new file mode 100644 index 0000000000..9f0a10305e --- /dev/null +++ b/Content.Client/GameObjects/Components/Morgue/MorgueVisualizer.cs @@ -0,0 +1,81 @@ +#nullable enable +using Content.Shared.GameObjects.Components.Morgue; +using Robust.Client.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Utility; +using YamlDotNet.RepresentationModel; + +namespace Content.Client.GameObjects.Components.Storage +{ + public sealed class MorgueVisualizer : AppearanceVisualizer + { + private string _stateOpen = ""; + private string _stateClosed = ""; + + private string _lightContents = ""; + private string _lightMob = ""; + private string _lightSoul = ""; + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + + if (node.TryGetNode("state_open", out var child)) + { + _stateOpen = child.AsString(); + } + if (node.TryGetNode("state_closed", out child)) + { + _stateClosed = child.AsString(); + } + + if (node.TryGetNode("light_contents", out child)) + { + _lightContents = child.AsString(); + } + if (node.TryGetNode("light_mob", out child)) + { + _lightMob = child.AsString(); + } + if (node.TryGetNode("light_soul", out child)) + { + _lightSoul = child.AsString(); + } + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + if (!component.Owner.TryGetComponent(out ISpriteComponent? sprite)) return; + + sprite.LayerSetState( + MorgueVisualLayers.Base, + component.GetData(MorgueVisuals.Open) + ? _stateOpen + : _stateClosed + ); + + var lightState = ""; + if (component.TryGetData(MorgueVisuals.HasContents, out bool hasContents) && hasContents) lightState = _lightContents; + if (component.TryGetData(MorgueVisuals.HasMob, out bool hasMob) && hasMob) lightState = _lightMob; + if (component.TryGetData(MorgueVisuals.HasSoul, out bool hasSoul) && hasSoul) lightState = _lightSoul; + + if (!string.IsNullOrEmpty(lightState)) + { + sprite.LayerSetState(MorgueVisualLayers.Light, lightState); + sprite.LayerSetVisible(MorgueVisualLayers.Light, true); + } + else + { + sprite.LayerSetVisible(MorgueVisualLayers.Light, false); + } + } + } + + public enum MorgueVisualLayers + { + Base, + Light, + } +} diff --git a/Content.Client/GameObjects/Components/Storage/StorageVisualizer.cs b/Content.Client/GameObjects/Components/Storage/StorageVisualizer.cs index 926d4e5c7a..e47c035bba 100644 --- a/Content.Client/GameObjects/Components/Storage/StorageVisualizer.cs +++ b/Content.Client/GameObjects/Components/Storage/StorageVisualizer.cs @@ -1,4 +1,4 @@ -using Content.Shared.GameObjects.Components.Storage; +using Content.Shared.GameObjects.Components.Storage; using Robust.Client.GameObjects; using Robust.Client.Interfaces.GameObjects.Components; using Robust.Shared.Interfaces.GameObjects; @@ -74,9 +74,12 @@ namespace Content.Client.GameObjects.Components.Storage } } - if (component.TryGetData(StorageVisuals.Welded, out bool weldedVal)) + if (component.TryGetData(StorageVisuals.CanWeld, out bool canWeld) && canWeld) { - sprite.LayerSetVisible(StorageVisualLayers.Welded, weldedVal); + if (component.TryGetData(StorageVisuals.Welded, out bool weldedVal)) + { + sprite.LayerSetVisible(StorageVisualLayers.Welded, weldedVal); + } } } } diff --git a/Content.Client/IgnoredComponents.cs b/Content.Client/IgnoredComponents.cs index ae8bd8da7c..78b885b449 100644 --- a/Content.Client/IgnoredComponents.cs +++ b/Content.Client/IgnoredComponents.cs @@ -206,7 +206,11 @@ "ParticleAcceleratorEmitter", "ParticleAcceleratorEndCap", "ParticleAcceleratorFuelChamber", - "ParticleAcceleratorPowerBox" + "ParticleAcceleratorPowerBox", + "BodyBagEntityStorage", + "MorgueEntityStorage", + "MorgueTray", + "CrematoriumEntityStorage", }; } } diff --git a/Content.Server/GameObjects/Components/Items/Storage/CursedEntityStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/CursedEntityStorageComponent.cs index f3068de5ce..8f8f1c4eee 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/CursedEntityStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/CursedEntityStorageComponent.cs @@ -22,7 +22,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage public override string Name => "CursedEntityStorage"; - public override void CloseStorage() + protected override void CloseStorage() { base.CloseStorage(); @@ -41,7 +41,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage var locker = lockerEnt.GetComponent(); if(locker.Open) - locker.CloseStorage(); + locker.TryCloseStorage(Owner); foreach (var entity in Contents.ContainedEntities.ToArray()) { diff --git a/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs index da88408b93..a99cb7e586 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs @@ -47,11 +47,15 @@ namespace Content.Server.GameObjects.Components.Items.Storage [ViewVariables] private bool _isCollidableWhenOpen; [ViewVariables] - private IEntityQuery _entityQuery; + protected IEntityQuery EntityQuery; + private bool _showContents; private bool _occludesLight; private bool _open; + private bool _canWeldShut; private bool _isWeldedShut; + private string _closeSound = "/Audio/Machines/closetclose.ogg"; + private string _openSound = "/Audio/Machines/closetopen.ogg"; [ViewVariables] protected Container Contents; @@ -104,14 +108,24 @@ namespace Content.Server.GameObjects.Components.Items.Storage } [ViewVariables(VVAccess.ReadWrite)] - public bool CanWeldShut { get; set; } + public bool CanWeldShut { + get => _canWeldShut; + set + { + _canWeldShut = value; + if (Owner.TryGetComponent(out AppearanceComponent appearance)) + { + appearance.SetData(StorageVisuals.CanWeld, value); + } + } + } /// public override void Initialize() { base.Initialize(); Contents = ContainerManagerComponent.Ensure(nameof(EntityStorageComponent), Owner); - _entityQuery = new IntersectingEntityQuery(Owner); + EntityQuery = new IntersectingEntityQuery(Owner); Contents.ShowContents = _showContents; Contents.OccludesLight = _occludesLight; @@ -134,6 +148,8 @@ namespace Content.Server.GameObjects.Components.Items.Storage serializer.DataField(ref _open, "open", false); serializer.DataField(this, a => a.IsWeldedShut, "IsWeldedShut", false); serializer.DataField(this, a => a.CanWeldShut, "CanWeldShut", true); + serializer.DataField(this, x => _closeSound, "closeSound", "/Audio/Machines/closetclose.ogg"); + serializer.DataField(this, x => _openSound, "openSound", "/Audio/Machines/closetopen.ogg"); } public virtual void Activate(ActivateEventArgs eventArgs) @@ -141,17 +157,26 @@ namespace Content.Server.GameObjects.Components.Items.Storage ToggleOpen(eventArgs.User); } - private void ToggleOpen(IEntity user) + public virtual bool CanOpen(IEntity user, bool silent = false) { if (IsWeldedShut) { - Owner.PopupMessage(user, Loc.GetString("It's welded completely shut!")); - return; + if(!silent) Owner.PopupMessage(user, Loc.GetString("It's welded completely shut!")); + return false; } + return true; + } + public virtual bool CanClose(IEntity user, bool silent = false) + { + return true; + } + + private void ToggleOpen(IEntity user) + { if (Open) { - CloseStorage(); + TryCloseStorage(user); } else { @@ -159,10 +184,10 @@ namespace Content.Server.GameObjects.Components.Items.Storage } } - public virtual void CloseStorage() + protected virtual void CloseStorage() { Open = false; - var entities = Owner.EntityManager.GetEntities(_entityQuery); + var entities = Owner.EntityManager.GetEntities(EntityQuery); var count = 0; foreach (var entity in entities) { @@ -187,16 +212,16 @@ namespace Content.Server.GameObjects.Components.Items.Storage } ModifyComponents(); - EntitySystem.Get().PlayFromEntity("/Audio/Machines/closetclose.ogg", Owner); + EntitySystem.Get().PlayFromEntity(_closeSound, Owner); _lastInternalOpenAttempt = default; } - private void OpenStorage() + protected virtual void OpenStorage() { Open = true; EmptyContents(); ModifyComponents(); - EntitySystem.Get().PlayFromEntity("/Audio/Machines/closetopen.ogg", Owner); + EntitySystem.Get().PlayFromEntity(_openSound, Owner); } private void ModifyComponents() @@ -224,8 +249,9 @@ namespace Content.Server.GameObjects.Components.Items.Storage } } - private bool AddToContents(IEntity entity) + protected virtual bool AddToContents(IEntity entity) { + if (entity == Owner) return false; if (entity.TryGetComponent(out IPhysicsComponent entityPhysicsComponent)) { if(MaxSize < entityPhysicsComponent.WorldAABB.Size.X @@ -247,12 +273,18 @@ namespace Content.Server.GameObjects.Components.Items.Storage return false; } + public virtual Vector2 ContentsDumpPosition() + { + return Owner.Transform.WorldPosition; + } + private void EmptyContents() { foreach (var contained in Contents.ContainedEntities.ToArray()) { if(Contents.Remove(contained)) { + contained.Transform.WorldPosition = ContentsDumpPosition(); if (contained.TryGetComponent(out var physics)) { physics.CanCollide = true; @@ -284,14 +316,18 @@ namespace Content.Server.GameObjects.Components.Items.Storage } } - protected virtual void TryOpenStorage(IEntity user) + public virtual bool TryOpenStorage(IEntity user) { - if (IsWeldedShut) - { - Owner.PopupMessage(user, Loc.GetString("It's welded completely shut!")); - return; - } + if (!CanOpen(user)) return false; OpenStorage(); + return true; + } + + public virtual bool TryCloseStorage(IEntity user) + { + if (!CanClose(user)) return false; + CloseStorage(); + return true; } /// diff --git a/Content.Server/GameObjects/Components/Items/Storage/SecureEntityStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/SecureEntityStorageComponent.cs index 9c37fd850c..1f7228d25a 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/SecureEntityStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/SecureEntityStorageComponent.cs @@ -69,15 +69,14 @@ namespace Content.Server.GameObjects.Components.Items.Storage base.Activate(eventArgs); } - protected override void TryOpenStorage(IEntity user) + public override bool CanOpen(IEntity user, bool silent = false) { if (Locked) { Owner.PopupMessage(user, "It's locked!"); - return; + return false; } - - base.TryOpenStorage(user); + return base.CanOpen(user, silent); } protected override void OpenVerbGetData(IEntity user, EntityStorageComponent component, VerbData data) diff --git a/Content.Server/GameObjects/Components/Morgue/BodyBagEntityStorageComponent.cs b/Content.Server/GameObjects/Components/Morgue/BodyBagEntityStorageComponent.cs new file mode 100644 index 0000000000..ef3e1bb8d3 --- /dev/null +++ b/Content.Server/GameObjects/Components/Morgue/BodyBagEntityStorageComponent.cs @@ -0,0 +1,123 @@ +#nullable enable +using Content.Server.GameObjects.Components.GUI; +using Content.Server.GameObjects.Components.Items.Storage; +using Content.Server.GameObjects.Components.Paper; +using Content.Server.GameObjects.EntitySystems; +using Content.Server.Interfaces.GameObjects.Components.Items; +using Content.Shared.GameObjects.Components.Body; +using Content.Shared.GameObjects.Components.Morgue; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.GameObjects.Verbs; +using Content.Shared.Interfaces; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Server.GameObjects; +using Robust.Server.GameObjects.Components.Container; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.ComponentDependencies; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Localization; +using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; +using System.Threading.Tasks; + +namespace Content.Server.GameObjects.Components.Morgue +{ + [RegisterComponent] + [ComponentReference(typeof(EntityStorageComponent))] + [ComponentReference(typeof(IActivate))] + [ComponentReference(typeof(IStorageComponent))] + public class BodyBagEntityStorageComponent : EntityStorageComponent, IExamine, IInteractUsing + { + public override string Name => "BodyBagEntityStorage"; + + [ViewVariables] + [ComponentDependency] private AppearanceComponent? _appearance = null; + + [ViewVariables] public ContainerSlot? LabelContainer { get; private set; } + + public override void Initialize() + { + base.Initialize(); + _appearance?.SetData(BodyBagVisuals.Label, false); + LabelContainer = ContainerManagerComponent.Ensure("body_bag_label", Owner, out _); + } + + protected override bool AddToContents(IEntity entity) + { + if (entity.HasComponent() && !EntitySystem.Get().IsDown(entity)) return false; + return base.AddToContents(entity); + } + + void IExamine.Examine(FormattedMessage message, bool inDetailsRange) + { + if (inDetailsRange) + { + if (LabelContainer?.ContainedEntity != null && LabelContainer.ContainedEntity.TryGetComponent(out var paper)) + { + message.AddText(Loc.GetString("The label reads: {0}", paper.Content)); + } + } + } + + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + { + if (LabelContainer == null) return false; + + if (LabelContainer.ContainedEntity != null) + { + Owner.PopupMessage(eventArgs.User, Loc.GetString("There's already a label attached.")); + return false; + } + + var handsComponent = eventArgs.User.GetComponent(); + if (!handsComponent.Drop(eventArgs.Using, LabelContainer)) + { + return false; + } + + _appearance?.SetData(BodyBagVisuals.Label, true); + + Owner.PopupMessage(eventArgs.User, Loc.GetString("You attach {0:theName} to the body bag.", eventArgs.Using)); + return true; + } + + public void RemoveLabel(IEntity user) + { + if (LabelContainer == null) return; + + if (user.TryGetComponent(out HandsComponent? hands)) + { + hands.PutInHandOrDrop(LabelContainer.ContainedEntity.GetComponent()); + _appearance?.SetData(BodyBagVisuals.Label, false); + } + else if (LabelContainer.Remove(LabelContainer.ContainedEntity)) + { + LabelContainer.ContainedEntity.Transform.Coordinates = Owner.Transform.Coordinates; + _appearance?.SetData(BodyBagVisuals.Label, false); + } + } + + + [Verb] + private sealed class RemoveLabelVerb : Verb + { + protected override void GetData(IEntity user, BodyBagEntityStorageComponent component, VerbData data) + { + if (!ActionBlockerSystem.CanInteract(user) || component.LabelContainer?.ContainedEntity == null) + { + data.Visibility = VerbVisibility.Invisible; + return; + } + + data.Text = Loc.GetString("Remove label"); + } + + /// + protected override void Activate(IEntity user, BodyBagEntityStorageComponent component) + { + component.RemoveLabel(user); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Morgue/CrematoriumEntityStorageComponent.cs b/Content.Server/GameObjects/Components/Morgue/CrematoriumEntityStorageComponent.cs new file mode 100644 index 0000000000..761c64561c --- /dev/null +++ b/Content.Server/GameObjects/Components/Morgue/CrematoriumEntityStorageComponent.cs @@ -0,0 +1,104 @@ +#nullable enable +using Content.Server.GameObjects.Components.Items.Storage; +using Content.Shared.GameObjects.Components.Morgue; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.GameObjects.Verbs; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Localization; +using Robust.Shared.Timers; +using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Morgue +{ + [RegisterComponent] + [ComponentReference(typeof(MorgueEntityStorageComponent))] + [ComponentReference(typeof(EntityStorageComponent))] + [ComponentReference(typeof(IActivate))] + [ComponentReference(typeof(IStorageComponent))] + public class CrematoriumEntityStorageComponent : MorgueEntityStorageComponent, IExamine + { + public override string Name => "CrematoriumEntityStorage"; + + [ViewVariables] + public bool Cooking { get; private set; } + + [ViewVariables(VVAccess.ReadWrite)] + private int _burnMilis = 3000; + + void IExamine.Examine(FormattedMessage message, bool inDetailsRange) + { + if (Appearance == null) return; + + if (inDetailsRange) + { + if (Appearance.TryGetData(CrematoriumVisuals.Burning, out bool isBurning) && isBurning) + { + message.AddMarkup(Loc.GetString("The {0:theName} is [color=red]active[/color]!\n", Owner)); + } + + if (Appearance.TryGetData(MorgueVisuals.HasContents, out bool hasContents) && hasContents) + { + message.AddMarkup(Loc.GetString("The content light is [color=green]on[/color], there's something in here.")); + } + else + { + message.AddText(Loc.GetString("The content light is off, there's nothing in here.")); + } + } + } + + public void Cremate() + { + if (Cooking) return; + + Appearance?.SetData(CrematoriumVisuals.Burning, true); + Cooking = true; + + Timer.Spawn(_burnMilis, () => + { + Appearance?.SetData(CrematoriumVisuals.Burning, false); + Cooking = false; + + for (var i = Contents.ContainedEntities.Count - 1; i >= 0; i--) + { + var item = Contents.ContainedEntities[i]; + Contents.Remove(item); + item.Delete(); + } + + var ash = Owner.EntityManager.SpawnEntity("Ash", Owner.Transform.Coordinates); + Contents.Insert(ash); + + TryOpenStorage(Owner); + + EntitySystem.Get().PlayFromEntity("/Audio/Machines/ding.ogg", Owner); + }); + } + + [Verb] + private sealed class CremateVerb : Verb + { + protected override void GetData(IEntity user, CrematoriumEntityStorageComponent component, VerbData data) + { + if (!ActionBlockerSystem.CanInteract(user) || component.Cooking) + { + data.Visibility = VerbVisibility.Invisible; + return; + } + + data.Text = Loc.GetString("Cremate"); + } + + /// + protected override void Activate(IEntity user, CrematoriumEntityStorageComponent component) + { + component.Cremate(); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Morgue/MorgueEntityStorageComponent.cs b/Content.Server/GameObjects/Components/Morgue/MorgueEntityStorageComponent.cs new file mode 100644 index 0000000000..2dd2b6673f --- /dev/null +++ b/Content.Server/GameObjects/Components/Morgue/MorgueEntityStorageComponent.cs @@ -0,0 +1,178 @@ +#nullable enable +using Content.Server.GameObjects.Components.Items.Storage; +using Content.Server.GameObjects.EntitySystems; +using Content.Shared.GameObjects.Components.Body; +using Content.Shared.GameObjects.Components.Morgue; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.Interfaces; +using Content.Shared.Interfaces.GameObjects.Components; +using Content.Shared.Physics; +using Content.Shared.Utility; +using Robust.Server.GameObjects; +using Robust.Server.GameObjects.Components.Container; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.ComponentDependencies; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Localization; +using Robust.Shared.Maths; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Morgue +{ + [RegisterComponent] + [ComponentReference(typeof(EntityStorageComponent))] + [ComponentReference(typeof(IActivate))] + [ComponentReference(typeof(IStorageComponent))] + public class MorgueEntityStorageComponent : EntityStorageComponent, IExamine + { + public override string Name => "MorgueEntityStorage"; + + [ViewVariables(VVAccess.ReadWrite)] + private string? _trayPrototypeId; + + [ViewVariables] + private IEntity? _tray; + + [ViewVariables] + public ContainerSlot? TrayContainer { get; private set; } + + [ViewVariables(VVAccess.ReadWrite)] + public bool DoSoulBeep = true; + + [ViewVariables] + [ComponentDependency] protected readonly AppearanceComponent? Appearance = null; + + + public override void Initialize() + { + base.Initialize(); + Appearance?.SetData(MorgueVisuals.Open, false); + TrayContainer = ContainerManagerComponent.Ensure("morgue_tray", Owner, out _); + } + + /// + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(ref _trayPrototypeId, "trayPrototype", ""); + serializer.DataField(ref DoSoulBeep, "doSoulBeep", true); + } + + public override Vector2 ContentsDumpPosition() + { + if (_tray != null) return _tray.Transform.WorldPosition; + return base.ContentsDumpPosition(); + } + + protected override bool AddToContents(IEntity entity) + { + if (entity.HasComponent() && !EntitySystem.Get().IsDown(entity)) return false; + return base.AddToContents(entity); + } + + public override bool CanOpen(IEntity user, bool silent = false) + { + if (!Owner.InRangeUnobstructed( + Owner.Transform.Coordinates.Offset(Owner.Transform.LocalRotation.GetCardinalDir()), + collisionMask: CollisionGroup.Impassable | CollisionGroup.VaultImpassable + )) + { + if(!silent) Owner.PopupMessage(user, Loc.GetString("There's no room for the tray to extend!")); + return false; + } + + return base.CanOpen(user, silent); + } + + protected override void OpenStorage() + { + Appearance?.SetData(MorgueVisuals.Open, true); + Appearance?.SetData(MorgueVisuals.HasContents, false); + Appearance?.SetData(MorgueVisuals.HasMob, false); + Appearance?.SetData(MorgueVisuals.HasSoul, false); + + if (_tray == null) + { + _tray = Owner.EntityManager.SpawnEntity(_trayPrototypeId, Owner.Transform.Coordinates); + var trayComp = _tray.EnsureComponent(); + trayComp.Morgue = Owner; + EntityQuery = new IntersectingEntityQuery(_tray); + } + else + { + TrayContainer?.Remove(_tray); + } + + _tray.Transform.WorldPosition = Owner.Transform.WorldPosition + Owner.Transform.LocalRotation.GetCardinalDir().ToVec(); + _tray.Transform.AttachParent(Owner); + + base.OpenStorage(); + } + + private void CheckContents() + { + var count = 0; + var hasMob = false; + var hasSoul = false; + foreach (var entity in Contents.ContainedEntities) + { + count++; + if (!hasMob && entity.HasComponent()) hasMob = true; + if (!hasSoul && entity.TryGetComponent(out var actor) && actor.playerSession != null) hasSoul = true; + } + Appearance?.SetData(MorgueVisuals.HasContents, count > 0); + Appearance?.SetData(MorgueVisuals.HasMob, hasMob); + Appearance?.SetData(MorgueVisuals.HasSoul, hasSoul); + } + + protected override void CloseStorage() + { + base.CloseStorage(); + + Appearance?.SetData(MorgueVisuals.Open, false); + CheckContents(); + + if (_tray != null) + { + TrayContainer?.Insert(_tray); + } + } + + //Called every 10 seconds + public void Update() + { + CheckContents(); + + if(DoSoulBeep && Appearance !=null && Appearance.TryGetData(MorgueVisuals.HasSoul, out bool hasSoul) && hasSoul) + EntitySystem.Get().PlayFromEntity("/Audio/Weapons/Guns/EmptyAlarm/smg_empty_alarm.ogg", Owner); + } + + void IExamine.Examine(FormattedMessage message, bool inDetailsRange) + { + if (Appearance == null) return; + + if (inDetailsRange) + { + if (Appearance.TryGetData(MorgueVisuals.HasSoul, out bool hasSoul) && hasSoul) + { + message.AddMarkup(Loc.GetString("The content light is [color=green]green[/color], this body might still be saved!")); + } + else if (Appearance.TryGetData(MorgueVisuals.HasMob, out bool hasMob) && hasMob) + { + message.AddMarkup(Loc.GetString("The content light is [color=red]red[/color], there's a dead body in here! Oh wait...")); + } + else if (Appearance.TryGetData(MorgueVisuals.HasContents, out bool hasContents) && hasContents) + { + message.AddMarkup(Loc.GetString("The content light is [color=yellow]yellow[/color], there's something in here.")); + } else + { + message.AddMarkup(Loc.GetString("The content light is off, there's nothing in here.")); + } + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Morgue/MorgueTrayComponent.cs b/Content.Server/GameObjects/Components/Morgue/MorgueTrayComponent.cs new file mode 100644 index 0000000000..7e314b7c37 --- /dev/null +++ b/Content.Server/GameObjects/Components/Morgue/MorgueTrayComponent.cs @@ -0,0 +1,29 @@ +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Morgue +{ + [RegisterComponent] + [ComponentReference(typeof(IActivate))] + public class MorgueTrayComponent : Component, IActivate + { + public override string Name => "MorgueTray"; + + [ViewVariables] + public IEntity Morgue { get; set; } + + void IActivate.Activate(ActivateEventArgs eventArgs) + { + if(Morgue != null && !Morgue.Deleted && Morgue.TryGetComponent(out var comp)) + { + comp.Activate(new ActivateEventArgs() + { + User = eventArgs.User, + Target = Morgue + }); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Paper/PaperComponent.cs b/Content.Server/GameObjects/Components/Paper/PaperComponent.cs index 3070172259..10e3dd0c6e 100644 --- a/Content.Server/GameObjects/Components/Paper/PaperComponent.cs +++ b/Content.Server/GameObjects/Components/Paper/PaperComponent.cs @@ -16,8 +16,8 @@ namespace Content.Server.GameObjects.Components.Paper [RegisterComponent] public class PaperComponent : SharedPaperComponent, IExamine, IInteractUsing, IUse { - private string _content = ""; private PaperAction _mode; + public string Content { get; private set; } = ""; [ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(PaperUiKey.Key); @@ -35,7 +35,7 @@ namespace Content.Server.GameObjects.Components.Paper } private void UpdateUserInterface() { - UserInterface?.SetState(new PaperBoundUserInterfaceState(_content, _mode)); + UserInterface?.SetState(new PaperBoundUserInterfaceState(Content, _mode)); } public void Examine(FormattedMessage message, bool inDetailsRange) @@ -43,7 +43,7 @@ namespace Content.Server.GameObjects.Components.Paper if (!inDetailsRange) return; - message.AddMarkup(_content); + message.AddMarkup(Content); } public bool UseEntity(UseEntityEventArgs eventArgs) @@ -63,7 +63,7 @@ namespace Content.Server.GameObjects.Components.Paper if (string.IsNullOrEmpty(msg.Text)) return; - _content += msg.Text + '\n'; + Content += msg.Text + '\n'; if (Owner.TryGetComponent(out SpriteComponent? sprite)) { diff --git a/Content.Server/GameObjects/EntitySystems/MorgueSystem.cs b/Content.Server/GameObjects/EntitySystems/MorgueSystem.cs new file mode 100644 index 0000000000..bbb18adca2 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/MorgueSystem.cs @@ -0,0 +1,27 @@ +using Content.Server.GameObjects.Components.Morgue; +using JetBrains.Annotations; +using Robust.Shared.GameObjects.Systems; + +namespace Content.Server.GameObjects.EntitySystems +{ + [UsedImplicitly] + public class MorgueSystem : EntitySystem + { + + private float _accumulatedFrameTime; + + public override void Update(float frameTime) + { + _accumulatedFrameTime += frameTime; + + if (_accumulatedFrameTime >= 10) + { + foreach (var morgue in ComponentManager.EntityQuery()) + { + morgue.Update(); + } + _accumulatedFrameTime -= 10; + } + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/StandingStateSystem.cs b/Content.Server/GameObjects/EntitySystems/StandingStateSystem.cs index 49165efd87..74f99551c3 100644 --- a/Content.Server/GameObjects/EntitySystems/StandingStateSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/StandingStateSystem.cs @@ -61,5 +61,21 @@ namespace Content.Server.GameObjects.EntitySystems hands.Drop(heldItem.Owner, doMobChecks); } } + + //TODO: RotationState can be null and I want to burn all lifeforms in the universe for this!!! + //If you use these it's atleast slightly less painful (null is treated as false) + public bool IsStanding(IEntity entity) + { + return entity.TryGetComponent(out var appearance) + && appearance.TryGetData(RotationVisuals.RotationState, out var rotation) + && rotation == RotationState.Vertical; + } + + public bool IsDown(IEntity entity) + { + return entity.TryGetComponent(out var appearance) + && appearance.TryGetData(RotationVisuals.RotationState, out var rotation) + && rotation == RotationState.Horizontal; + } } } diff --git a/Content.Shared/GameObjects/Components/Storage/SharedMorgue.cs b/Content.Shared/GameObjects/Components/Storage/SharedMorgue.cs new file mode 100644 index 0000000000..09699d8c89 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Storage/SharedMorgue.cs @@ -0,0 +1,26 @@ +using System; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Morgue +{ + [Serializable, NetSerializable] + public enum MorgueVisuals + { + Open, + HasContents, + HasMob, + HasSoul, + } + + [Serializable, NetSerializable] + public enum CrematoriumVisuals + { + Burning, + } + + [Serializable, NetSerializable] + public enum BodyBagVisuals + { + Label, + } +} diff --git a/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs b/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs index 45f69c6636..2bbdb8ffe1 100644 --- a/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs +++ b/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs @@ -144,8 +144,9 @@ namespace Content.Shared.GameObjects.Components.Storage public enum StorageVisuals { Open, - CanLock, + CanWeld, Welded, + CanLock, Locked } } diff --git a/Resources/Audio/Machines/ding.ogg b/Resources/Audio/Machines/ding.ogg new file mode 100644 index 0000000000000000000000000000000000000000..24bce5d8d71e68fca232bee38ef54a7833d84002 GIT binary patch literal 25226 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 VMn7Zq_S*F8>Z#gA1fEwH{12=4!j1p{ literal 0 HcmV?d00001 diff --git a/Resources/Audio/Misc/zip.ogg b/Resources/Audio/Misc/zip.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d437d486ea4601d9529faf10c5938de2804f56d8 GIT binary patch literal 15223 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 P00000NkvXXu0mjfDAI@L literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/item.png b/Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/item.png new file mode 100644 index 0000000000000000000000000000000000000000..99ac0ce453e06f4edc27225643e7cceec050430e GIT binary patch literal 227 zcmV<90382`P)2OHkYC^yzz|6}9 zUY=%ErJVD$Z;Y`{fSEr6RTT(mQ`| zHBb_A_;yd&f$2nb-S($O#;32{dYs#%SbWaE?qTVQnYMcWvMeWdoM61)r@Y$X=T04< O%?zHdelF{r5}E+I?nFrd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/meta.json b/Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/meta.json new file mode 100644 index 0000000000..9eaad9e7d7 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/meta.json @@ -0,0 +1,47 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC BY-SA 3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation at commit 39659000f380583c35fb814ee2fadab24c2f8076", + "states": [ + { + "name": "bag", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "item", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "label_overlay", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "open_overlay", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/open_overlay.png b/Resources/Textures/Objects/Specific/Morgue/bodybags.rsi/open_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..48e9bbc6c2075258af67be275d8d5b17394aab60 GIT binary patch literal 377 zcmV-<0fzpGP)I;Q4Tw(>s)i@s~a)F%;tOVfe?aNYgbV{UJCIbK|CBw`HSW>1h>*_^g0UcuyW0agToO4|xsJv~$JyJ?)TAXw1 z^|L0l37aK20y7(H?HcS%Nr-6et!@Lrk_~GuN-3vJXdhfM0N~e@IOpD)(ED1-(><_- znT_{eN-5BiRQH0#LT=By}Z;C1rt3( zJ+r@loG*ZentHl8hE&A8z2TU3*g&8)QFhU4J?6K|z8Kj$Oxx?xe=+%siEVF`B#|e zkK4W3^M*Zc{`O?~GQF+Wu1GFZJ3A#Y>yi&1hUL`VHA1#M&VQttfgWIB*c}+{8VTJbUGre1Y*)sOO?S6eu@zS-3!q(5(4`VIfs=wmDV zW?ztfl=?ezO2x-5y_f4=-7<13{de+x^}EBzH!?Ma9hfJsP{MlWFKfpx)^C6K9*9{y z;=1ukdjHc%$I@FZ>l)mqR?PGTvVv8SE$0P0sbI<{W)~^LNzI`J&L9C#S3j3^P6vFq4GAr&I1iUi7~uL2>Fe}KdLs~-|KPDMgOflI{!RZXeD5wV@@+OhKv zyjj_f*Ip-1!V~!}yLESWX1?r?*_k~;35LVrvaC%JuCA_*HtD}@`6p$9pFVvG#uxyg z(P$_M4Z{!sU>F7fEL9ZQm;Bt1!{Kmg+cuibCLTO^fGCQfX&L~CQidpsM5$>Srqd~c zAb{(-$|NM^|M>AkrHd5ZZnseW$_%);xLDe@4FG61o6s~(7{wUF!-o$G1v-vH%%{k* zZ5tOC7t7C|KNpff@?F;j01O5L1VJG5Q9-i(_4Re3eCZO%3S*4HFbuqV_pVU*%a<>~ z7!%W##v!Ft;JPll-EK+;+qSX1`bVk1KKxq{*z5HW1c7uWNeReeJRalc&!2el;srd< zgJoIpJP!aw-Lfov`0xSkb{qYEUv=me&piIDEFi8E~>2y}=olXa@UcCZP zZOT`H%rI4hvrr~rT>-y4j`yv=zHuO6-wNy-2Lkr3z`pUv6HwU^+84?$VOgji+m&a4 zrfIp#$iCMF-}j;GIwq3|!Y~wNvObwipzC_B%PWKO3}B3*)oK9%bY0JF!#RhhY4Ckt z`R=ZY@pudXc>MS=00=icS+^_;j^kiF9xLBPDqV*Dn%@HWFT#)my1QMUKH2Cpl!sog zhw*qUh$w5T3MB%__ z+cs`)ZU6wLX|63CfKdL?qesf;v+KH;&*uO{XnSpt9jB+Kx&O~4;Qszz7|uCgI~byA zni%K){$9D?d_EV3A0Kb#tmUM?RFb+9INOnMZ4XG=Xr?ZSZOImQ6y4Z^vh9Bf=ZcAi^XE4En{pYVw^-S0bv-X z6xkHXF;&`9yFB9=W71*M5+Ia2IZ0h~sFaP9*H$*R zkdddrbUFn9QPzR!bgE21opQ5dA8D9DFrd=+^{rF!)!Lojae2t+NNp3G)?hFXA|hUj^OX8=7)JUcsETZ!y=^y-^j;bgRl>Ol~o*Xz~dhLg-P#1Z?YhYaWte zFRE{{?p2Ysac=}9Wl?<>@(T&r_mQ^?0_bET2m<0bMx)WFTncPamX1AgIOC~q()*gm|r00000NkvXX Hu0mjfATup( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Morgue/morgue.rsi/crema_contents_light.png b/Resources/Textures/Objects/Specific/Morgue/morgue.rsi/crema_contents_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5626219773e66075eb086bbb7730325e4c678e3f GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=6FprVLn`LHy}6P1kbwZ}1!m2a z8Y?da8!~$vFdW{8froz8@^JgZ~6oFSATom-gKc*yuB$YxWNu0k?YEeN0KFd z7rQen$vTXDh?j5sK+r^)cix$24tfuh7HTjakCVDORrv7XL#wIG^XJbK%d!y1F}mF@ zmdhn%S%xTzT=G#AAqWB{D+mH?+s3zV-?sYFE^CAi{KbnGAcOz_BuV1xKp2Jq09921 zAOZM^7>!1WX_^oO0dX7y0D>UEX0zeaO+jS=KoA62mIX~z^VHl8Q z8Nikkjo z^}l@i!rswwq*1yB^2!JyP*oN0-o2|-{`&Q65JK2?q3zI4)gg)^$g+%Hub1hAVHik0 z{Fkc@W&A5#*98C!1_J~^fV;c9W(4FhpU<&eF7fKsE38&4=(^697%l6%j*lNdqTB6a zI2`geoq=H(pery9$8ium`wsx%?(VKow%6+c0A$D6IZkpy+*)&bOdGiJU|B`QtvVrjqI1g?D zc2)3Chj8i+oEkp~ICTe3jh_UZx&x=izn*}`hR~_N>k3owezqI008tbRJ5%=lQ1Cnt zilSh#SRf2T_Dq)-iv<)#DKvS@z`X(pA?S2E002c%3hVg34^b51c^-G{fEV-m902g- z$rAuzW_Y@+>pC3A!F)dF_C*>wL%*zN0RD<_6oC3}U(TNH>hgk% zfG`X(91ao4=k=8V41<9A^oKwghEP=%gTbKI;nH;-s;Ytz!lj>!fVv<^9(0TNzTZf$ zO26;>=yW=48}iE3p_YJ8pFVLZEW>Ct+DjhTjYwXZQUb28uK@s>rZrZc#?{po0Kl@W zo#Z{wYrFy}9LK4xQ%Hbq+ic*z@9*pii=xQdv2DANER82zUtcp4cfqq~&njaRTLk#N zk6y2bIF1p9A#QJPcUBGn{eB;kBtg@((oj|&uIpmGUISpE^_@Xia#>`#bPEtduvjc0 zNfHZ)3W5MZD7T&BIA%XV5I|K`+}_^8G|fg^X}w;vfmi9{0d0p8n#UFaQ4}GLV{A4X zv|24Fih|8%16h_K2tuW`M`h^`mECMMh~t=REBU?;nixqNJ86`C3ajd?s*1&8vGun? z0>Usv6h&ya+mIxQJ?jXd*_^y=x=mihaa?+Cl&z++`c>Pgkbo$P*sM#E1X-3@qM~jK zq*nozrGw`ofRY9LJ#%ym(q~zwXS3OC)g^>%MT~0+`0?Wh0I(SZfaP*o+xbkx?KYF8 zZSoR8>lF>25K`)k6xCH#wK7z`MSyMFEz7bJ;O~>O)oS7E*RPGTyf0tAOsFh1N^IM% zZ6n>ucDtQ%bm+5;$fCMsZ8IJD7sKH&VHh?FWHdn-hRi)y6b0+`I+;u+Euh2{zQ4cU+Xl~r9*A{GQyRoLwgtW3D7hRzVE|z zUEJK<>@_20=Cfs43AH(RWq1%p5pHg7;JPk+->)R0)ElJx=kx?^+- zJO}|rC;DtQD=b&Z90R2Uc%FypbXsV&9Rl-t_Z z;&~n>lL`JfdsN2*zfmu?nJ&ldh5K( zt_XqvgTde+W;oSZhe850O*@J+#M7Q6Ne8z9(#}vG83G)~L8sGUiO7e>vFrj_mf7I* z>9Py~$25C+u+P5dMShI`C;}cremEHCRE38ifPUF17y&eqaR}eP4n<4-825^b zAW2e2|JD|`y}d=h-!FY06Ng#>O~#NRfTq3bp7{$4To)1A?aY6EjYgv+U#9Kn>z1La zA9Z73{h|fm_qjc&eBy#fF1@vA2AJmfOw+_-v1sfe?wUYJ+XDxQ2k>5eNJoHXvl+Yd zH=E5e7Z^OxTS-EKxPeb0*`Q#Y-j7ghbJ8bew?b3+G%L9**@tfu(uIxEXU+qT_0g?=En0*;lH j&7*7uoKpW!{9Exqpi)fNcvOt^00000NkvXXu0mjfq|=jt literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Morgue/morgue.rsi/crema_tray.png b/Resources/Textures/Objects/Specific/Morgue/morgue.rsi/crema_tray.png new file mode 100644 index 0000000000000000000000000000000000000000..57f9c47271b6151f9917ab1965ccd8bec82e7b7f GIT binary patch literal 1105 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 ajsF96hJgo{Il_Bw?m+S?lT zgvWK(vzEP8U!BLb7pOmUlY9M7sDb0i8TywQY({IS()DY9afsP$tLi= z_^nfq5`4s0+iPAvx=e>}599s{f5-QXIkK8NN{g2-2sK?1*!wdrlqWMJd0(U~!&M2O zOBomr?Eh`1y+1cw{OswC(Obc$iRn9K4z84M=q{90wqRg* va93!z{x-wjUqUte?kOo1?PP1to)6Jxr`tT!;@d6;VUVewu6{1-oD!Mob#fIS!3XdyGWZsC@GVLw!L2XgJMr!ZR0tE z?7Ec)xOBC91?Q6~v#ROTE1=YFa4{Tz6!cy;wcJ^j+6y$|SSv?mO6?|gou=Hr#j@)( zwekP}00000;H)G+E0ggU{e!%c4C!nD0Ay2bXDxwnJBZ|9S*mR~ zm2+n44zcTp;`*UR>0j$^@1pol>C;#z}P_9qm_5Izq nap^qdx%?=S4C!nD0Azayo>qf@uXci000000NkvXXu0mjf{xq_w literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Morgue/morgue.rsi/morgue_open.png b/Resources/Textures/Objects/Specific/Morgue/morgue.rsi/morgue_open.png new file mode 100644 index 0000000000000000000000000000000000000000..15ca16ae64ae1d6c73170307866e24dd46fb64e3 GIT binary patch literal 2648 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 literal 0 HcmV?d00001