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