diff --git a/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs b/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs
index 8d28737c05..769d14fd16 100644
--- a/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs
+++ b/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs
@@ -63,7 +63,7 @@ namespace Content.Server.GameObjects.Components.Fluids
get => _slipThreshold;
set => _slipThreshold = value;
}
- private bool _slippery = false;
+
private float _evaporateTime;
private string _spillSound;
@@ -97,6 +97,8 @@ namespace Content.Server.GameObjects.Components.Fluids
// Whether the underlying solution color should be used
private bool _recolor;
+ private bool Slippery => Owner.TryGetComponent(out SlipperyComponent slippery) && slippery.Slippery;
+
///
public override void ExposeData(ObjectSerializer serializer)
{
@@ -107,7 +109,6 @@ namespace Content.Server.GameObjects.Components.Fluids
serializer.DataField(ref _evaporateThreshold, "evaporate_threshold", ReagentUnit.New(20));
serializer.DataField(ref _spriteVariants, "variants", 1);
serializer.DataField(ref _recolor, "recolor", false);
-
}
public override void Initialize()
@@ -155,7 +156,7 @@ namespace Content.Server.GameObjects.Components.Fluids
void IExamine.Examine(FormattedMessage message, bool inDetailsRange)
{
- if(_slippery)
+ if(Slippery)
{
message.AddText(Loc.GetString("It looks slippery."));
}
@@ -246,15 +247,15 @@ namespace Content.Server.GameObjects.Components.Fluids
private void UpdateSlip()
{
- if ((_slipThreshold == ReagentUnit.New(-1) || CurrentVolume < _slipThreshold) && Owner.TryGetComponent(out SlipperyComponent existingSlipperyComponent))
+ if ((_slipThreshold == ReagentUnit.New(-1) || CurrentVolume < _slipThreshold) &&
+ Owner.TryGetComponent(out SlipperyComponent oldSlippery))
{
- Owner.RemoveComponent();
- _slippery = false;
+ oldSlippery.Slippery = false;
}
- else if (CurrentVolume >= _slipThreshold && !Owner.TryGetComponent(out SlipperyComponent newSlipperyComponent))
+ else if (CurrentVolume >= _slipThreshold)
{
- Owner.AddComponent();
- _slippery = true;
+ var newSlippery = Owner.EnsureComponent();
+ newSlippery.Slippery = true;
}
}
diff --git a/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs
index 013b40e59e..d232ffaa50 100644
--- a/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs
+++ b/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs
@@ -44,9 +44,16 @@ namespace Content.Shared.GameObjects.Components.Movement
[ViewVariables(VVAccess.ReadWrite)]
private float RequiredSlipSpeed { get; set; } = 0f;
+ ///
+ /// Whether or not this component will try to slip entities.
+ ///
+ [ViewVariables(VVAccess.ReadWrite)]
+ public bool Slippery { get; set; }
+
private bool TrySlip(IEntity entity)
{
- if (ContainerHelpers.IsInContainer(Owner)
+ if (!Slippery
+ || ContainerHelpers.IsInContainer(Owner)
|| _slipped.Contains(entity.Uid)
|| !entity.TryGetComponent(out SharedStunnableComponent stun)
|| !entity.TryGetComponent(out ICollidableComponent otherBody)
@@ -137,6 +144,7 @@ namespace Content.Shared.GameObjects.Components.Movement
serializer.DataField(this, x => ParalyzeTime, "paralyzeTime", 3f);
serializer.DataField(this, x => IntersectPercentage, "intersectPercentage", 0.3f);
serializer.DataField(this, x => RequiredSlipSpeed, "requiredSlipSpeed", 0f);
+ serializer.DataField(this, x => x.Slippery, "slippery", true);
}
}
}
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/trash.yml b/Resources/Prototypes/Entities/Objects/Consumable/trash.yml
index 06cbdacf41..dd95f0e23f 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/trash.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/trash.yml
@@ -207,10 +207,17 @@
parent: TrashBase
id: TrashBananaPeel
components:
- - type: Sprite
- sprite: Objects/Consumable/Food/banana.rsi
- state: peel
- - type: Icon
- sprite: Objects/Consumable/Food/banana.rsi
- state: peel
- - type: Slippery
+ - type: Sprite
+ sprite: Objects/Consumable/Food/banana.rsi
+ state: peel
+ - type: Icon
+ sprite: Objects/Consumable/Food/banana.rsi
+ state: peel
+ - type: Slippery
+ intersectPercentage: 0.2
+ - type: Collidable
+ shapes:
+ - !type:PhysShapeAabb
+ bounds: "-0.2,-0.2,0.2,0.2"
+ layer:
+ - MobImpassable
diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml
index 672db4b488..0675fd443f 100644
--- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml
+++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml
@@ -85,6 +85,12 @@
map: ["enum.PDAVisualLayers.Flashlight"]
- type: Slippery
paralyzeTime: 4
+ - type: Collidable
+ shapes:
+ - !type:PhysShapeAabb
+ bounds: "-0.25,-0.25,0.25,0.25"
+ layer:
+ - MobImpassable
- type: entity
name: Cargo PDA
diff --git a/Resources/Prototypes/Entities/Objects/Specific/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/janitor.yml
index 7386b835b5..419856502b 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/janitor.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/janitor.yml
@@ -102,17 +102,22 @@
parent: BaseItem
description: A cheap bar of soap. Doesn't smell.
components:
- - type: Sprite
- sprite: Objects/Specific/Janitorial/soap.rsi
- state: soap
- - type: Icon
- sprite: Objects/Specific/Janitorial/soap.rsi
- state: soap
- - type: Item
- sprite: Objects/Specific/Janitorial/soap.rsi
- - type: Slippery
- paralyzeTime: 2.5
-
+ - type: Sprite
+ sprite: Objects/Specific/Janitorial/soap.rsi
+ state: soap
+ - type: Icon
+ sprite: Objects/Specific/Janitorial/soap.rsi
+ state: soap
+ - type: Item
+ sprite: Objects/Specific/Janitorial/soap.rsi
+ - type: Slippery
+ paralyzeTime: 2.5
+ - type: Collidable
+ shapes:
+ - !type:PhysShapeAabb
+ bounds: "-0.3,-0.4,0.3,0.4"
+ layer:
+ - MobImpassable
- type: entity
name: soap
diff --git a/Resources/Prototypes/Entities/puddle.yml b/Resources/Prototypes/Entities/puddle.yml
index 7f28f6986f..f4a6faaab8 100644
--- a/Resources/Prototypes/Entities/puddle.yml
+++ b/Resources/Prototypes/Entities/puddle.yml
@@ -15,10 +15,13 @@
- type: LoopingSound
- type: InteractionOutline
- type: Clickable
+ - type: Slippery
- type: Collidable
shapes:
- !type:PhysShapeAabb
- bounds: "-0.5,-0.5,0.5,0.5"
+ bounds: "-0.4,-0.4,0.4,0.4"
+ layer:
+ - MobImpassable
hard: false
- type: entity