Fix slippery items not being slippery (#1948)

* Fix slippery items not being slippery

* Fix slippery not being slippery part 2 redux electric boogaloo

* You got a license for that hard collidable?
This commit is contained in:
DrSmugleaf
2020-08-29 13:13:22 +02:00
committed by GitHub
parent c37c39fe3c
commit 4d23bbf4df
6 changed files with 59 additions and 29 deletions

View File

@@ -63,7 +63,7 @@ namespace Content.Server.GameObjects.Components.Fluids
get => _slipThreshold; get => _slipThreshold;
set => _slipThreshold = value; set => _slipThreshold = value;
} }
private bool _slippery = false;
private float _evaporateTime; private float _evaporateTime;
private string _spillSound; private string _spillSound;
@@ -97,6 +97,8 @@ namespace Content.Server.GameObjects.Components.Fluids
// Whether the underlying solution color should be used // Whether the underlying solution color should be used
private bool _recolor; private bool _recolor;
private bool Slippery => Owner.TryGetComponent(out SlipperyComponent slippery) && slippery.Slippery;
/// <inheritdoc /> /// <inheritdoc />
public override void ExposeData(ObjectSerializer serializer) 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 _evaporateThreshold, "evaporate_threshold", ReagentUnit.New(20));
serializer.DataField(ref _spriteVariants, "variants", 1); serializer.DataField(ref _spriteVariants, "variants", 1);
serializer.DataField(ref _recolor, "recolor", false); serializer.DataField(ref _recolor, "recolor", false);
} }
public override void Initialize() public override void Initialize()
@@ -155,7 +156,7 @@ namespace Content.Server.GameObjects.Components.Fluids
void IExamine.Examine(FormattedMessage message, bool inDetailsRange) void IExamine.Examine(FormattedMessage message, bool inDetailsRange)
{ {
if(_slippery) if(Slippery)
{ {
message.AddText(Loc.GetString("It looks slippery.")); message.AddText(Loc.GetString("It looks slippery."));
} }
@@ -246,15 +247,15 @@ namespace Content.Server.GameObjects.Components.Fluids
private void UpdateSlip() 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<SlipperyComponent>(); oldSlippery.Slippery = false;
_slippery = false;
} }
else if (CurrentVolume >= _slipThreshold && !Owner.TryGetComponent(out SlipperyComponent newSlipperyComponent)) else if (CurrentVolume >= _slipThreshold)
{ {
Owner.AddComponent<SlipperyComponent>(); var newSlippery = Owner.EnsureComponent<SlipperyComponent>();
_slippery = true; newSlippery.Slippery = true;
} }
} }

View File

@@ -44,9 +44,16 @@ namespace Content.Shared.GameObjects.Components.Movement
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
private float RequiredSlipSpeed { get; set; } = 0f; private float RequiredSlipSpeed { get; set; } = 0f;
/// <summary>
/// Whether or not this component will try to slip entities.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public bool Slippery { get; set; }
private bool TrySlip(IEntity entity) private bool TrySlip(IEntity entity)
{ {
if (ContainerHelpers.IsInContainer(Owner) if (!Slippery
|| ContainerHelpers.IsInContainer(Owner)
|| _slipped.Contains(entity.Uid) || _slipped.Contains(entity.Uid)
|| !entity.TryGetComponent(out SharedStunnableComponent stun) || !entity.TryGetComponent(out SharedStunnableComponent stun)
|| !entity.TryGetComponent(out ICollidableComponent otherBody) || !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 => ParalyzeTime, "paralyzeTime", 3f);
serializer.DataField(this, x => IntersectPercentage, "intersectPercentage", 0.3f); serializer.DataField(this, x => IntersectPercentage, "intersectPercentage", 0.3f);
serializer.DataField(this, x => RequiredSlipSpeed, "requiredSlipSpeed", 0f); serializer.DataField(this, x => RequiredSlipSpeed, "requiredSlipSpeed", 0f);
serializer.DataField(this, x => x.Slippery, "slippery", true);
} }
} }
} }

View File

@@ -207,10 +207,17 @@
parent: TrashBase parent: TrashBase
id: TrashBananaPeel id: TrashBananaPeel
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Consumable/Food/banana.rsi sprite: Objects/Consumable/Food/banana.rsi
state: peel state: peel
- type: Icon - type: Icon
sprite: Objects/Consumable/Food/banana.rsi sprite: Objects/Consumable/Food/banana.rsi
state: peel state: peel
- type: Slippery - type: Slippery
intersectPercentage: 0.2
- type: Collidable
shapes:
- !type:PhysShapeAabb
bounds: "-0.2,-0.2,0.2,0.2"
layer:
- MobImpassable

View File

@@ -85,6 +85,12 @@
map: ["enum.PDAVisualLayers.Flashlight"] map: ["enum.PDAVisualLayers.Flashlight"]
- type: Slippery - type: Slippery
paralyzeTime: 4 paralyzeTime: 4
- type: Collidable
shapes:
- !type:PhysShapeAabb
bounds: "-0.25,-0.25,0.25,0.25"
layer:
- MobImpassable
- type: entity - type: entity
name: Cargo PDA name: Cargo PDA

View File

@@ -102,17 +102,22 @@
parent: BaseItem parent: BaseItem
description: A cheap bar of soap. Doesn't smell. description: A cheap bar of soap. Doesn't smell.
components: components:
- type: Sprite - type: Sprite
sprite: Objects/Specific/Janitorial/soap.rsi sprite: Objects/Specific/Janitorial/soap.rsi
state: soap state: soap
- type: Icon - type: Icon
sprite: Objects/Specific/Janitorial/soap.rsi sprite: Objects/Specific/Janitorial/soap.rsi
state: soap state: soap
- type: Item - type: Item
sprite: Objects/Specific/Janitorial/soap.rsi sprite: Objects/Specific/Janitorial/soap.rsi
- type: Slippery - type: Slippery
paralyzeTime: 2.5 paralyzeTime: 2.5
- type: Collidable
shapes:
- !type:PhysShapeAabb
bounds: "-0.3,-0.4,0.3,0.4"
layer:
- MobImpassable
- type: entity - type: entity
name: soap name: soap

View File

@@ -15,10 +15,13 @@
- type: LoopingSound - type: LoopingSound
- type: InteractionOutline - type: InteractionOutline
- type: Clickable - type: Clickable
- type: Slippery
- type: Collidable - type: Collidable
shapes: shapes:
- !type:PhysShapeAabb - !type:PhysShapeAabb
bounds: "-0.5,-0.5,0.5,0.5" bounds: "-0.4,-0.4,0.4,0.4"
layer:
- MobImpassable
hard: false hard: false
- type: entity - type: entity