return TryUpdateMovementStatus(uid, status, speedModifier, speedModifier);
}
+ /// <inheritdoc cref="TryAddFrictionModDuration(EntityUid,TimeSpan,float,float)"/>
+ public bool TryAddFrictionModDuration(
+ EntityUid uid,
+ TimeSpan duration,
+ float friction
+ )
+ {
+ return TryAddFrictionModDuration(uid, duration, friction, friction);
+ }
+
/// <summary>
/// Apply friction modifier with provided duration,
/// or incrementing duration of existing.
float acceleration
)
{
- return _status.TryAddStatusEffectDuration(uid, StatusEffectFriction, out var status, duration)
- && TrySetFrictionStatus(status.Value, friction, acceleration, uid);
+ return _status.TryAddStatusEffectDuration(uid, StatusEffectFriction, out var status, duration)
+ && TrySetFrictionStatus(status.Value, friction, acceleration, uid);
+ }
+
+ /// <inheritdoc cref="TryUpdateFrictionModDuration(EntityUid,TimeSpan,float,float)"/>
+ public bool TryUpdateFrictionModDuration(
+ EntityUid uid,
+ TimeSpan duration,
+ float friction
+ )
+ {
+ return TryUpdateFrictionModDuration(uid,duration, friction, friction);
}
/// <summary>
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] private readonly SpeedModifierContactsSystem _speedModifier = default!;
+ private EntityQuery<KnockedDownComponent> _knockedDownQuery;
+ private EntityQuery<PhysicsComponent> _physicsQuery;
+ private EntityQuery<SlidingComponent> _slidingQuery;
+
public override void Initialize()
{
base.Initialize();
+ _knockedDownQuery = GetEntityQuery<KnockedDownComponent>();
+ _physicsQuery = GetEntityQuery<PhysicsComponent>();
+ _slidingQuery = GetEntityQuery<SlidingComponent>();
+
SubscribeLocalEvent<SlipperyComponent, StepTriggerAttemptEvent>(HandleAttemptCollide);
SubscribeLocalEvent<SlipperyComponent, StepTriggeredOffEvent>(HandleStepTrigger);
SubscribeLocalEvent<NoSlipComponent, SlipAttemptEvent>(OnNoSlipAttempt);
public void TrySlip(EntityUid uid, SlipperyComponent component, EntityUid other, bool requiresContact = true)
{
- if (HasComp<KnockedDownComponent>(other) && !component.SlipData.SuperSlippery)
+ var knockedDown = _knockedDownQuery.HasComp(other);
+ if (knockedDown && !component.SlipData.SuperSlippery)
return;
var attemptEv = new SlipAttemptEvent(uid);
var ev = new SlipEvent(other);
RaiseLocalEvent(uid, ref ev);
- if (TryComp(other, out PhysicsComponent? physics) && !HasComp<SlidingComponent>(other))
+ if (_physicsQuery.TryComp(other, out var physics) && !_slidingQuery.HasComp(other))
{
_physics.SetLinearVelocity(other, physics.LinearVelocity * component.SlipData.LaunchForwardsMultiplier, body: physics);
}
// Preventing from playing the slip sound and stunning when you are already knocked down.
- if (!HasComp<KnockedDownComponent>(other))
+ if (!knockedDown)
{
+ // Status effects should handle a TimeSpan of 0 properly...
_stun.TryUpdateStunDuration(other, component.SlipData.StunTime);
- _stamina.TakeStaminaDamage(other, component.StaminaDamage); // Note that this can stamCrit
- _movementMod.TryUpdateFrictionModDuration(
- other,
- component.FrictionStatusTime,
- component.SlipData.SlipFriction,
- component.SlipData.SlipFriction
- );
+
+ // Don't make a new status effect entity if the entity wouldn't do anything
+ if (!MathHelper.CloseTo(component.SlipData.SlipFriction, 1f))
+ {
+ _movementMod.TryUpdateFrictionModDuration(
+ other,
+ component.FrictionStatusTime,
+ component.SlipData.SlipFriction
+ );
+ }
+
+ _stamina.TakeStaminaDamage(other, component.StaminaDamage); // Note that this can StamCrit
+
_audio.PlayPredicted(component.SlipSound, other, other);
}
TimeSpan duration
)
{
+ if (duration == TimeSpan.Zero)
+ {
+ statusEffect = null;
+ return false;
+ }
+
+ // We check to make sure time is greater than zero here because sometimes you want to use TryAddStatusEffect to remove duration instead...
if (!TryGetStatusEffect(target, effectProto, out statusEffect))
return TryAddStatusEffect(target, effectProto, out statusEffect, duration);
TimeSpan? duration = null
)
{
+ if (duration <= TimeSpan.Zero)
+ {
+ statusEffect = null;
+ return false;
+ }
+
if (!TryGetStatusEffect(target, effectProto, out statusEffect))
return TryAddStatusEffect(target, effectProto, out statusEffect, duration);
TimeSpan? duration = null
)
{
+ if (duration <= TimeSpan.Zero)
+ {
+ statusEffect = null;
+ return false;
+ }
+
if (!TryGetStatusEffect(target, effectProto, out statusEffect))
return TryAddStatusEffect(target, effectProto, out statusEffect, duration);