#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; 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] private List _thresholds = new(); public IReadOnlyList Thresholds => _thresholds; public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); serializer.DataField(ref _thresholds, "thresholds", new List()); } 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; } } } } }