if (!TryGetStatusEffect(target, effectProto, out statusEffect))
return TryAddStatusEffect(target, effectProto, out statusEffect, duration);
- SetStatusEffectTime(statusEffect.Value, duration);
+ SetStatusEffectEndTime(statusEffect.Value, duration);
return true;
}
var meta = MetaData(effect);
if (meta.EntityPrototype is not null && meta.EntityPrototype == effectProto)
{
- SetStatusEffectTime(effect, time);
+ SetStatusEffectEndTime(effect, time);
return true;
}
}
PredictedQueueDel(ent.Owner);
}
- private void SetStatusEffectTime(EntityUid effect, TimeSpan? duration)
- {
- if (!_effectQuery.TryComp(effect, out var effectComp))
- return;
-
- if (duration is null)
- {
- if(effectComp.EndEffectTime is null)
- return;
-
- effectComp.EndEffectTime = null;
- }
- else
- effectComp.EndEffectTime = _timing.CurTime + duration;
-
- Dirty(effect, effectComp);
- }
-
- private void UpdateStatusEffectTime(EntityUid effect, TimeSpan? duration)
- {
- if (!_effectQuery.TryComp(effect, out var effectComp))
- return;
-
- // It's already infinitely long
- if (effectComp.EndEffectTime is null)
- return;
-
- if (duration is null)
- effectComp.EndEffectTime = null;
- else
- {
- var newEndTime = _timing.CurTime + duration;
- if (effectComp.EndEffectTime >= newEndTime)
- return;
-
- effectComp.EndEffectTime = newEndTime;
- }
-
- Dirty(effect, effectComp);
- }
-
public bool CanAddStatusEffect(EntityUid uid, EntProtoId effectProto)
{
if (!_proto.TryIndex(effectProto, out var effectProtoData))
return true;
}
- private void AddStatusEffectTime(EntityUid effect, TimeSpan delta)
+ private void UpdateStatusEffectTime(Entity<StatusEffectComponent?> effect, TimeSpan? duration)
{
- if (!_effectQuery.TryComp(effect, out var effectComp))
+ if (!_effectQuery.Resolve(effect, ref effect.Comp))
+ return;
+
+ // It's already infinitely long
+ if (effect.Comp.EndEffectTime is null)
+ return;
+
+ TimeSpan? newEndTime = null;
+
+ if (duration is not null)
+ {
+ // Don't update time to a smaller timespan...
+ newEndTime = _timing.CurTime + duration;
+ if (effect.Comp.EndEffectTime >= newEndTime)
+ return;
+ }
+
+ SetStatusEffectEndTime(effect, newEndTime);
+ }
+
+ private void AddStatusEffectTime(Entity<StatusEffectComponent?> effect, TimeSpan delta)
+ {
+ if (!_effectQuery.Resolve(effect, ref effect.Comp))
+ return;
+
+ // It's already infinitely long can't add or subtract from infinity...
+ if (effect.Comp.EndEffectTime is null)
return;
- // If we don't have an end time set, we want to just make the status effect end in delta time from now.
- SetStatusEffectEndTime((effect, effectComp), (effectComp.EndEffectTime ?? _timing.CurTime) + delta);
+ // Add to the current end effect time, if we're here we should have one set already, and if it's null it's probably infinite.
+ SetStatusEffectEndTime((effect, effect.Comp), effect.Comp.EndEffectTime.Value + delta);
}
private void SetStatusEffectEndTime(Entity<StatusEffectComponent?> ent, TimeSpan? endTime)