using System.Collections.Generic; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.EntitySystems; using Robust.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Random; using Robust.Shared.IoC; using Robust.Shared.Random; namespace Content.Server.GameObjects.Components.Damage { // TODO: Repair needs to set CurrentDamageState to DamageState.Alive, but it doesn't exist... should be easy enough if it's just an interface you can slap on BreakableComponent /// /// When attached to an , allows it to take damage and sets it to a "broken state" after taking /// enough damage. /// [RegisterComponent] [ComponentReference(typeof(IDamageableComponent))] public class BreakableComponent : RuinableComponent, IExAct { [Dependency] private readonly IEntitySystemManager _entitySystemManager = default!; [Dependency] private readonly IRobustRandom _random = default!; public override string Name => "Breakable"; private ActSystem _actSystem; public override List SupportedDamageStates => new List {DamageState.Alive, DamageState.Dead}; void IExAct.OnExplosion(ExplosionEventArgs eventArgs) { switch (eventArgs.Severity) { case ExplosionSeverity.Destruction: case ExplosionSeverity.Heavy: PerformDestruction(); break; case ExplosionSeverity.Light: if (_random.Prob(0.5f)) { PerformDestruction(); } break; } } public override void Initialize() { base.Initialize(); _actSystem = _entitySystemManager.GetEntitySystem(); } // Might want to move this down and have a more standardized method of revival public void FixAllDamage() { Heal(); CurrentState = DamageState.Alive; } protected override void DestructionBehavior() { _actSystem.HandleBreakage(Owner); if (!Owner.Deleted && DestroySound != string.Empty) { var pos = Owner.Transform.Coordinates; EntitySystem.Get().PlayAtCoords(DestroySound, pos); } } } }