using Content.Server.Destructible.Thresholds.Behaviors; using Content.Server.Destructible.Thresholds.Triggers; using Content.Shared.Damage; namespace Content.Server.Destructible.Thresholds { [DataDefinition] public sealed partial class DamageThreshold { [DataField("behaviors")] private List _behaviors = new(); /// /// Whether or not this threshold was triggered in the previous call to /// . /// [ViewVariables] public bool OldTriggered { get; private set; } /// /// Whether or not this threshold has already been triggered. /// [DataField("triggered")] public bool Triggered { get; private set; } /// /// Whether or not this threshold only triggers once. /// If false, it will trigger again once the entity is healed /// and then damaged to reach this threshold once again. /// It will not repeatedly trigger as damage rises beyond that. /// [DataField("triggersOnce")] public bool TriggersOnce { get; set; } /// /// The trigger that decides if this threshold has been reached. /// [DataField("trigger")] public IThresholdTrigger? Trigger { get; set; } /// /// Behaviors to activate once this threshold is triggered. /// [ViewVariables] public IReadOnlyList Behaviors => _behaviors; public bool Reached(DamageableComponent damageable, DestructibleSystem system) { if (Trigger == null) { return false; } if (Triggered && TriggersOnce) { return false; } if (OldTriggered) { OldTriggered = Trigger.Reached(damageable, system); return false; } if (!Trigger.Reached(damageable, system)) { return false; } OldTriggered = true; return true; } /// /// Triggers this threshold. /// /// The entity that owns this threshold. /// /// An instance of to get dependency and /// system references from, if relevant. /// /// /// public void Execute(EntityUid owner, DestructibleSystem system, IEntityManager entityManager, EntityUid? cause) { Triggered = true; foreach (var behavior in Behaviors) { // The owner has been deleted. We stop execution of behaviors here. if (!entityManager.EntityExists(owner)) return; behavior.Execute(owner, system, cause); } } } }