Skip to content

Commit

Permalink
Make status effect networking not use TryAddStatusEffect (#28766)
Browse files Browse the repository at this point in the history
* Make status effect networking not use `TryAddStatusEffect`

* a
  • Loading branch information
ElectroJr authored Sep 19, 2024
1 parent 550c423 commit bdd0561
Showing 1 changed file with 39 additions and 35 deletions.
74 changes: 39 additions & 35 deletions Content.Shared/StatusEffect/StatusEffectsSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public sealed class StatusEffectsSystem : EntitySystem
[Dependency] private readonly IComponentFactory _componentFactory = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly AlertsSystem _alertsSystem = default!;
private List<EntityUid> _toRemove = new();

public override void Initialize()
{
Expand All @@ -32,18 +33,28 @@ public override void Update(float frameTime)

var curTime = _gameTiming.CurTime;
var enumerator = EntityQueryEnumerator<ActiveStatusEffectsComponent, StatusEffectsComponent>();
_toRemove.Clear();

while (enumerator.MoveNext(out var uid, out _, out var status))
{
foreach (var state in status.ActiveEffects.ToArray())
if (status.ActiveEffects.Count == 0)
{
// This shouldn't happen, but just in case something sneaks through
_toRemove.Add(uid);
continue;
}

foreach (var state in status.ActiveEffects)
{
// if we're past the end point of the effect
if (curTime > state.Value.Cooldown.Item2)
{
TryRemoveStatusEffect(uid, state.Key, status);
}
}
}

foreach (var uid in _toRemove)
{
RemComp<ActiveStatusEffectsComponent>(uid);
}
}

private void OnGetState(EntityUid uid, StatusEffectsComponent component, ref ComponentGetState args)
Expand All @@ -62,29 +73,21 @@ private void OnHandleState(EntityUid uid, StatusEffectsComponent component, ref
component.AllowedEffects.AddRange(state.AllowedEffects);

// Remove non-existent effects.
foreach (var effect in component.ActiveEffects.Keys)
foreach (var key in component.ActiveEffects.Keys)
{
if (!state.ActiveEffects.ContainsKey(effect))
{
TryRemoveStatusEffect(uid, effect, component, remComp: false);
}
if (!state.ActiveEffects.ContainsKey(key))
component.ActiveEffects.Remove(key);
}

foreach (var (key, effect) in state.ActiveEffects)
{
// don't bother with anything if we already have it
if (component.ActiveEffects.ContainsKey(key))
{
component.ActiveEffects[key] = new(effect);
continue;
}

var time = effect.Cooldown.Item2 - effect.Cooldown.Item1;

TryAddStatusEffect(uid, key, time, true, component, effect.Cooldown.Item1);
component.ActiveEffects[key].RelevantComponent = effect.RelevantComponent;
// state handling should not add networked components, that is handled separately by the client game state manager.
component.ActiveEffects[key] = new(effect);
}

if (component.ActiveEffects.Count == 0)
RemComp<ActiveStatusEffectsComponent>(uid);
else
EnsureComp<ActiveStatusEffectsComponent>(uid);
}

private void OnRejuvenate(EntityUid uid, StatusEffectsComponent component, RejuvenateEvent args)
Expand All @@ -109,18 +112,16 @@ public bool TryAddStatusEffect<T>(EntityUid uid, string key, TimeSpan time, bool
if (!Resolve(uid, ref status, false))
return false;

if (TryAddStatusEffect(uid, key, time, refresh, status))
{
// If they already have the comp, we just won't bother updating anything.
if (!EntityManager.HasComponent<T>(uid))
{
var comp = EntityManager.AddComponent<T>(uid);
status.ActiveEffects[key].RelevantComponent = _componentFactory.GetComponentName(comp.GetType());
}
if (!TryAddStatusEffect(uid, key, time, refresh, status))
return false;

if (HasComp<T>(uid))
return true;
}

return false;
EntityManager.AddComponent<T>(uid);
status.ActiveEffects[key].RelevantComponent = _componentFactory.GetComponentName<T>();
return true;

}

public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool refresh, string component,
Expand Down Expand Up @@ -162,8 +163,12 @@ public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool re
/// If the effect already exists, it will simply replace the cooldown with the new one given.
/// If you want special 'effect merging' behavior, do it your own damn self!
/// </remarks>
public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool refresh,
StatusEffectsComponent? status = null, TimeSpan? startTime = null)
public bool TryAddStatusEffect(EntityUid uid,
string key,
TimeSpan time,
bool refresh,
StatusEffectsComponent? status = null,
TimeSpan? startTime = null)
{
if (!Resolve(uid, ref status, false))
return false;
Expand Down Expand Up @@ -334,8 +339,7 @@ public bool HasStatusEffect(EntityUid uid, string key,
/// <param name="uid">The entity to check on.</param>
/// <param name="key">The status effect ID to check for</param>
/// <param name="status">The status effect component, should you already have it.</param>
public bool CanApplyEffect(EntityUid uid, string key,
StatusEffectsComponent? status = null)
public bool CanApplyEffect(EntityUid uid, string key, StatusEffectsComponent? status = null)
{
// don't log since stuff calling this prolly doesn't care if we don't actually have it
if (!Resolve(uid, ref status, false))
Expand Down

0 comments on commit bdd0561

Please sign in to comment.