From b85c902189d700eed52ab09e078c81bfe81a5c44 Mon Sep 17 00:00:00 2001 From: Topy Date: Sat, 1 Jul 2023 00:10:47 +0200 Subject: [PATCH] Added sink (#14348) --- .../SolutionContainerVisualsComponent.cs | 7 + .../SolutionContainerVisualsSystem.cs | 10 + .../EntitySystems/SolutionContainerSystem.cs | 4 + .../Fluids/EntitySystems/DrainSystem.cs | 304 ++++++++++++++---- .../EntitySystems/PuddleSystem.Transfers.cs | 1 + Content.Shared/Chemistry/SolutionVisuals.cs | 1 + .../DoAfter/SharedDoAfterSystem.Update.cs | 2 +- .../Fluids/Components/DrainComponent.cs | 43 ++- Content.Shared/Fluids/SharedDrainSystem.cs | 12 + .../Audio/Effects/Fluids/ATTRIBUTION.txt | 2 - .../Audio/Effects/Fluids/attributions.yml | 14 + Resources/Audio/Effects/Fluids/glug.ogg | Bin 0 -> 13897 bytes .../Audio/Items/Janitor/attributions.yml | 4 + Resources/Audio/Items/Janitor/plunger.ogg | Bin 0 -> 25537 bytes .../fluids/components/drain-component.ftl | 8 + .../Catalog/Cargo/cargo_service.yml | 2 +- .../Catalog/Fills/Crates/service.yml | 2 + .../Catalog/Fills/Lockers/service.yml | 2 + .../Markers/Spawners/Random/maintenance.yml | 1 + .../Objects/Specific/Janitorial/janitor.yml | 67 ++-- .../Entities/Structures/Furniture/sink.yml | 47 ++- .../Entities/Structures/Furniture/toilet.yml | 8 + .../Prototypes/Recipes/Lathes/janitorial.yml | 10 +- Resources/Prototypes/tags.yml | 4 + .../Specific/Janitorial/drain.rsi/fill-1.png | Bin 0 -> 3260 bytes .../Specific/Janitorial/drain.rsi/icon.png | Bin 12057 -> 3353 bytes .../Specific/Janitorial/drain.rsi/meta.json | 8 +- .../Janitorial/janitorial.rsi/meta.json | 11 + .../janitorial.rsi/plunger-inhand-left.png | Bin 0 -> 2037 bytes .../janitorial.rsi/plunger-inhand-right.png | Bin 0 -> 2036 bytes .../Janitorial/janitorial.rsi/plunger.png | Bin 0 -> 1939 bytes .../janitorial_cart.rsi/cart_plunger.png | Bin 0 -> 1900 bytes .../Janitorial/janitorial_cart.rsi/meta.json | 4 + .../Structures/Furniture/sink.rsi/meta.json | 10 +- .../Furniture/sink.rsi/sink-fill-1.png | Bin 0 -> 1884 bytes .../Furniture/sink.rsi/sink_wide-fill-1.png | Bin 0 -> 1855 bytes 36 files changed, 484 insertions(+), 104 deletions(-) create mode 100644 Content.Shared/Fluids/SharedDrainSystem.cs delete mode 100644 Resources/Audio/Effects/Fluids/ATTRIBUTION.txt create mode 100644 Resources/Audio/Effects/Fluids/attributions.yml create mode 100644 Resources/Audio/Effects/Fluids/glug.ogg create mode 100644 Resources/Audio/Items/Janitor/attributions.yml create mode 100644 Resources/Audio/Items/Janitor/plunger.ogg create mode 100644 Resources/Locale/en-US/fluids/components/drain-component.ftl create mode 100644 Resources/Textures/Objects/Specific/Janitorial/drain.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/plunger-inhand-left.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/plunger-inhand-right.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/plunger.png create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_plunger.png create mode 100644 Resources/Textures/Structures/Furniture/sink.rsi/sink-fill-1.png create mode 100644 Resources/Textures/Structures/Furniture/sink.rsi/sink_wide-fill-1.png diff --git a/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsComponent.cs b/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsComponent.cs index da21106476..d84e838c2b 100644 --- a/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsComponent.cs +++ b/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsComponent.cs @@ -36,6 +36,13 @@ namespace Content.Client.Chemistry.Visualizers [DataField("metamorphicNameFull")] public string MetamorphicNameFull = "transformable-container-component-glass"; + /// + /// Which solution of the SolutionContainerManagerComponent to represent. + /// If not set, will work as default. + /// + [DataField("solutionName")] + public string SolutionName = ""; + public string InitialName = string.Empty; public string InitialDescription = string.Empty; } diff --git a/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs b/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs index 3eea146050..6f5c14852e 100644 --- a/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs +++ b/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs @@ -25,6 +25,16 @@ public sealed class SolutionContainerVisualsSystem : VisualizerSystem(uid, SolutionContainerVisuals.SolutionName, out var name, + args.Component) && name != component.SolutionName) + { + return; + } + } + if (!AppearanceSystem.TryGetData(uid, SolutionContainerVisuals.FillFraction, out var fraction, args.Component)) return; diff --git a/Content.Server/Chemistry/EntitySystems/SolutionContainerSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionContainerSystem.cs index bd6ea0d1ac..fa33309f58 100644 --- a/Content.Server/Chemistry/EntitySystems/SolutionContainerSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/SolutionContainerSystem.cs @@ -152,6 +152,10 @@ public sealed partial class SolutionContainerSystem : EntitySystem _appearance.SetData(uid, SolutionContainerVisuals.FillFraction, solution.FillFraction, appearanceComponent); _appearance.SetData(uid, SolutionContainerVisuals.Color, solution.GetColor(_prototypeManager), appearanceComponent); + if (solution.Name != null) + { + _appearance.SetData(uid, SolutionContainerVisuals.SolutionName, solution.Name, appearanceComponent); + } if (solution.GetPrimaryReagentId() is { } reagent) { diff --git a/Content.Server/Fluids/EntitySystems/DrainSystem.cs b/Content.Server/Fluids/EntitySystems/DrainSystem.cs index 50f359ddc5..8d415599f5 100644 --- a/Content.Server/Fluids/EntitySystems/DrainSystem.cs +++ b/Content.Server/Fluids/EntitySystems/DrainSystem.cs @@ -1,101 +1,265 @@ using Content.Server.Chemistry.Components.SolutionManager; using Content.Server.Fluids.Components; using Content.Server.Chemistry.EntitySystems; +using Content.Server.DoAfter; +using Content.Server.Popups; using Content.Shared.FixedPoint; using Content.Shared.Audio; +using Content.Shared.Database; +using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Shared.Fluids; +using Content.Shared.Interaction; +using Content.Shared.Tag; +using Content.Shared.Verbs; using Content.Shared.Fluids.Components; using Robust.Shared.Collections; +using Robust.Shared.Random; +using Robust.Shared.Utility; -namespace Content.Server.Fluids.EntitySystems +namespace Content.Server.Fluids.EntitySystems; + +public sealed class DrainSystem : SharedDrainSystem { - public sealed class DrainSystem : EntitySystem + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly SolutionContainerSystem _solutionSystem = default!; + [Dependency] private readonly SharedAmbientSoundSystem _ambientSoundSystem = default!; + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly PuddleSystem _puddleSystem = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + public override void Initialize() { - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly SolutionContainerSystem _solutionSystem = default!; - [Dependency] private readonly SharedAmbientSoundSystem _ambientSoundSystem = default!; + base.Initialize(); + SubscribeLocalEvent>(AddEmptyVerb); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent(OnDoAfter); + } - public override void Update(float frameTime) + private void AddEmptyVerb(EntityUid uid, DrainComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || args.Using == null) + return; + + if (!TryComp(args.Using, out SpillableComponent? spillable) || + !TryComp(args.Target, out DrainComponent? drain)) + return; + + Verb verb = new() { - base.Update(frameTime); - var managerQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - var puddleQuery = GetEntityQuery(); - var puddles = new ValueList<(EntityUid Entity, string Solution)>(); - - foreach (var drain in EntityQuery()) + Text = Loc.GetString("drain-component-empty-verb-inhand", ("object", Name(args.Using.Value))), + Act = () => { - drain.Accumulator += frameTime; - if (drain.Accumulator < drain.DrainFrequency) + Empty(args.Using.Value, spillable, args.Target, drain); + }, + Impact = LogImpact.Low, + Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")) + + }; + args.Verbs.Add(verb); + } + + private void Empty(EntityUid container, SpillableComponent spillable, EntityUid target, DrainComponent drain) + { + // Find the solution in the container that is emptied + if (!_solutionSystem.TryGetDrainableSolution(container, out var containerSolution) || + containerSolution.Volume == FixedPoint2.Zero) + { + _popupSystem.PopupEntity( + Loc.GetString("drain-component-empty-verb-using-is-empty-message", ("object", container)), + container); + return; + } + + // try to find the drain's solution + if (!_solutionSystem.TryGetSolution(target, DrainComponent.SolutionName, out var drainSolution)) + { + return; + } + + // Try to transfer as much solution as possible to the drain + + var transferSolution = _solutionSystem.SplitSolution(container, containerSolution, + FixedPoint2.Min(containerSolution.Volume, drainSolution.AvailableVolume)); + + _solutionSystem.TryAddSolution(target, drainSolution, transferSolution); + + _audioSystem.PlayPvs(drain.ManualDrainSound, target); + _ambientSoundSystem.SetAmbience(target, true); + + // If drain is full, spill + + if (drainSolution.MaxVolume == drainSolution.Volume) + { + _puddleSystem.TrySpillAt(Transform(target).Coordinates, containerSolution, out var puddle); + _popupSystem.PopupEntity( + Loc.GetString("drain-component-empty-verb-target-is-full-message", ("object", target)), + container); + } + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + var managerQuery = GetEntityQuery(); + var xformQuery = GetEntityQuery(); + var puddleQuery = GetEntityQuery(); + var puddles = new ValueList<(EntityUid Entity, string Solution)>(); + + foreach (var drain in EntityQuery()) + { + drain.Accumulator += frameTime; + if (drain.Accumulator < drain.DrainFrequency) + { + continue; + } + drain.Accumulator -= drain.DrainFrequency; + + // Disable ambient sound from emptying manually + if (!drain.AutoDrain) + { + _ambientSoundSystem.SetAmbience(drain.Owner, false); + return; + } + + if (!managerQuery.TryGetComponent(drain.Owner, out var manager)) + continue; + + // Best to do this one every second rather than once every tick... + _solutionSystem.TryGetSolution(drain.Owner, DrainComponent.SolutionName, out var drainSolution, manager); + + if (drainSolution is null) + continue; + + if (drainSolution.AvailableVolume <= 0) + { + _ambientSoundSystem.SetAmbience(drain.Owner, false); + continue; + } + + // Remove a bit from the buffer + _solutionSystem.SplitSolution(drain.Owner, drainSolution, (drain.UnitsDestroyedPerSecond * drain.DrainFrequency)); + + // This will ensure that UnitsPerSecond is per second... + var amount = drain.UnitsPerSecond * drain.DrainFrequency; + + if (!xformQuery.TryGetComponent(drain.Owner, out var xform)) + continue; + + puddles.Clear(); + + foreach (var entity in _lookup.GetEntitiesInRange(xform.MapPosition, drain.Range)) + { + // No InRangeUnobstructed because there's no collision group that fits right now + // and these are placed by mappers and not buildable/movable so shouldnt really be a problem... + if (puddleQuery.TryGetComponent(entity, out var puddle)) { - continue; + puddles.Add((entity, puddle.SolutionName)); } - drain.Accumulator -= drain.DrainFrequency; + } - if (!managerQuery.TryGetComponent(drain.Owner, out var manager)) - continue; + if (puddles.Count == 0) + { + _ambientSoundSystem.SetAmbience(drain.Owner, false); + continue; + } - // Best to do this one every second rather than once every tick... - _solutionSystem.TryGetSolution(drain.Owner, DrainComponent.SolutionName, out var drainSolution, manager); + _ambientSoundSystem.SetAmbience(drain.Owner, true); - if (drainSolution is null) - continue; + amount /= puddles.Count; - // Remove a bit from the buffer - _solutionSystem.SplitSolution(drain.Owner, drainSolution, (drain.UnitsDestroyedPerSecond * drain.DrainFrequency)); - - // This will ensure that UnitsPerSecond is per second... - var amount = drain.UnitsPerSecond * drain.DrainFrequency; - - if (!xformQuery.TryGetComponent(drain.Owner, out var xform)) - continue; - - puddles.Clear(); - - foreach (var entity in _lookup.GetEntitiesInRange(xform.MapPosition, drain.Range)) + foreach (var (puddle, solution) in puddles) + { + // Queue the solution deletion if it's empty. EvaporationSystem might also do this + // but queuedelete should be pretty safe. + if (!_solutionSystem.TryGetSolution(puddle, solution, out var puddleSolution)) { - // No InRangeUnobstructed because there's no collision group that fits right now - // and these are placed by mappers and not buildable/movable so shouldnt really be a problem... - if (puddleQuery.TryGetComponent(entity, out var puddle)) - { - puddles.Add((entity, puddle.SolutionName)); - } - } - - if (puddles.Count == 0) - { - _ambientSoundSystem.SetAmbience(drain.Owner, false); + EntityManager.QueueDeleteEntity(puddle); continue; } - _ambientSoundSystem.SetAmbience(drain.Owner, true); + // Removes the lowest of: + // the drain component's units per second adjusted for # of puddles + // the puddle's remaining volume (making it cleanly zero) + // the drain's remaining volume in its buffer. + var transferSolution = _solutionSystem.SplitSolution(puddle, puddleSolution, + FixedPoint2.Min(FixedPoint2.New(amount), puddleSolution.Volume, drainSolution.AvailableVolume)); - amount /= puddles.Count; + _solutionSystem.TryAddSolution(drain.Owner, drainSolution, transferSolution); - foreach (var (puddle, solution) in puddles) + if (puddleSolution.Volume <= 0) { - // Queue the solution deletion if it's empty. EvaporationSystem might also do this - // but queuedelete should be pretty safe. - if (!_solutionSystem.TryGetSolution(puddle, solution, out var puddleSolution)) - { - EntityManager.QueueDeleteEntity(puddle); - continue; - } - - // Removes the lowest of: - // the drain component's units per second adjusted for # of puddles - // the puddle's remaining volume (making it cleanly zero) - // the drain's remaining volume in its buffer. - var transferSolution = _solutionSystem.SplitSolution(puddle, puddleSolution, - FixedPoint2.Min(FixedPoint2.New(amount), puddleSolution.Volume, drainSolution.AvailableVolume)); - - _solutionSystem.TryAddSolution(drain.Owner, drainSolution, transferSolution); - - if (puddleSolution.Volume <= 0) - { - QueueDel(puddle); - } + QueueDel(puddle); } } } } + + private void OnExamined(EntityUid uid, DrainComponent component, ExaminedEvent args) + { + if (!args.IsInDetailsRange || + !TryComp(uid, out SolutionContainerManagerComponent? solutionComp) || + !_solutionSystem.TryGetSolution(uid, DrainComponent.SolutionName, out var drainSolution)) + { return; } + + var text = drainSolution.AvailableVolume != 0 ? + Loc.GetString("drain-component-examine-volume", ("volume", drainSolution.AvailableVolume)) : + Loc.GetString("drain-component-examine-hint-full"); + args.Message.AddMarkup($"\n\n{text}"); + } + + private void OnInteract(EntityUid uid, DrainComponent component, InteractEvent args) + { + if (!args.CanReach || args.Target == null || + !_tagSystem.HasTag(args.Used, DrainComponent.PlungerTag) || + !_solutionSystem.TryGetSolution(args.Target.Value, DrainComponent.SolutionName, out var drainSolution)) + { return; } + + if (drainSolution.AvailableVolume > 0) + { + _popupSystem.PopupEntity(Loc.GetString("drain-component-unclog-notapplicable", ("object", args.Target.Value)), args.Target.Value); + return; + } + + _audioSystem.PlayPvs(component.PlungerSound, uid); + + + var doAfterArgs = new DoAfterArgs(args.User, component.UnclogDuration, new DrainDoAfterEvent(),uid, args.Used) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnDamage = true, + BreakOnHandChange = true + }; + + _doAfterSystem.TryStartDoAfter(doAfterArgs); + } + + private void OnDoAfter(EntityUid uid, DrainComponent component, DoAfterEvent args) + { + if (args.Target == null) + return; + + if (!_random.Prob(component.UnclogProbability)) + { + _popupSystem.PopupEntity(Loc.GetString("drain-component-unclog-fail", ("object", args.Target.Value)), args.Target.Value); + return; + } + + + if (!_solutionSystem.TryGetSolution(args.Target.Value, DrainComponent.SolutionName, + out var drainSolution)) + { + return; + } + + + _solutionSystem.RemoveAllSolution(args.Target.Value, drainSolution); + _audioSystem.PlayPvs(component.UnclogSound, args.Target.Value); + _popupSystem.PopupEntity(Loc.GetString("drain-component-unclog-success", ("object", args.Target.Value)), args.Target.Value); + } } diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs index 4ecdefa7f5..c73685c288 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs @@ -1,3 +1,4 @@ +using Content.Server.Fluids.Components; using Content.Shared.Chemistry.Components; using Content.Shared.DragDrop; using Content.Shared.FixedPoint; diff --git a/Content.Shared/Chemistry/SolutionVisuals.cs b/Content.Shared/Chemistry/SolutionVisuals.cs index a0ac0ea403..f24be50364 100644 --- a/Content.Shared/Chemistry/SolutionVisuals.cs +++ b/Content.Shared/Chemistry/SolutionVisuals.cs @@ -8,6 +8,7 @@ namespace Content.Shared.Chemistry Color, FillFraction, BaseOverride, + SolutionName } public enum SolutionContainerLayers : byte diff --git a/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs b/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs index 0ab3eb40b7..8903e23b89 100644 --- a/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs +++ b/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs @@ -89,7 +89,7 @@ public abstract partial class SharedDoAfterSystem : EntitySystem // I feel like this is somewhat cursed, but its the only way I can think of without having to just send // redundant data over the network and increasing DoAfter boilerplate. var evType = typeof(DoAfterAttemptEvent<>).MakeGenericType(args.Event.GetType()); - doAfter.AttemptEvent = _factory.CreateInstance(evType, new object[] { doAfter, args.Event }, inject: false); + doAfter.AttemptEvent = _factory.CreateInstance(evType, new object[] { doAfter, args.Event }); } if (args.EventTarget != null) diff --git a/Content.Shared/Fluids/Components/DrainComponent.cs b/Content.Shared/Fluids/Components/DrainComponent.cs index b456a87fad..f7a88c80e4 100644 --- a/Content.Shared/Fluids/Components/DrainComponent.cs +++ b/Content.Shared/Fluids/Components/DrainComponent.cs @@ -1,15 +1,31 @@ -using Robust.Shared.GameStates; +using Robust.Shared.Audio; namespace Content.Shared.Fluids.Components; -[RegisterComponent, NetworkedComponent] +/// +/// A Drain allows an entity to absorb liquid in a disposal goal. Drains can be filled manually (with the Empty verb) +/// or they can absorb puddles of liquid around them when AutoDrain is set to true. +/// When the entity also has a SolutionContainerManager attached with a solution named drainBuffer, this solution +/// gets filled until the drain is full. +/// When the drain is full, it can be unclogged using a plunger (i.e. an entity with a Plunger tag attached). +/// Later this can be refactored into a proper Plunger component if needed. +/// +[RegisterComponent, Access(typeof(SharedDrainSystem))] public sealed class DrainComponent : Component { public const string SolutionName = "drainBuffer"; + public const string PlungerTag = "Plunger"; [DataField("accumulator")] public float Accumulator = 0f; + /// + /// Does this drain automatically absorb surrouding puddles? Or is it a drain designed to empty + /// solutions in it manually? + /// + [DataField("autoDrain"), ViewVariables(VVAccess.ReadOnly)] + public bool AutoDrain = true; + /// /// How many units per second the drain can absorb from the surrounding puddles. /// Divided by puddles, so if there are 5 puddles this will take 1/5 from each puddle. @@ -28,7 +44,7 @@ public sealed class DrainComponent : Component /// How many (unobstructed) tiles away the drain will /// drain puddles from. /// - [DataField("range")] + [DataField("range"), ViewVariables(VVAccess.ReadWrite)] public float Range = 2f; /// @@ -37,4 +53,25 @@ public sealed class DrainComponent : Component /// [DataField("drainFrequency")] public float DrainFrequency = 1f; + + /// + /// How much time it takes to unclog it with a plunger + /// + [DataField("unclogDuration"), ViewVariables(VVAccess.ReadWrite)] + public float UnclogDuration = 1f; + + /// + /// What's the probability of uncloging on each try + /// + [DataField("unclogProbability"), ViewVariables(VVAccess.ReadWrite)] + public float UnclogProbability = 0.3f; + + [DataField("manualDrainSound"), ViewVariables(VVAccess.ReadOnly)] + public SoundSpecifier ManualDrainSound = new SoundPathSpecifier("/Audio/Effects/Fluids/slosh.ogg"); + + [DataField("plungerSound"), ViewVariables(VVAccess.ReadOnly)] + public SoundSpecifier PlungerSound = new SoundPathSpecifier("/Audio/Items/Janitor/plunger.ogg"); + + [DataField("unclogSound"), ViewVariables(VVAccess.ReadOnly)] + public SoundSpecifier UnclogSound = new SoundPathSpecifier("/Audio/Effects/Fluids/glug.ogg"); } diff --git a/Content.Shared/Fluids/SharedDrainSystem.cs b/Content.Shared/Fluids/SharedDrainSystem.cs new file mode 100644 index 0000000000..43df0c352b --- /dev/null +++ b/Content.Shared/Fluids/SharedDrainSystem.cs @@ -0,0 +1,12 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.Fluids; + +public class SharedDrainSystem : EntitySystem +{ + [Serializable, NetSerializable] + public sealed class DrainDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Resources/Audio/Effects/Fluids/ATTRIBUTION.txt b/Resources/Audio/Effects/Fluids/ATTRIBUTION.txt deleted file mode 100644 index 78c9a1114a..0000000000 --- a/Resources/Audio/Effects/Fluids/ATTRIBUTION.txt +++ /dev/null @@ -1,2 +0,0 @@ -blood1.ogg under CC-0 from https://freesound.org/people/kyles/sounds/453769/ -blood2.ogg under CC-BY 3.0 from https://freesound.org/people/EminYILDIRIM/sounds/554284/ \ No newline at end of file diff --git a/Resources/Audio/Effects/Fluids/attributions.yml b/Resources/Audio/Effects/Fluids/attributions.yml new file mode 100644 index 0000000000..4e28c99252 --- /dev/null +++ b/Resources/Audio/Effects/Fluids/attributions.yml @@ -0,0 +1,14 @@ +- files: ["blood1.ogg"] + license: "CC0-1.0" + copyright: "Created by Kyles" + source: "https://freesound.org/people/kyles/sounds/453769/" + +- files: ["blood2.ogg"] + license: "CC-BY-4.0" + copyright: "Created by EminYILDIRIM" + source: "https://freesound.org/people/EminYILDIRIM/sounds/554284/" + +- files: ["glug.ogg"] + license: "CC0-1.0" + copyright: "Created by brittmosel" + source: "https://freesound.org/people/brittmosel/sounds/529300/" diff --git a/Resources/Audio/Effects/Fluids/glug.ogg b/Resources/Audio/Effects/Fluids/glug.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5828bb05685410bad1fdfbcba3e77d72d6886054 GIT binary patch literal 13897 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 literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/fluids/components/drain-component.ftl b/Resources/Locale/en-US/fluids/components/drain-component.ftl new file mode 100644 index 0000000000..897971a788 --- /dev/null +++ b/Resources/Locale/en-US/fluids/components/drain-component.ftl @@ -0,0 +1,8 @@ +drain-component-empty-verb-using-is-empty-message = { CAPITALIZE(THE($object)) } is empty! +drain-component-empty-verb-target-is-full-message = { CAPITALIZE(THE($object)) } is full! +drain-component-empty-verb-inhand = Empty {$object} +drain-component-examine-hint-full = [color="blue"]It is filled to the brim. Maybe a plunger can help?[/color] +drain-component-examine-volume = [color="blue"]Remaining space - {$volume}u.[/color] +drain-component-unclog-fail = { CAPITALIZE(THE($object)) } is still full. +drain-component-unclog-success = { CAPITALIZE(THE($object)) } unclogs. +drain-component-unclog-notapplicable = { CAPITALIZE(THE($object)) } isn't clogged. diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml index c3674f5a27..a8880fe4f0 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml @@ -4,7 +4,7 @@ sprite: Objects/Specific/Janitorial/janitorial.rsi state: cleaner product: CrateServiceJanitorialSupplies - cost: 500 + cost: 560 category: Service group: market diff --git a/Resources/Prototypes/Catalog/Fills/Crates/service.yml b/Resources/Prototypes/Catalog/Fills/Crates/service.yml index 87323512a8..ed6970400d 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/service.yml @@ -15,6 +15,8 @@ amount: 2 - id: TrashBag amount: 2 + - id: Plunger + amount: 2 - type: entity id: CrateServiceReplacementLights diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml index 7da64f2d1a..75dfcc2de4 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml @@ -71,6 +71,8 @@ amount: 2 - id: FlashlightLantern amount: 2 + - id: Plunger + amount: 2 - type: entity id: ClosetLegalFilled diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index 01cb8f653b..da09e3baff 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -94,6 +94,7 @@ - SheetSteel - SheetPlastic - ResearchDisk + - Plunger chance: 0.6 offset: 0.0 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index 501901a2a7..0d0d3822e9 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -317,6 +317,26 @@ path: /Audio/Effects/metalbreak.ogg - type: ItemMapper mapLayers: + cart_plunger: + whitelist: + tags: + - Plunger + cart_mop: + whitelist: + tags: + - Mop + cart_garbage: + whitelist: + tags: + - TrashBag + cart_replacer: + whitelist: + components: + - LightReplacer + cart_spray: + whitelist: + tags: + - Spray cart_sign1: # this is like stack of floor signs minCount: 1 whitelist: @@ -337,26 +357,10 @@ whitelist: tags: - WetFloorSign - cart_spray: - whitelist: - tags: - - Spray - cart_garbage: - whitelist: - tags: - - TrashBag - cart_replacer: - whitelist: - components: - - LightReplacer cart_bucket: whitelist: tags: - Bucket - cart_mop: - whitelist: - tags: - - Mop sprite: Objects/Specific/Janitorial/janitorial_cart.rsi - type: Appearance - type: SolutionContainerVisuals @@ -392,7 +396,11 @@ - type: Sprite drawdepth: FloorObjects sprite: Objects/Specific/Janitorial/drain.rsi - state: icon + layers: + - state: icon + - map: [ "enum.SolutionContainerLayers.Fill" ] + state: fill-1 + visible: false - type: InteractionOutline - type: Clickable - type: Transform @@ -400,13 +408,18 @@ - type: Physics bodyType: Static canCollide: false - - type: Drain - type: AmbientSound enabled: false volume: -8 range: 8 sound: path: /Audio/Ambience/Objects/drain.ogg + - type: Drain + - type: Appearance + - type: SolutionContainerVisuals + maxFillLevels: 1 + fillBaseName: fill- + solutionName: drainBuffer - type: SolutionContainerManager solutions: drainBuffer: @@ -433,6 +446,24 @@ - !type:PlaySoundBehavior sound: path: /Audio/Effects/metalbreak.ogg + +- type: entity + name: plunger + id: Plunger + parent: BaseItem + description: A plunger with a red plastic suction-cup and a wooden handle. Used to unclog drains. + components: + - type: Tag + tags: + - Plunger + - type: Sprite + netsync: false + sprite: Objects/Specific/Janitorial/janitorial.rsi + state: plunger + - type: Item + sprite: Objects/Specific/Janitorial/janitorial.rsi + heldPrefix: plunger + - type: ItemCooldown - type: GuideHelp guides: - Janitorial diff --git a/Resources/Prototypes/Entities/Structures/Furniture/sink.yml b/Resources/Prototypes/Entities/Structures/Furniture/sink.yml index 0e1654f598..507134364d 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/sink.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/sink.yml @@ -10,9 +10,21 @@ - type: InteractionOutline - type: Sprite sprite: Structures/Furniture/sink.rsi - state: sink_stem + layers: + - state: sink_stem + - map: [ "enum.SolutionContainerLayers.Fill" ] + state: sink-fill-1 + visible: false + netsync: false + - type: Appearance + - type: SolutionContainerVisuals + maxFillLevels: 1 + fillBaseName: sink-fill- + solutionName: drainBuffer - type: SolutionContainerManager solutions: + drainBuffer: + maxVol: 100 tank: maxVol: 500 - type: SolutionRegeneration @@ -24,6 +36,8 @@ - type: DrainableSolution solution: tank - type: ReagentTank + - type: Drain + autoDrain: false - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic @@ -44,6 +58,13 @@ - !type:PlaySoundBehavior sound: path: /Audio/Effects/metalbreak.ogg + - type: AmbientSound + enabled: false + volume: -8 + range: 8 + sound: + path: /Audio/Ambience/Objects/drain.ogg + - type: entity name: sink @@ -53,6 +74,8 @@ components: - type: SolutionContainerManager solutions: + drainBuffer: + maxVol: 200 tank: reagents: - ReagentId: Water @@ -63,9 +86,17 @@ id: SinkWide parent: Sink components: - - type: Sprite - sprite: Structures/Furniture/sink.rsi - state: sink_wide + - type: Sprite + sprite: Structures/Furniture/sink.rsi + layers: + - state: sink_wide + - map: [ "enum.SolutionContainerLayers.Fill" ] + state: sink_wide-fill-1 + visible: false + - type: SolutionContainerVisuals + maxFillLevels: 1 + fillBaseName: sink_wide-fill- + solutionName: drainBuffer #Stemless Sink @@ -76,7 +107,11 @@ components: - type: Sprite sprite: Structures/Furniture/sink.rsi - state: sink + layers: + - state: sink + - map: [ "enum.SolutionContainerLayers.Fill" ] + state: sink-fill-1 + visible: false - type: entity name: sink @@ -86,6 +121,8 @@ components: - type: SolutionContainerManager solutions: + drainBuffer: + maxVol: 100 tank: reagents: - ReagentId: Water diff --git a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml index 9d476ddca1..af0d2f1794 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml @@ -22,6 +22,8 @@ stash: !type:ContainerSlot {} - type: SolutionContainerManager solutions: + drainBuffer: + maxVol: 500 toilet: maxVol: 250 - type: Transform @@ -32,6 +34,12 @@ graph: Toilet node: toilet - type: Appearance + - type: Drain + autoDrain: false + - type: SolutionContainerVisuals + maxFillLevels: 1 + fillBaseName: fill- + solutionName: drainBuffer - type: StaticPrice price: 25 diff --git a/Resources/Prototypes/Recipes/Lathes/janitorial.yml b/Resources/Prototypes/Recipes/Lathes/janitorial.yml index 902569e4b0..2fd153852f 100644 --- a/Resources/Prototypes/Recipes/Lathes/janitorial.yml +++ b/Resources/Prototypes/Recipes/Lathes/janitorial.yml @@ -18,7 +18,7 @@ result: Bucket completetime: 2 materials: - Plastic: 100 + Steel: 100 - type: latheRecipe id: WetFloorSign @@ -81,6 +81,14 @@ Steel: 100 Glass: 100 +- type: latheRecipe + id: Plunger + result: Plunger + completetime: 2 + materials: + Plastic: 50 + Wood: 200 + - type: latheRecipe id: WeaponSprayNozzle result: WeaponSprayNozzle diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 8c712a7dcc..208e99dd1f 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -631,9 +631,13 @@ - type: Tag id: Plastic +- type: Tag + id: Plunger + - type: Tag id: PlushieGhost + - type: Tag id: Powerdrill diff --git a/Resources/Textures/Objects/Specific/Janitorial/drain.rsi/fill-1.png b/Resources/Textures/Objects/Specific/Janitorial/drain.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..31540a6e028c8bd0cca886855ee01e864e0a46dd GIT binary patch literal 3260 zcmb7Hdsq`!79a2dqM)m_;yW9kR3@3cGa->zM6xv)Awaa+GMSmcNRkONg9Kd!+5NgI zO2tRDYOT+;Dk`?>s;r9WC%QfmZDrN2BCg_VL0aqAYLUH@&;)$++x;WS%suD)&N;tx z?zuOMOi7bNLxzMv5EN=i)F*@A82%I76MXNaa&AIUFiV*&oW(drgVPQXM$lGLQX_u%+_2P(TqnVYBB9f-lS|a{kCv~6Ce~!o38kPB_#$~$ zOm>X3(ToH19OWeFJk~EVQw}nP!+0(vN(CZUt5KC&u2LzHPWEXe!-5XrQ6-2-s`i)@ zxF!K$VjxM%fn}0nmow8N;ESV)r|mS80y>}636%Toe6+hOG~@~j(p|5He3CYJ@gdC~lWbc%R&eJVo%vN67`LEe5K6VEuU2TtZFGNM^FStNm32VNd=}x2|}*G zy#xXS00GJdMkr?Q92E~m04Q9hQsWZB3R@9{4VEiGG-?nXY?I?Qxtu^z+)8+8^KBb% zj{*h(cU~`kks&_b#Lza%4rCtIt+|w)gDIzgO`aU*nU4akr^VtZjxV>j@ci8Dn4BqO zj`z(wNbS@_wN}iJQ1Il@`hVBG*1y7P#c%Ph^-`5cv7l}8e=8tw6kv+;)MB`IGqBhk z(#w-)!1E$J3v*_Y;K1sbZ~Wlr*QqxY6jP9-R7HYLkdrv*36%;)2}B7irB;<3!%(>r zM?F>Wp|iA&%flElHWRcNAR9E9r^N;1J7!fxSN*&!k{?6}IJ6KsEJe%`l?FjIGPO|L zmDi5+JagEWo{OQ0T-=|bSNci}u{Ik8Hg>+iGY$mcSVBbJ`30i(TKJ-P%Z}@a<<*+K zRvWKEr&AW>;9Uc!H@F6fefI$H;=4(ZPEZX7+!IdUu!tZipo9YL`g)r}(D<@~vZ%z9 zF~d$DpSV>xFi4h|bH?;}9xxI@wrFZ}R zrS&m->t8pVkF?!Jk2T-E^J3PL%>4Q`^!cjdv(Oib+8XYp@TOqHwf)@17pDRzydTnv zwyudCGQUnXCbKf0R9sItz91uL4g*7KGy7B z{~wFNc@pWfwWNCQB}4nU)dk;AV5Uv&Zb_X<)L{W^kw$%W}b-=TeHo~UUm`s{R?>%iaVRs^2c9!g-yuuF3j3*h!BUC0Nn zrkBx;tz~G;d#CSyhsGx+t$(nNE&4R$u>C$8S!0?Ixf*_|`$yg7=;8g0f*}zxz|B^u zuKVV)K>dJ)2_e2k?T1D5`~7vPbzeWr88)=4WyRp5>(#aF4}u-ve)ORIrz;!p7tP3y zD#dplQ0|O8Qlu#=S)F`6b=;+wP$B)t(Lv2GoDaVUTUPw#i22oRv)0v&69f#;nDwWG zuoFXO_Prt;Kd|Cd`lepvf2?3)vhkhTy+y@4Viy)WWqIP_ zZ7Y@6lja2p#6#+P?km&<|5zFNmsKg-$3r{w?;>CQVM+Cop3}n6;K7okJ>4S{%G;=d z$G7+O-qtPBa6QLdvbXW#gu^va4Xs;TemZ`EZj;7Gqc618@_#xElalm%;xdZ=3+Wtv A8vp*rC^|xT9KJ%tCUevQedU8pI5Ax zn3A8As+XLfs}GXVHv}rbu8=gDPoYM)AS1sdzc?em0K0m)G)R;FWHqJ2$wEq!^&n%c zobz+?i-HRhlT&S#%uG#0e^F*?UP)pJ*nUHVNdX`q z=cbkvWhQ&(m82E{t%IpDL#PT$EzZv=1!)e=%Pg@~GD1iNC%WbqcRv{f=U(nqp55>0CIN+rcuP>@yR7FhY_r(~v8x+InW1JlUB$XM6FSl7@n#K_3X z$jr*bMBBj7%D@0@4OlhM$tj5?i3HS7Hc`A61CK&TgaIuAS^;q}Ldw(GIiM&%Ei(rw z=kDnnppaCWnNy;hnWs=3ZJ) z8t9o$UZ^ZChCMnapHL1pwXv@NW`XR~5{1+}pxs4E_I4~gd*v7y7`ropfr=TJ3=A3* zH&2%>Wvrhdzp9jhfq}EYBeIx*fm;}a85w5Hkzin8+Un`z7*a9kZPebPM+O4_^d{>~ zZ#w5Xsi}`iL&CPTo$1BON*-G_eMXU<`G=e*?ru8A8nDAZ=(kqkzlkZFDVoABXMa@4 zZrwk3>z1hZTpS!6A0+p`lD+(LOTt^5^Su*X0!wn=*MI-bw%q&QajTyxMvM$8k!^A7 z(_I)DUVQ((CbFaFLDT<<=0D!gFQ0QxJoyR3hp#^yA7-pExu*8td9U(mBcSM!!XAsh ziOV$a#l=rp_VR1ecdKN-=iHlgvO}+!)u(C+IdvUOXn6dw!=i7i&Ydj)3Dy&9w_^_{?f;|}QSY~|dx}W+8@~2t1H)HM z^Jfdo^c}1C^*1M^F(_!0sM*iG{@v^>AW*@R=yL4V_jgCPzd303Q+i^8xN6qaOFOjd z@-%p6=mx%?axC|AF>iogAoHU~kCN<|75uC={a5u|BzpVylY9w<^Pi7xNshes%cAXJ zhR)Q}zxGMnb0{7ys^6)@p~%|M6cokqAa2T~Fw2HT-_GP8)&IhH;J@a!xb-`W(gJ7J z7|y@DXId^WNH*MjXCTwNF>39OqHV`gKAkONck1Xlrn&zL1JCz8jKVJ_#h+w=F!l>h z>CoDe8yBV$zLsbAqwr6RO5WRKos6C`?|L%*97FKV%Biy&wCl3pdnfb$5aVD~*9bnw zt}el(D9Tz_q#$C~mcsSpgW(bxj=Qf~8I2nQ!vFM2Dp)N!(46Jv^)2W6pF5v+ymaQ$ xYFCc=$X(lT(wWPuT{-7-b-V;8#|N4J4C-r?Ba+r1oCi$W44$rjF6*2UngGBuh7bS% literal 12057 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 F{{R=napC{~ diff --git a/Resources/Textures/Objects/Specific/Janitorial/drain.rsi/meta.json b/Resources/Textures/Objects/Specific/Janitorial/drain.rsi/meta.json index 7835a4c7bf..e40dbb086d 100644 --- a/Resources/Textures/Objects/Specific/Janitorial/drain.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Janitorial/drain.rsi/meta.json @@ -5,11 +5,15 @@ "y":32 }, "license":"CC-BY-SA-3.0", - "copyright":"Created by EmoGarbage", + "copyright":"Created by EmoGarbage, fill-1 created by Topy for SS14", "states":[ { "name":"icon", "directions": 4 - } + }, + { + "name": "fill-1", + "directions": 4 + } ] } diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json index ae3103e2be..177bd8e619 100644 --- a/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json @@ -24,6 +24,9 @@ }, { "name": "mopbucket_water-3" + }, + { + "name": "plunger" }, { "name": "inhand-left", @@ -36,6 +39,14 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "plunger-inhand-left", + "directions": 4 + }, + { + "name": "plunger-inhand-right", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/plunger-inhand-left.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/plunger-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b319f401347d07da8062fd6d4f65e5da04473c GIT binary patch literal 2037 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_plunger.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/cart_plunger.png new file mode 100644 index 0000000000000000000000000000000000000000..37779d4361b5e6edb2762d4a6940ff796bdd6b31 GIT binary patch literal 1900 zcmah~e^Ap_91o{>ij*mW^W2Sv2u_70ZJ{Vx0|Kp3rHsQW#XHf^rZn0%p-FAQO@3@1 z;0~r9LuF3k4|j-8-01-Irfg2c&3W6@sdI-Dooo}SKTfAIkG-S_BD(c1P2T%_zMt>+ zeZSxLUS(!Rsw`l700coYU798fyyuJ0_;KLBi7DuUpt1WIgHbT*(+Lx6$0#$KM`Ip4 z2XF{dCwe%_w3-&+JUX9okcjulF$8AJB$BPt%k^9eZDrDmob=+N41=j?wJF|=Bqju? zJp>T2(*gy1>^28act}LjCBU~hjU%u`5mu9kQJ)E?uud9QVJb|HBm}@}r`bYeX%-9` zgAs{X1%V@Q-0gN_?ih@9=HrU^_;_5d#Fa`EFi^hGAy6LF!OsvSd>R^>H#r$jU|0t% zYEpTuOCS*h;P9Zhz*vUW9sJ<(K_YMw!4;Ssf0j;rn3vE+WE7pVvI5InS#D?nBU}u@ zqYOd%UTor_xEGQ2`v0ce?IV`K3)(dx5rat`5z|u#yrGbz@hqBWT}~6NT|+yB8B!+1 zybwA&l~1SBj(ovNB5|?L0ojcC`FT;u<`OHh#K8d9%3%}ZFh(MCmAGOU%6TCqrkcoP zJhaWIVeGVn2dYC+41+l@0aI8T>s$=lnkEsSuc0~+5~gR(0E&^q7>0ByDVa{z!q@=D zXQd{?I&DgvB0eq-RboCFP&5MAGL}LOB>; zf|(Mi|Kp1t4Xc5LUQeVkyudmOr72&VFQyB8Bj3=*Nc|1NQk4nHBxapNI45g%nP{`* z9LV`lp0x;W%1I~Xg94LClEuP+`V_*MV&}pNOd-cqBQ4xk8mPT|ZTMhhxVYn;c_L&p&90B4UA95SbWEe?htzfuO2WmGvJXx1jzrX!2S zBuy$$oT9xW3s_b$wsPqlMRG-zwroKXx_SK3y6bm?@6PKBj<^`m;^+TkM|MMTX-nA` z@T?7R%d)6n8n^S68(~ZBrAH51-#XqGZ7kD8?z%w0ADvmXZs*CC{cYww#T^Tymbd*W zn|+vgZEIlG`Gmek#kKD@=InWVsQ9zl!RJF8nMq;U1~f_?sXkDF&k)>DaeMde z`kAkW997-tDp#aeZ+ZBg8U5q$vR%tBPHp~;^N*TZ&cPzY7bESVP&QyQeGbXtI zo3%gOxpw@$DrV;G?!5OE+m;7jH5->2PPs$w^>n7~Lk=tqt6I_>(W#uZDx)bivP1LX zw`rT__7Ai+7un9`G*>kFzJ`KB=MG$Xx7r)thOKbo4F(oIs*ubel?NsMD3-~va4+gGVPJDc-w{DYo3DvJB3d_s8I@z-y zL@@W-ZgeplT&>y@>a(il)G`^BU4iT;la6{W4#vy4=71 zU~4p5^CgXjgf;Yzw}j>P9YMnK=riR?`C%Vu1~tX{-O_^Hbb*7d1cwZT1TCe literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/meta.json b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/meta.json index 846a3157a5..8691dc073c 100644 --- a/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Janitorial/janitorial_cart.rsi/meta.json @@ -46,6 +46,10 @@ { "name": "cart_spray", "directions": 4 + }, + { + "name": "cart_plunger", + "directions": 4 }, { "name": "cart_water-1", diff --git a/Resources/Textures/Structures/Furniture/sink.rsi/meta.json b/Resources/Textures/Structures/Furniture/sink.rsi/meta.json index e00dcab8e4..a2c289e8cf 100644 --- a/Resources/Textures/Structures/Furniture/sink.rsi/meta.json +++ b/Resources/Textures/Structures/Furniture/sink.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation https://github.com/tgstation/tgstation/commit/f01afc7edd39b28dd718407d5bbfca3a5dfe995f#diff-378d1b8f0f0a73185e7c82e4ccfdb65102561992a7abb306090ce851f8419780", + "copyright": "Taken from tgstation https://github.com/tgstation/tgstation/commit/f01afc7edd39b28dd718407d5bbfca3a5dfe995f#diff-378d1b8f0f0a73185e7c82e4ccfdb65102561992a7abb306090ce851f8419780, sink-fill-1 and sink_wide-fill-1 made by Topy for SS14", "states": [ { "name": "sink", @@ -18,6 +18,14 @@ { "name": "sink_stem", "directions": 4 + }, + { + "name": "sink-fill-1", + "directions": 4 + }, + { + "name": "sink_wide-fill-1", + "directions": 4 } ] } diff --git a/Resources/Textures/Structures/Furniture/sink.rsi/sink-fill-1.png b/Resources/Textures/Structures/Furniture/sink.rsi/sink-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec7cf03e2c462d2f8f043f51bae0a9381048b02 GIT binary patch literal 1884 zcmah~4@?tR7(XX-1Ln*GBF^c~GcF)&@7fC3vj>*8LX|TVP%9|oY_ILvUa#I=?H|xN zO*C#(gbjxXf+j9()8RI!QO9s|xJ_Zg6qe0|42jVY8R#~rF^0Ws5kz#m+x_xpa| z_rCAFcRO;HWloNIISPWH$;K>wE_g4J?&l|g=f}+YZU~Av%H*3xGntKBI95(sxwW+1 z&w2n3L7H^Ghq5?n5nfB%88?9poNh*7#!4V7lSz#9=x7I%73Ar>;Ie#6&}mUyk@U1E zjUNXBEG<&7pLMwf+)p4OT^xK%W)y)#6wyf_W-Ez_o?I@Z$}kswHn2gs8T5d44DvciKyu5`rY@prZoKPjC zy5L5ZveVhL+b%i?BxU|%z)HsYxLp!*d8JM)cQYWga@55<>stDXo+rN(m@ zKkYK>8J2bnKy@UGQE=5$Kpp4e_&l(zX#xqy8tDTb!br{vAXO-hQOKy%Rh>XQJZJS% z?rqmsRo@AewY+;`))y=Kg`w(=b3aTfW@2aM<;#*ZiJGSU%gOGS+<6t{aXqS@B2u1E zYVYfq+FV_eaO=d61q*IG=X~dAlBuO*-inHX0&~%>g|+7suidXg*MFxJX75;Ywf06t zkEBz3+^_gQiL8=2conn_n;R@>&?b8g3O&ki0qcyh{_labd~ z#>q}aPb+M{)v);34~^EC6X$vdH$=5Xw+APZOAqa@{6`(wJh-j2Gx=t}uB^r<|JyfFXWAIh!V(*om`nLJ<@owR#t4+S9>#Ek+`nU|w-!mboxQmK0ajCM} z+wJk!?lf#YT>D3r;(Xi96?Y3077^y2?=vcUXHH4q$>UAW__86Hvd!!rG+8O2-v1-UPm%>V!Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Furniture/sink.rsi/sink_wide-fill-1.png b/Resources/Textures/Structures/Furniture/sink.rsi/sink_wide-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bba702a28d780b0044c7dda238fc2d6c9f864e94 GIT binary patch literal 1855 zcmah~eNlE*WqSu#wtMI9o!b!7 zJf{=gb^I)XO!1=*mNg`G9!o?!O7Fcx5YhVM-n-}d{hr_Z zywCHz@7^_Krbb7Ni$V}2+Mw5E!SAcW^VA6V{)%4o3xW)Jk9hB4k1vs4cXV2b$?HI|(C5RgmT9`*}D4v)}@9EOHV%LhU%1DG0{A;)C{P~IaUq12>_ z_5p`QM>_$-LDl{&2Ee?>fLhkUy0hU}12q<2tG^GVh#6TMgcM>L1CT+hHMv(2E&@#ojGgUdvan$%7`mqP1o71{tUw(5(Rr1c}8}4(vK3aZOu1e{DOOzI|HZw#q{>Q`;=VbrSu}%{5h>hPb#D znZ3Q;Kb^Ys&xNjgW6U$#yVIXEI}ZlyolT+h-NA^SYZnu8kGF&l9jxyBGrqPWwk!AI zr30Je_jK^l`Pcs5`%Le;a(P45h?Z2-jFHCmCPk?GN-%J^ptAO8?)-z@qxiJ)yUno? zw~O~qjhj#n|1Bb2`aBLnMm{S%5lB^FEOdTh(9JUY0$0z?jXI1zjhJ33)30hTU^E4n z-}!aS9!o_iJK@DiZR4t9O3&wyU-_GF-D&Rof|kZs)n~&hw<4_(y7NmW)_m-TO3PZK z)pZ${Z)wl|o?3Jw_R}RVjoos(?Gw+gGz956etUk!nWg3V`F_dL@vk=`K~K-Qu3d#w z(~s