Fix SuperSlippery And StepTriggers persisting when UpdateSlip is called (#34525)
* Fix superSlippery and stepTrigger values persist - made values in SpillTileReaction's public so we can query the prototype - made the default values for slippery component and StepTriggerComponent based on default constants for easier resetting - added a calculation and check in UpdateSlips to check if a super slip is present as well as Update relevant steptrigger and slip values based on the contents of the solution * The worlds biggest change --------- Co-authored-by: Myra <vascreeper@yahoo.com>
This commit is contained in:
@@ -17,14 +17,14 @@ namespace Content.Server.Chemistry.TileReactions
|
|||||||
[DataDefinition]
|
[DataDefinition]
|
||||||
public sealed partial class SpillTileReaction : ITileReaction
|
public sealed partial class SpillTileReaction : ITileReaction
|
||||||
{
|
{
|
||||||
[DataField("launchForwardsMultiplier")] private float _launchForwardsMultiplier = 1;
|
[DataField("launchForwardsMultiplier")] public float LaunchForwardsMultiplier = 1;
|
||||||
[DataField("requiredSlipSpeed")] private float _requiredSlipSpeed = 6;
|
[DataField("requiredSlipSpeed")] public float RequiredSlipSpeed = 6;
|
||||||
[DataField("paralyzeTime")] private float _paralyzeTime = 1;
|
[DataField("paralyzeTime")] public float ParalyzeTime = 1;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <see cref="SlipperyComponent.SuperSlippery"/>
|
/// <see cref="SlipperyComponent.SuperSlippery"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("superSlippery")] private bool _superSlippery;
|
[DataField("superSlippery")] public bool SuperSlippery;
|
||||||
|
|
||||||
public FixedPoint2 TileReact(TileRef tile,
|
public FixedPoint2 TileReact(TileRef tile,
|
||||||
ReagentPrototype reagent,
|
ReagentPrototype reagent,
|
||||||
@@ -39,13 +39,13 @@ namespace Content.Server.Chemistry.TileReactions
|
|||||||
.TrySpillAt(tile, new Solution(reagent.ID, reactVolume, data), out var puddleUid, false, false))
|
.TrySpillAt(tile, new Solution(reagent.ID, reactVolume, data), out var puddleUid, false, false))
|
||||||
{
|
{
|
||||||
var slippery = entityManager.EnsureComponent<SlipperyComponent>(puddleUid);
|
var slippery = entityManager.EnsureComponent<SlipperyComponent>(puddleUid);
|
||||||
slippery.LaunchForwardsMultiplier = _launchForwardsMultiplier;
|
slippery.LaunchForwardsMultiplier = LaunchForwardsMultiplier;
|
||||||
slippery.ParalyzeTime = _paralyzeTime;
|
slippery.ParalyzeTime = ParalyzeTime;
|
||||||
slippery.SuperSlippery = _superSlippery;
|
slippery.SuperSlippery = SuperSlippery;
|
||||||
entityManager.Dirty(puddleUid, slippery);
|
entityManager.Dirty(puddleUid, slippery);
|
||||||
|
|
||||||
var step = entityManager.EnsureComponent<StepTriggerComponent>(puddleUid);
|
var step = entityManager.EnsureComponent<StepTriggerComponent>(puddleUid);
|
||||||
entityManager.EntitySysManager.GetEntitySystem<StepTriggerSystem>().SetRequiredTriggerSpeed(puddleUid, _requiredSlipSpeed, step);
|
entityManager.EntitySysManager.GetEntitySystem<StepTriggerSystem>().SetRequiredTriggerSpeed(puddleUid, RequiredSlipSpeed, step);
|
||||||
|
|
||||||
var slow = entityManager.EnsureComponent<SpeedModifierContactsComponent>(puddleUid);
|
var slow = entityManager.EnsureComponent<SpeedModifierContactsComponent>(puddleUid);
|
||||||
var speedModifier = 1 - reagent.Viscosity;
|
var speedModifier = 1 - reagent.Viscosity;
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
|
using System.Linq;
|
||||||
using Content.Server.Administration.Logs;
|
using Content.Server.Administration.Logs;
|
||||||
|
using Content.Server.Chemistry.TileReactions;
|
||||||
using Content.Server.DoAfter;
|
using Content.Server.DoAfter;
|
||||||
using Content.Server.Fluids.Components;
|
using Content.Server.Fluids.Components;
|
||||||
using Content.Server.Spreader;
|
using Content.Server.Spreader;
|
||||||
@@ -387,23 +389,36 @@ public sealed partial class PuddleSystem : SharedPuddleSystem
|
|||||||
private void UpdateSlip(EntityUid entityUid, PuddleComponent component, Solution solution)
|
private void UpdateSlip(EntityUid entityUid, PuddleComponent component, Solution solution)
|
||||||
{
|
{
|
||||||
var isSlippery = false;
|
var isSlippery = false;
|
||||||
|
var isSuperSlippery = false;
|
||||||
// The base sprite is currently at 0.3 so we require at least 2nd tier to be slippery or else it's too hard to see.
|
// The base sprite is currently at 0.3 so we require at least 2nd tier to be slippery or else it's too hard to see.
|
||||||
var amountRequired = FixedPoint2.New(component.OverflowVolume.Float() * LowThreshold);
|
var amountRequired = FixedPoint2.New(component.OverflowVolume.Float() * LowThreshold);
|
||||||
var slipperyAmount = FixedPoint2.Zero;
|
var slipperyAmount = FixedPoint2.Zero;
|
||||||
|
|
||||||
|
// Utilize the defaults from their relevant systems... this sucks, and is a bandaid
|
||||||
|
var launchForwardsMultiplier = SlipperyComponent.DefaultLaunchForwardsMultiplier;
|
||||||
|
var paralyzeTime = SlipperyComponent.DefaultParalyzeTime;
|
||||||
|
var requiredSlipSpeed = StepTriggerComponent.DefaultRequiredTriggeredSpeed;
|
||||||
|
|
||||||
foreach (var (reagent, quantity) in solution.Contents)
|
foreach (var (reagent, quantity) in solution.Contents)
|
||||||
{
|
{
|
||||||
var reagentProto = _prototypeManager.Index<ReagentPrototype>(reagent.Prototype);
|
var reagentProto = _prototypeManager.Index<ReagentPrototype>(reagent.Prototype);
|
||||||
|
|
||||||
if (reagentProto.Slippery)
|
if (!reagentProto.Slippery)
|
||||||
{
|
continue;
|
||||||
slipperyAmount += quantity;
|
slipperyAmount += quantity;
|
||||||
|
|
||||||
if (slipperyAmount > amountRequired)
|
if (slipperyAmount <= amountRequired)
|
||||||
{
|
continue;
|
||||||
isSlippery = true;
|
isSlippery = true;
|
||||||
break;
|
|
||||||
}
|
foreach (var tileReaction in reagentProto.TileReactions)
|
||||||
|
{
|
||||||
|
if (tileReaction is not SpillTileReaction spillTileReaction)
|
||||||
|
continue;
|
||||||
|
isSuperSlippery = spillTileReaction.SuperSlippery;
|
||||||
|
launchForwardsMultiplier = launchForwardsMultiplier < spillTileReaction.LaunchForwardsMultiplier ? spillTileReaction.LaunchForwardsMultiplier : launchForwardsMultiplier;
|
||||||
|
requiredSlipSpeed = requiredSlipSpeed > spillTileReaction.RequiredSlipSpeed ? spillTileReaction.RequiredSlipSpeed : requiredSlipSpeed;
|
||||||
|
paralyzeTime = paralyzeTime < spillTileReaction.ParalyzeTime ? spillTileReaction.ParalyzeTime : paralyzeTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -413,6 +428,14 @@ public sealed partial class PuddleSystem : SharedPuddleSystem
|
|||||||
_stepTrigger.SetActive(entityUid, true, comp);
|
_stepTrigger.SetActive(entityUid, true, comp);
|
||||||
var friction = EnsureComp<TileFrictionModifierComponent>(entityUid);
|
var friction = EnsureComp<TileFrictionModifierComponent>(entityUid);
|
||||||
_tile.SetModifier(entityUid, TileFrictionController.DefaultFriction * 0.5f, friction);
|
_tile.SetModifier(entityUid, TileFrictionController.DefaultFriction * 0.5f, friction);
|
||||||
|
|
||||||
|
if (!TryComp<SlipperyComponent>(entityUid, out var slipperyComponent))
|
||||||
|
return;
|
||||||
|
slipperyComponent.SuperSlippery = isSuperSlippery;
|
||||||
|
_stepTrigger.SetRequiredTriggerSpeed(entityUid, requiredSlipSpeed);
|
||||||
|
slipperyComponent.LaunchForwardsMultiplier = launchForwardsMultiplier;
|
||||||
|
slipperyComponent.ParalyzeTime = paralyzeTime;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (TryComp<StepTriggerComponent>(entityUid, out var comp))
|
else if (TryComp<StepTriggerComponent>(entityUid, out var comp))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ namespace Content.Shared.Slippery
|
|||||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||||
public sealed partial class SlipperyComponent : Component
|
public sealed partial class SlipperyComponent : Component
|
||||||
{
|
{
|
||||||
|
public const float DefaultParalyzeTime = 1.5f;
|
||||||
|
public const float DefaultLaunchForwardsMultiplier = 1.5f;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Path to the sound to be played when a mob slips.
|
/// Path to the sound to be played when a mob slips.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -25,14 +27,14 @@ namespace Content.Shared.Slippery
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField, AutoNetworkedField]
|
[DataField, AutoNetworkedField]
|
||||||
[Access(Other = AccessPermissions.ReadWrite)]
|
[Access(Other = AccessPermissions.ReadWrite)]
|
||||||
public float ParalyzeTime = 1.5f;
|
public float ParalyzeTime = DefaultParalyzeTime;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The entity's speed will be multiplied by this to slip it forwards.
|
/// The entity's speed will be multiplied by this to slip it forwards.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField, AutoNetworkedField]
|
[DataField, AutoNetworkedField]
|
||||||
[Access(Other = AccessPermissions.ReadWrite)]
|
[Access(Other = AccessPermissions.ReadWrite)]
|
||||||
public float LaunchForwardsMultiplier = 1.5f;
|
public float LaunchForwardsMultiplier = DefaultLaunchForwardsMultiplier;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If this is true, any slipping entity loses its friction until
|
/// If this is true, any slipping entity loses its friction until
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ namespace Content.Shared.StepTrigger.Components;
|
|||||||
[Access(typeof(StepTriggerSystem))]
|
[Access(typeof(StepTriggerSystem))]
|
||||||
public sealed partial class StepTriggerComponent : Component
|
public sealed partial class StepTriggerComponent : Component
|
||||||
{
|
{
|
||||||
|
public const float DefaultRequiredTriggeredSpeed = 3.5f;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// List of entities that are currently colliding with the entity.
|
/// List of entities that are currently colliding with the entity.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -37,7 +38,7 @@ public sealed partial class StepTriggerComponent : Component
|
|||||||
/// Entities will only be triggered if their speed exceeds this limit.
|
/// Entities will only be triggered if their speed exceeds this limit.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField, AutoNetworkedField]
|
[DataField, AutoNetworkedField]
|
||||||
public float RequiredTriggeredSpeed = 3.5f;
|
public float RequiredTriggeredSpeed = DefaultRequiredTriggeredSpeed;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If any entities occupy the blacklist on the same tile then steptrigger won't work.
|
/// If any entities occupy the blacklist on the same tile then steptrigger won't work.
|
||||||
|
|||||||
Reference in New Issue
Block a user