From dc40f743c1430fa85e0e92f21d79a37bdf8e5606 Mon Sep 17 00:00:00 2001 From: Milon Date: Wed, 27 Nov 2024 10:06:07 +0100 Subject: [PATCH] shitcode pt2 --- .../Weapons/Ranged/Overlays/TracerOverlay.cs | 4 +- .../Weapons/Ranged/Systems/TracerSystem.cs | 90 +++++++++++++ .../Weapons/Ranged/Systems/TracerSystem.cs | 123 ------------------ .../Ranged/Components/TracerComponent.cs | 20 ++- .../Weapons/Guns/Projectiles/projectiles.yml | 11 +- 5 files changed, 111 insertions(+), 137 deletions(-) rename Content.Client/{ => DeltaV}/Weapons/Ranged/Overlays/TracerOverlay.cs (81%) create mode 100644 Content.Client/DeltaV/Weapons/Ranged/Systems/TracerSystem.cs delete mode 100644 Content.Client/Weapons/Ranged/Systems/TracerSystem.cs rename Content.Shared/{ => DeltaV}/Weapons/Ranged/Components/TracerComponent.cs (61%) diff --git a/Content.Client/Weapons/Ranged/Overlays/TracerOverlay.cs b/Content.Client/DeltaV/Weapons/Ranged/Overlays/TracerOverlay.cs similarity index 81% rename from Content.Client/Weapons/Ranged/Overlays/TracerOverlay.cs rename to Content.Client/DeltaV/Weapons/Ranged/Overlays/TracerOverlay.cs index 74a61f9a1fe..e46db4343f6 100644 --- a/Content.Client/Weapons/Ranged/Overlays/TracerOverlay.cs +++ b/Content.Client/DeltaV/Weapons/Ranged/Overlays/TracerOverlay.cs @@ -1,8 +1,8 @@ +using Content.Client.DeltaV.Weapons.Ranged.Systems; using Robust.Client.Graphics; -using Content.Client.Weapons.Ranged.Systems; using Robust.Shared.Enums; -namespace Content.Client.Weapons.Ranged.Overlays; +namespace Content.Client.DeltaV.Weapons.Ranged.Overlays; public sealed class TracerOverlay : Overlay { diff --git a/Content.Client/DeltaV/Weapons/Ranged/Systems/TracerSystem.cs b/Content.Client/DeltaV/Weapons/Ranged/Systems/TracerSystem.cs new file mode 100644 index 00000000000..625d4b6f2f0 --- /dev/null +++ b/Content.Client/DeltaV/Weapons/Ranged/Systems/TracerSystem.cs @@ -0,0 +1,90 @@ +using System.Numerics; +using Content.Client.DeltaV.Weapons.Ranged.Overlays; +using Content.Shared.DeltaV.Weapons.Ranged.Components; +using Robust.Client.Graphics; +using Robust.Shared.Map; +using Robust.Shared.Timing; +using TracerComponent = Content.Shared.DeltaV.Weapons.Ranged.Components.TracerComponent; + +namespace Content.Client.DeltaV.Weapons.Ranged.Systems; + +public sealed class TracerSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IOverlayManager _overlay = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + public override void Initialize() + { + base.Initialize(); + _overlay.AddOverlay(new TracerOverlay(this)); + + SubscribeLocalEvent(OnTracerStart); + } + + private void OnTracerStart(Entity ent, ref ComponentStartup args) + { + var xform = Transform(ent); + var pos = _transform.GetWorldPosition(xform); + + ent.Comp.Data = new TracerData + { + EndTime = _timing.CurTime + TimeSpan.FromSeconds(ent.Comp.Lifetime), + PositionHistory = new List { pos } + }; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var curTime = _timing.CurTime; + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var tracer, out var xform)) + { + if (curTime > tracer.Data.EndTime) + { + RemCompDeferred(uid); + continue; + } + + var positions = tracer.Data.PositionHistory; + var currentPos = _transform.GetWorldPosition(xform); + positions.Add(currentPos); + + while (positions.Count > 2 && GetTrailLength(positions) > tracer.Length) + { + positions.RemoveAt(0); + } + } + } + + private static float GetTrailLength(List positions) + { + var length = 0f; + for (var i = 1; i < positions.Count; i++) + { + length += Vector2.Distance(positions[i - 1], positions[i]); + } + return length; + } + + public void Draw(DrawingHandleWorld handle, MapId currentMap) + { + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out _, out var tracer, out var xform)) + { + if (xform.MapID != currentMap) + continue; + + var positions = tracer.Data.PositionHistory; + for (var i = 1; i < positions.Count; i++) + { + handle.DrawLine(positions[i - 1], positions[i], tracer.Color); + } + } + } +} + diff --git a/Content.Client/Weapons/Ranged/Systems/TracerSystem.cs b/Content.Client/Weapons/Ranged/Systems/TracerSystem.cs deleted file mode 100644 index af31cd95eb1..00000000000 --- a/Content.Client/Weapons/Ranged/Systems/TracerSystem.cs +++ /dev/null @@ -1,123 +0,0 @@ -using Content.Shared.Weapons.Ranged.Components; -using Robust.Client.Graphics; -using System.Numerics; -using Content.Client.Weapons.Ranged.Overlays; -using Robust.Shared.Timing; -using Robust.Shared.Map; - -namespace Content.Client.Weapons.Ranged.Systems; - -public sealed class TracerSystem : EntitySystem -{ - [Dependency] private readonly IOverlayManager _overlay = default!; - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - - private sealed class TracerData - { - public List PositionHistory = new(); - public Color Color; - public TimeSpan EndTime; - public float Length; - public MapId MapId; - } - - private readonly Dictionary _activeTracers = new(); - - public override void Initialize() - { - base.Initialize(); - _overlay.AddOverlay(new TracerOverlay(this)); - - SubscribeLocalEvent(OnTracerStart); - SubscribeLocalEvent(OnTracerShutdown); - } - - private void OnTracerStart(EntityUid uid, TracerComponent component, ComponentStartup args) - { - var xform = Transform(uid); - var pos = _transform.GetWorldPosition(xform); - - _activeTracers[uid] = new TracerData - { - Color = component.Color, - EndTime = _timing.CurTime + TimeSpan.FromSeconds(component.Lifetime), - Length = component.Length, - PositionHistory = new List { pos }, - MapId = xform.MapID - }; - } - - private void OnTracerShutdown(EntityUid uid, TracerComponent component, ComponentShutdown args) - { - _activeTracers.Remove(uid); - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - var xformQuery = GetEntityQuery(); - var time = _timing.CurTime; - var toRemove = new List(); - - foreach (var (uid, tracer) in _activeTracers) - { - // Remove expired tracers - if (time > tracer.EndTime) - { - toRemove.Add(uid); - continue; - } - - // Update position history if entity still exists - if (!xformQuery.TryGetComponent(uid, out var xform)) - { - toRemove.Add(uid); - continue; - } - - var positions = tracer.PositionHistory; - var currentPos = _transform.GetWorldPosition(xform); - positions.Add(currentPos); - - // Maintain history based on desired length - while (positions.Count > 2 && GetTrailLength(positions) > tracer.Length) - { - positions.RemoveAt(0); - } - } - - foreach (var uid in toRemove) - { - _activeTracers.Remove(uid); - } - } - - private static float GetTrailLength(List positions) - { - var length = 0f; - for (var i = 1; i < positions.Count; i++) - { - length += Vector2.Distance(positions[i - 1], positions[i]); - } - return length; - } - - public void Draw(DrawingHandleWorld handle, MapId currentMap) - { - foreach (var tracer in _activeTracers.Values) - { - // Skip if not on current map - if (tracer.MapId != currentMap) - continue; - - var positions = tracer.PositionHistory; - // Draw line segments between all points in history - for (var i = 1; i < positions.Count; i++) - { - handle.DrawLine(positions[i - 1], positions[i], tracer.Color); - } - } - } -} diff --git a/Content.Shared/Weapons/Ranged/Components/TracerComponent.cs b/Content.Shared/DeltaV/Weapons/Ranged/Components/TracerComponent.cs similarity index 61% rename from Content.Shared/Weapons/Ranged/Components/TracerComponent.cs rename to Content.Shared/DeltaV/Weapons/Ranged/Components/TracerComponent.cs index 9bf90535a82..948aa269a61 100644 --- a/Content.Shared/Weapons/Ranged/Components/TracerComponent.cs +++ b/Content.Shared/DeltaV/Weapons/Ranged/Components/TracerComponent.cs @@ -1,28 +1,38 @@ +using System.Numerics; using Robust.Shared.GameStates; +using Robust.Shared.Map; -namespace Content.Shared.Weapons.Ranged.Components; +namespace Content.Shared.DeltaV.Weapons.Ranged.Components; /// /// Added to projectiles to give them tracer effects /// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[RegisterComponent, NetworkedComponent] public sealed partial class TracerComponent : Component { /// /// How long the tracer effect should remain visible for after firing /// - [DataField, AutoNetworkedField] + [DataField] public float Lifetime = 10f; /// /// The maximum length of the tracer trail /// - [DataField, AutoNetworkedField] + [DataField] public float Length = 2f; /// /// Color of the tracer line effect /// - [DataField, AutoNetworkedField] + [DataField] public Color Color = Color.Red; + + public TracerData Data = default!; +} + +public sealed class TracerData +{ + public List PositionHistory = new(); + public TimeSpan EndTime; } diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 79d6b375598..cdaf6ec473a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -1120,21 +1120,19 @@ # so that we dont have to add the same components over and over again - type: entity + abstract: true id: BaseBulletTracer - name: base bullet tracer red - categories: [ HideSpawnMenu ] components: - type: Tracer - type: PointLight - radius: 1.4 + radius: 1.3 energy: 2 color: "#ff0000" - type: entity + abstract: true parent: BaseBulletTracer id: BaseBulletTracerYellow - name: base bullet tracer yellow - categories: [ HideSpawnMenu ] components: - type: Tracer color: "#ffff00" @@ -1142,10 +1140,9 @@ color: "#ffff00" - type: entity + abstract: true parent: BaseBulletTracer id: BaseBulletTracerGreen - name: base bullet tracer green - categories: [ HideSpawnMenu ] components: - type: Tracer color: "#008000"