From 96e5e34084228a3614945290cdfd18e1bc40ddb8 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Wed, 10 Feb 2021 02:36:05 +0100 Subject: [PATCH] Make DoAfters use DamageChangedMessage instead of an event (#3115) --- .../Components/DoAfterComponent.cs | 35 +++++++++++++++++-- .../EntitySystems/DoAfter/DoAfter.cs | 12 ++----- .../EntitySystems/DoAfter/DoAfterSystem.cs | 13 ------- .../Components/Damage/DamageChangedMessage.cs | 16 +++++++++ .../Components/Damage/DamageableComponent.cs | 3 -- .../Components/Damage/IDamageableComponent.cs | 8 ----- 6 files changed, 52 insertions(+), 35 deletions(-) diff --git a/Content.Server/GameObjects/Components/DoAfterComponent.cs b/Content.Server/GameObjects/Components/DoAfterComponent.cs index da6f45f539..550bce58e9 100644 --- a/Content.Server/GameObjects/Components/DoAfterComponent.cs +++ b/Content.Server/GameObjects/Components/DoAfterComponent.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using Content.Server.GameObjects.EntitySystems.DoAfter; using Content.Shared.GameObjects.Components; +using Content.Shared.GameObjects.Components.Damage; using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; namespace Content.Server.GameObjects.Components { @@ -19,7 +21,7 @@ namespace Content.Server.GameObjects.Components public override ComponentState GetComponentState() { var toAdd = new List(); - + foreach (var doAfter in DoAfters) { // THE ALMIGHTY PYRAMID @@ -33,13 +35,42 @@ namespace Content.Server.GameObjects.Components doAfter.EventArgs.BreakOnTargetMove, doAfter.EventArgs.MovementThreshold, doAfter.EventArgs.Target?.Uid ?? EntityUid.Invalid); - + toAdd.Add(clientDoAfter); } return new DoAfterComponentState(toAdd); } + public override void HandleMessage(ComponentMessage message, IComponent? component) + { + base.HandleMessage(message, component); + + switch (message) + { + case DamageChangedMessage msg: + if (DoAfters.Count == 0) + { + return; + } + + if (!msg.TookDamage) + { + return; + } + + foreach (var doAfter in _doAfters.Keys) + { + if (doAfter.EventArgs.BreakOnDamage) + { + doAfter.TookDamage = true; + } + } + + break; + } + } + public void Add(DoAfter doAfter) { _doAfters.Add(doAfter, _runningIndex); diff --git a/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs b/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs index f1d5bf38e1..5d496ee038 100644 --- a/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs +++ b/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs @@ -4,7 +4,6 @@ using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Mobs; -using Content.Shared.GameObjects.Components.Damage; using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Map; @@ -15,7 +14,7 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter { public Task AsTask { get; } - private TaskCompletionSource Tcs { get;} + private TaskCompletionSource Tcs { get; } public DoAfterEventArgs EventArgs; @@ -27,7 +26,7 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter public EntityCoordinates TargetGrid { get; } - private bool _tookDamage; + public bool TookDamage { get; set; } public DoAfterStatus Status => AsTask.IsCompletedSuccessfully ? AsTask.Result : DoAfterStatus.Running; @@ -63,11 +62,6 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter AsTask = Tcs.Task; } - public void HandleDamage(DamageChangedEventArgs args) - { - _tookDamage = true; - } - public void Run(float frameTime) { switch (Status) @@ -130,7 +124,7 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter return true; } - if (EventArgs.BreakOnDamage && _tookDamage) + if (EventArgs.BreakOnDamage && TookDamage) { return true; } diff --git a/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs b/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs index 226d942b00..3dc45ffb13 100644 --- a/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Content.Server.GameObjects.Components; -using Content.Shared.GameObjects.Components.Damage; using JetBrains.Annotations; using Robust.Shared.GameObjects.Systems; @@ -68,21 +67,9 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter // Caller's gonna be responsible for this I guess var doAfterComponent = eventArgs.User.GetComponent(); doAfterComponent.Add(doAfter); - IDamageableComponent? damageableComponent = null; - - // TODO: If the component's deleted this may not get unsubscribed? - if (eventArgs.BreakOnDamage && eventArgs.User.TryGetComponent(out damageableComponent)) - { - damageableComponent.HealthChangedEvent += doAfter.HandleDamage; - } await doAfter.AsTask; - if (damageableComponent != null) - { - damageableComponent.HealthChangedEvent -= doAfter.HandleDamage; - } - return doAfter.Status; } } diff --git a/Content.Shared/GameObjects/Components/Damage/DamageChangedMessage.cs b/Content.Shared/GameObjects/Components/Damage/DamageChangedMessage.cs index 505ece598a..eda969dca3 100644 --- a/Content.Shared/GameObjects/Components/Damage/DamageChangedMessage.cs +++ b/Content.Shared/GameObjects/Components/Damage/DamageChangedMessage.cs @@ -31,5 +31,21 @@ namespace Content.Shared.GameObjects.Components.Damage /// List containing data on each that was changed. /// public IReadOnlyList Data { get; } + + public bool TookDamage + { + get + { + foreach (var datum in Data) + { + if (datum.Delta > 0) + { + return true; + } + } + + return false; + } + } } } diff --git a/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs b/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs index 4e979c09f0..1c202f606b 100644 --- a/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs +++ b/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs @@ -39,8 +39,6 @@ namespace Content.Shared.GameObjects.Components.Damage private readonly HashSet _supportedClasses = new(); private DamageFlag _flags; - public event Action? HealthChangedEvent; - // TODO DAMAGE Use as default values, specify overrides in a separate property through yaml for better (de)serialization [ViewVariables] public string DamageContainerId { get; set; } = default!; @@ -460,7 +458,6 @@ namespace Content.Shared.GameObjects.Components.Damage protected virtual void OnHealthChanged(DamageChangedEventArgs e) { Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, e); - HealthChangedEvent?.Invoke(e); var message = new DamageChangedMessage(this, e.Data); SendMessage(message); diff --git a/Content.Shared/GameObjects/Components/Damage/IDamageableComponent.cs b/Content.Shared/GameObjects/Components/Damage/IDamageableComponent.cs index 21e4cff9e5..18f798542d 100644 --- a/Content.Shared/GameObjects/Components/Damage/IDamageableComponent.cs +++ b/Content.Shared/GameObjects/Components/Damage/IDamageableComponent.cs @@ -9,14 +9,6 @@ namespace Content.Shared.GameObjects.Components.Damage { public interface IDamageableComponent : IComponent, IExAct { - /// - /// Called when the entity's values change. - /// Of note is that a "deal 0 damage" call will still trigger this event - /// (including both damage negated by resistance or simply inputting 0 as - /// the amount of damage to deal). - /// - event Action HealthChangedEvent; - /// /// Sum of all damages taken. ///