using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon; using Content.Server.GameObjects.EntitySystems; using Content.Server.Interfaces.GameObjects.Components.Interaction; using Robust.Server.GameObjects.EntitySystems; using Robust.Shared.Containers; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Serialization; namespace Content.Server.GameObjects.Components.Explosion { /// /// When triggered will flash in an area around the object and destroy itself /// [RegisterComponent] public class FlashExplosiveComponent : Component, ITimerTrigger, IDestroyAct { public override string Name => "FlashExplosive"; private float _range; private float _duration; private string _sound; private bool _deleteOnFlash; public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); serializer.DataField(ref _range, "range", 7.0f); serializer.DataField(ref _duration, "duration", 8.0f); serializer.DataField(ref _sound, "sound", "/Audio/Effects/flash_bang.ogg"); serializer.DataField(ref _deleteOnFlash, "deleteOnFlash", true); } public bool Explode() { // If we're in a locker or whatever then can't flash anything ContainerHelpers.TryGetContainer(Owner, out var container); if (container == null || !container.Owner.HasComponent()) { FlashableComponent.FlashAreaHelper(Owner, _range, _duration); } if (_sound != null) { EntitySystem.Get().PlayAtCoords(_sound, Owner.Transform.GridPosition); } if (_deleteOnFlash && !Owner.Deleted) { Owner.Delete(); } return true; } bool ITimerTrigger.Trigger(TimerTriggerEventArgs eventArgs) { return Explode(); } void IDestroyAct.OnDestroy(DestructionEventArgs eventArgs) { Explode(); } } }