diff --git a/Content.Client/GameObjects/Components/Weapons/ClientFlashableComponent.cs b/Content.Client/GameObjects/Components/Weapons/FlashableComponent.cs similarity index 96% rename from Content.Client/GameObjects/Components/Weapons/ClientFlashableComponent.cs rename to Content.Client/GameObjects/Components/Weapons/FlashableComponent.cs index b521ff0371..d7c5199396 100644 --- a/Content.Client/GameObjects/Components/Weapons/ClientFlashableComponent.cs +++ b/Content.Client/GameObjects/Components/Weapons/FlashableComponent.cs @@ -16,7 +16,7 @@ using Timer = Robust.Shared.Timers.Timer; namespace Content.Client.GameObjects.Components.Weapons { [RegisterComponent] - public sealed class ClientFlashableComponent : SharedFlashableComponent + public sealed class FlashableComponent : SharedFlashableComponent { private CancellationTokenSource _cancelToken; private TimeSpan _startTime; @@ -31,7 +31,7 @@ namespace Content.Client.GameObjects.Components.Weapons } var playerManager = IoCManager.Resolve(); - if (playerManager.LocalPlayer.ControlledEntity != Owner) + if (playerManager?.LocalPlayer != null && playerManager.LocalPlayer.ControlledEntity != Owner) { return; } diff --git a/Content.Server/GameObjects/Components/Explosion/FlashExplosiveComponent.cs b/Content.Server/GameObjects/Components/Explosion/FlashExplosiveComponent.cs index ff8a0feaef..554a722311 100644 --- a/Content.Server/GameObjects/Components/Explosion/FlashExplosiveComponent.cs +++ b/Content.Server/GameObjects/Components/Explosion/FlashExplosiveComponent.cs @@ -20,7 +20,7 @@ namespace Content.Server.GameObjects.Components.Explosion public override string Name => "FlashExplosive"; private float _range; - private double _duration; + private float _duration; private string _sound; private bool _deleteOnFlash; @@ -29,7 +29,7 @@ namespace Content.Server.GameObjects.Components.Explosion base.ExposeData(serializer); serializer.DataField(ref _range, "range", 7.0f); - serializer.DataField(ref _duration, "duration", 8.0); + serializer.DataField(ref _duration, "duration", 8.0f); serializer.DataField(ref _sound, "sound", "/Audio/Effects/flash_bang.ogg"); serializer.DataField(ref _deleteOnFlash, "deleteOnFlash", true); } @@ -40,7 +40,7 @@ namespace Content.Server.GameObjects.Components.Explosion ContainerHelpers.TryGetContainer(Owner, out var container); if (container == null || !container.Owner.HasComponent()) { - ServerFlashableComponent.FlashAreaHelper(Owner, _range, _duration); + FlashableComponent.FlashAreaHelper(Owner, _range, _duration); } if (_sound != null) diff --git a/Content.Server/GameObjects/Components/Projectiles/FlashProjectileComponent.cs b/Content.Server/GameObjects/Components/Projectiles/FlashProjectileComponent.cs index 381ebdd19e..756a37a44f 100644 --- a/Content.Server/GameObjects/Components/Projectiles/FlashProjectileComponent.cs +++ b/Content.Server/GameObjects/Components/Projectiles/FlashProjectileComponent.cs @@ -17,16 +17,16 @@ namespace Content.Server.GameObjects.Components.Projectiles { public override string Name => "FlashProjectile"; - private double _range; - private double _duration; + private float _range; + private float _duration; private bool _flashed; public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); - serializer.DataField(ref _range, "range", 1.0); - serializer.DataField(ref _duration, "duration", 8.0); + serializer.DataField(ref _range, "range", 1.0f); + serializer.DataField(ref _duration, "duration", 8.0f); } public override void Initialize() @@ -45,7 +45,7 @@ namespace Content.Server.GameObjects.Components.Projectiles { return; } - ServerFlashableComponent.FlashAreaHelper(Owner, _range, _duration); + FlashableComponent.FlashAreaHelper(Owner, _range, _duration); _flashed = true; } diff --git a/Content.Server/GameObjects/Components/Weapon/FlashableComponent.cs b/Content.Server/GameObjects/Components/Weapon/FlashableComponent.cs new file mode 100644 index 0000000000..11499017b3 --- /dev/null +++ b/Content.Server/GameObjects/Components/Weapon/FlashableComponent.cs @@ -0,0 +1,53 @@ +using System; +using System.Linq; +using Content.Server.Utility; +using Content.Shared.GameObjects.Components.Weapons; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.Physics; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Physics; +using Robust.Shared.Interfaces.Timing; +using Robust.Shared.IoC; +using Robust.Shared.Maths; + +namespace Content.Server.GameObjects.Components.Weapon +{ + [RegisterComponent] + public sealed class FlashableComponent : SharedFlashableComponent + { + private double _duration; + private TimeSpan _lastFlash; + + public void Flash(double duration) + { + var timing = IoCManager.Resolve(); + _lastFlash = timing.CurTime; + _duration = duration; + Dirty(); + } + + public override ComponentState GetComponentState() + { + return new FlashComponentState(_duration, _lastFlash); + } + + public static void FlashAreaHelper(IEntity source, float range, float duration, string sound = null) + { + foreach (var entity in IoCManager.Resolve().GetEntitiesInRange(source.Transform.GridPosition, range)) + { + if (!InteractionChecks.InRangeUnobstructed(source, entity.Transform.MapPosition, range, ignoredEnt:entity)) + continue; + + if(entity.TryGetComponent(out FlashableComponent flashable)) + flashable.Flash(duration); + } + + if (!string.IsNullOrEmpty(sound)) + { + IoCManager.Resolve().GetEntitySystem().PlayAtCoords(sound, source.Transform.GridPosition); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Weapon/ServerFlashableComponent.cs b/Content.Server/GameObjects/Components/Weapon/ServerFlashableComponent.cs deleted file mode 100644 index 4dfd7c50c1..0000000000 --- a/Content.Server/GameObjects/Components/Weapon/ServerFlashableComponent.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.Linq; -using Content.Shared.GameObjects.Components.Weapons; -using Content.Shared.Physics; -using Robust.Server.GameObjects.EntitySystems; -using Robust.Shared.GameObjects; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Interfaces.Physics; -using Robust.Shared.Interfaces.Timing; -using Robust.Shared.IoC; -using Robust.Shared.Maths; - -namespace Content.Server.GameObjects.Components.Weapon -{ - [RegisterComponent] - public sealed class ServerFlashableComponent : SharedFlashableComponent - { - private double _duration; - private TimeSpan _lastFlash; - - public void Flash(double duration) - { - var timing = IoCManager.Resolve(); - _lastFlash = timing.CurTime; - _duration = duration; - Dirty(); - } - - public override ComponentState GetComponentState() - { - return new FlashComponentState(_duration, _lastFlash); - } - - public static void FlashAreaHelper(IEntity source, double range, double duration, string sound = null) - { - var physicsManager = IoCManager.Resolve(); - var entityManager = IoCManager.Resolve(); - - foreach (var entity in entityManager.GetEntities(new TypeEntityQuery(typeof(ServerFlashableComponent)))) - { - if (source.Transform.MapID != entity.Transform.MapID || - entity == source) - { - continue; - } - - var direction = entity.Transform.WorldPosition - source.Transform.WorldPosition; - - if (direction.Length > range) - { - continue; - } - - // Direction will be zero if they're hit with the source only I think - if (direction == Vector2.Zero) - { - continue; - } - - var ray = new CollisionRay(source.Transform.WorldPosition, direction.Normalized, (int) CollisionGroup.Opaque); - var rayCastResults = physicsManager.IntersectRay(source.Transform.MapID, ray, direction.Length, source, false).ToList(); - if (rayCastResults.Count == 0 || - rayCastResults[0].HitEntity != entity) - { - continue; - } - - var flashable = entity.GetComponent(); - flashable.Flash(duration); - } - - if (sound != null) - { - IoCManager.Resolve().GetEntitySystem().PlayAtCoords(sound, source.Transform.GridPosition); - } - } - } -}