diff --git a/Content.Shared/Chemistry/Components/ReactiveContainerComponent.cs b/Content.Shared/Chemistry/Components/ReactiveContainerComponent.cs
new file mode 100644
index 0000000000..6aefd8f462
--- /dev/null
+++ b/Content.Shared/Chemistry/Components/ReactiveContainerComponent.cs
@@ -0,0 +1,21 @@
+namespace Content.Shared.Chemistry.Components;
+
+///
+/// Represents a container that also contains a solution.
+/// This means that reactive entities react when inserted into the container.
+///
+[RegisterComponent]
+public sealed partial class ReactiveContainerComponent : Component
+{
+ ///
+ /// The container that holds the solution.
+ ///
+ [DataField(required: true)]
+ public string Container = default!;
+
+ ///
+ /// The solution in the container.
+ ///
+ [DataField(required: true)]
+ public string Solution = default!;
+}
diff --git a/Content.Shared/Chemistry/EntitySystems/ReactiveContainerSystem.cs b/Content.Shared/Chemistry/EntitySystems/ReactiveContainerSystem.cs
new file mode 100644
index 0000000000..aa217c60ba
--- /dev/null
+++ b/Content.Shared/Chemistry/EntitySystems/ReactiveContainerSystem.cs
@@ -0,0 +1,53 @@
+using Content.Shared.Chemistry.Components;
+using Content.Shared.Chemistry.Reaction;
+using Robust.Shared.Containers;
+
+namespace Content.Shared.Chemistry.EntitySystems;
+
+public sealed class ReactiveContainerSystem : EntitySystem
+{
+ [Dependency] private readonly SharedContainerSystem _containerSystem = default!;
+ [Dependency] private readonly ReactiveSystem _reactiveSystem = default!;
+ [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnInserted);
+ SubscribeLocalEvent(OnSolutionChange);
+ }
+
+ private void OnInserted(EntityUid uid, ReactiveContainerComponent comp, EntInsertedIntoContainerMessage args)
+ {
+ // Only reactive entities can react with the solution
+ if (!HasComp(args.Entity))
+ return;
+
+ if (!_solutionContainerSystem.TryGetSolution(uid, comp.Solution, out _, out var solution))
+ return;
+ if (solution.Volume == 0)
+ return;
+
+ _reactiveSystem.DoEntityReaction(args.Entity, solution, ReactionMethod.Touch);
+ }
+
+ private void OnSolutionChange(EntityUid uid, ReactiveContainerComponent comp, SolutionContainerChangedEvent args)
+ {
+ if (!_solutionContainerSystem.TryGetSolution(uid, comp.Solution, out _, out var solution))
+ return;
+ if (solution.Volume == 0)
+ return;
+ if (!TryComp(uid, out var manager))
+ return;
+ if (!_containerSystem.TryGetContainer(uid, comp.Container, out var container))
+ return;
+
+ foreach (var entity in container.ContainedEntities)
+ {
+ if (!HasComp(entity))
+ continue;
+ _reactiveSystem.DoEntityReaction(entity, solution, ReactionMethod.Touch);
+ }
+ }
+}
diff --git a/Resources/Locale/en-US/janitorial/janitorial-slot-component.ftl b/Resources/Locale/en-US/janitorial/janitorial-slot-component.ftl
index b722116587..bc03943a01 100644
--- a/Resources/Locale/en-US/janitorial/janitorial-slot-component.ftl
+++ b/Resources/Locale/en-US/janitorial/janitorial-slot-component.ftl
@@ -1,5 +1,6 @@
# mop bucket
-mop-bucket-slot-component-slot-name-shark = Shark
+mop-bucket-slot-component-slot-name-item = Item
+mop-bucket-slot-component-eject-verb = Take out
# janitorial trolley
janitorial-trolley-slot-component-slot-name-plunger = Plunger
janitorial-trolley-slot-component-slot-name-sign = Sign
diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml
index c3ef0d0329..d774c4469c 100644
--- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml
+++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml
@@ -599,6 +599,11 @@
path: /Audio/Effects/bite.ogg
angle: 0
animation: WeaponArcBite # Rrrr!
+ - type: Tag
+ tags:
+ - Payload
+ - ClothMade
+ - PlushieCarp
- type: entity
parent: PlushieCarp
diff --git a/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml b/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml
index 6ed06addcd..d74fe8b0f1 100644
--- a/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml
+++ b/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml
@@ -47,19 +47,30 @@
whitelist:
tags:
- PlushieSharkGrey
- sprite: Objects/Fun/sharkplush.rsi
+ mopbucket_carpplush:
+ whitelist:
+ tags:
+ - PlushieCarp
+ sprite: Objects/Specific/Janitorial/janitorial.rsi
- type: Transform
noRot: true
- type: ItemSlots
slots:
- shark_slot:
- name: mop-bucket-slot-component-slot-name-shark
+ item_slot:
+ name: mop-bucket-slot-component-slot-name-item
+ ejectVerbText: mop-bucket-slot-component-eject-verb
whitelist:
tags:
- PlushieSharkBlue
- PlushieSharkPink
- PlushieSharkGrey
+ - PlushieCarp
+ components:
+ - Rehydratable
priority: 3 # Higher than drinking priority
+ - type: ReactiveContainer
+ solution: bucket
+ container: item_slot
- type: Drink
solution: bucket
- type: Appearance
@@ -70,7 +81,7 @@
containers:
storagebase: !type:Container
ents: []
- shark_slot: !type:ContainerSlot {}
+ item_slot: !type:ContainerSlot {}
- type: GuideHelp
guides:
- Janitorial
diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml
index 8962da5790..48bce7ddab 100644
--- a/Resources/Prototypes/tags.yml
+++ b/Resources/Prototypes/tags.yml
@@ -1071,6 +1071,9 @@
- type: Tag
id: Plunger
+- type: Tag
+ id: PlushieCarp
+
- type: Tag
id: PlushieGhost
diff --git a/Resources/Textures/Objects/Fun/sharkplush.rsi/meta.json b/Resources/Textures/Objects/Fun/sharkplush.rsi/meta.json
index eca1964c4d..12144d3559 100644
--- a/Resources/Textures/Objects/Fun/sharkplush.rsi/meta.json
+++ b/Resources/Textures/Objects/Fun/sharkplush.rsi/meta.json
@@ -39,15 +39,6 @@
{
"name": "grey-inhand-right",
"directions": 4
- },
- {
- "name": "mopbucket_shark_blue"
- },
- {
- "name": "mopbucket_shark_pink"
- },
- {
- "name": "mopbucket_shark_grey"
}
]
}
\ No newline at end of file
diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json
index ae3103e2be..4f7a1e7772 100644
--- a/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json
+++ b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428",
+ "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428, mopbucket_shark_* by Psychpsyo, mopbucket_carpplush adapted by Psychpsyo from tgstation carpplush at commit https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432",
"size": {
"x": 32,
"y": 32
@@ -25,6 +25,18 @@
{
"name": "mopbucket_water-3"
},
+ {
+ "name": "mopbucket_shark_blue"
+ },
+ {
+ "name": "mopbucket_shark_pink"
+ },
+ {
+ "name": "mopbucket_shark_grey"
+ },
+ {
+ "name": "mopbucket_carpplush"
+ },
{
"name": "inhand-left",
"directions": 4
diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_carpplush.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_carpplush.png
new file mode 100644
index 0000000000..07ef0a77d0
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_carpplush.png differ
diff --git a/Resources/Textures/Objects/Fun/sharkplush.rsi/mopbucket_shark_blue.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_shark_blue.png
similarity index 100%
rename from Resources/Textures/Objects/Fun/sharkplush.rsi/mopbucket_shark_blue.png
rename to Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_shark_blue.png
diff --git a/Resources/Textures/Objects/Fun/sharkplush.rsi/mopbucket_shark_grey.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_shark_grey.png
similarity index 100%
rename from Resources/Textures/Objects/Fun/sharkplush.rsi/mopbucket_shark_grey.png
rename to Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_shark_grey.png
diff --git a/Resources/Textures/Objects/Fun/sharkplush.rsi/mopbucket_shark_pink.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_shark_pink.png
similarity index 100%
rename from Resources/Textures/Objects/Fun/sharkplush.rsi/mopbucket_shark_pink.png
rename to Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_shark_pink.png