#nullable enable using System.Collections.Generic; using Content.Server.GameObjects.Components.Destructible.Thresholds; using Content.Server.GameObjects.EntitySystems; using Content.Shared.GameObjects.Components.Damage; using Robust.Shared.GameObjects; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Destructible { /// /// When attached to an , allows it to take damage /// and triggers thresholds when reached. /// [RegisterComponent] public class DestructibleComponent : Component { private DestructibleSystem _destructibleSystem = default!; public override string Name => "Destructible"; [ViewVariables] [DataField("thresholds")] private List _thresholds = new(); public IReadOnlyList Thresholds => _thresholds; public override void Initialize() { base.Initialize(); _destructibleSystem = EntitySystem.Get(); } public override void HandleMessage(ComponentMessage message, IComponent? component) { base.HandleMessage(message, component); switch (message) { case DamageChangedMessage msg: { if (msg.Damageable.Owner != Owner) { break; } foreach (var threshold in _thresholds) { if (threshold.Reached(msg.Damageable, _destructibleSystem)) { var thresholdMessage = new DestructibleThresholdReachedMessage(this, threshold); SendMessage(thresholdMessage); threshold.Execute(Owner, _destructibleSystem); } } break; } } } } }