From 2b21fa285210a69a24ada9b59069de189ef8b58e Mon Sep 17 00:00:00 2001 From: Apopheosis Date: Sat, 23 Aug 2025 17:10:41 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=93=D0=BB=D1=83=D1=88=D0=B8=D0=BB=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SolarFlareGeneratorComponent.cs | 20 +++ .../SolarFlareGeneratorSystem.cs | 158 ++++++++++++++++++ .../Machines/solar_flare_generator.yml | 15 ++ 3 files changed, 193 insertions(+) create mode 100644 Content.Server/SolarFlareGenerator/Components/SolarFlareGeneratorComponent.cs create mode 100644 Content.Server/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs create mode 100644 Resources/Prototypes/Entities/Structures/Machines/solar_flare_generator.yml diff --git a/Content.Server/SolarFlareGenerator/Components/SolarFlareGeneratorComponent.cs b/Content.Server/SolarFlareGenerator/Components/SolarFlareGeneratorComponent.cs new file mode 100644 index 000000000000..409b6b1caf5b --- /dev/null +++ b/Content.Server/SolarFlareGenerator/Components/SolarFlareGeneratorComponent.cs @@ -0,0 +1,20 @@ +using Content.Server.Solar.EntitySystems; + +/// +/// Стационарное устройство, при активации которого на срок в 30-60 секунд в радиусе 100-150 происходит эффект "Солнечной вспышки" +/// +[RegisterComponent] +[Access(typeof(SolarFlareGeneratorSystem))] +public sealed partial class SolarFlareGeneratorComponent : Component +{ + [DataField] + public bool IsActive = false; + [DataField] + public bool IsReady = true; + [DataField] + public TimeSpan EffectTimer = TimeSpan.Zero; + [DataField] + public TimeSpan CooldownTimer = TimeSpan.Zero; + [DataField] + public float Radius; +} diff --git a/Content.Server/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs b/Content.Server/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs new file mode 100644 index 000000000000..55ae06be3b9b --- /dev/null +++ b/Content.Server/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs @@ -0,0 +1,158 @@ +using Content.Client; +using Content.Server.Bed.Components; +using Content.Server.Botany.Components; +using Content.Server.Power.EntitySystems; +using Content.Server.PowerCell; +using Content.Server.Radio; +using Content.Shared.Bed.Sleep; +using Content.Shared.Buckle.Components; +using Content.Shared.Damage; +using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Systems; +using Content.Shared.Interaction; +using Content.Shared.Mobs.Systems; +using Content.Shared.Popups; +using Content.Shared.PowerCell.Components; +using Content.Shared.Radio.Components; +using Content.Shared.Radio.EntitySystems; +using JetBrains.FormatRipper.Elf; +using Robust.Shared.GameObjects; +using Robust.Shared.Timing; +using System; +using System.ComponentModel; + + +namespace Content.Server.Solar.EntitySystems +{ + public sealed class SolarFlareGeneratorSystem : EntitySystem + { + [Dependency] private readonly PowerCellSystem _powerCell = default!; + [Dependency] private readonly BatterySystem _battery = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedDeviceNetworkJammerSystem _jammer = default!; + [Dependency] private readonly SharedJammerSystem _jammerSystem = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] protected readonly SharedPopupSystem Popup = default!; + private const float _cooldownTimerValue = 40; + private const float _effectTimer = 30; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInteractHand); + SubscribeLocalEvent(OnRadioReceiveAttempt); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var frameTimeSpan = TimeSpan.FromSeconds(frameTime); + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var solarFlareComponent)) + { + if (solarFlareComponent.IsActive) + { + UpdateActiveGenerator(solarFlareComponent, frameTimeSpan); + } + else if (!solarFlareComponent.IsReady) + { + UpdateCooldown(solarFlareComponent, frameTimeSpan); + } + else + { + solarFlareComponent.EffectTimer = TimeSpan.Zero; + } + } + } + + private void UpdateActiveGenerator(SolarFlareGeneratorComponent component, TimeSpan frameTime) + { + // Обновление таймера эффекта + if (component.EffectTimer > TimeSpan.Zero) + { + component.EffectTimer -= frameTime; + + if (component.EffectTimer <= TimeSpan.Zero) + { + component.IsActive = false; + component.EffectTimer = TimeSpan.Zero; + } + } + + // Обновление кулдауна + UpdateCooldown(component, frameTime); + } + + private void UpdateCooldown(SolarFlareGeneratorComponent component, TimeSpan frameTime) + { + if (component.CooldownTimer > TimeSpan.Zero) + { + component.CooldownTimer -= frameTime; + } + else if (!component.IsReady) + { + component.IsReady = true; + component.CooldownTimer = TimeSpan.Zero; + } + } + + private void OnInteractHand(Entity entity, ref InteractHandEvent args) + { + if (args.Handled) + return; + EnsureComp(entity, out var component); + + if (component.IsReady) + { + var state = Loc.GetString("radio-jammer-component-on-state"); + var message = Loc.GetString("radio-jammer-component-on-use", ("state", state)); + Popup.PopupEntity(message, args.User, args.User); + OnActivate(entity, args); + } + + } + + private void OnActivate(Entity entity, InteractHandEvent args) + { + EnsureComp(entity, out var component); + StartSolarFlareGenerator(component); + args.Handled = true; + } + + private void StartSolarFlareGenerator(SolarFlareGeneratorComponent component) + { + component.IsActive = true; + component.IsReady = false; + component.CooldownTimer = TimeSpan.FromMinutes(_cooldownTimerValue); + component.EffectTimer = TimeSpan.FromSeconds(_effectTimer); + } + + private void OnRadioReceiveAttempt(ref RadioReceiveAttemptEvent args) + { + if (ShouldCancelReceive(args.RadioSource)) + { + args.Cancelled = true; + } + + } + + private bool ShouldCancelReceive(EntityUid sourceUid) + { + + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var transform, out var solarFlareGeneratorComponent)) + { + var source = Transform(sourceUid).Coordinates; + if (_transform.InRange(source, transform.Coordinates, solarFlareGeneratorComponent.Radius) && solarFlareGeneratorComponent.IsActive) + { + return true; + } + } + + return false; + } + } +} diff --git a/Resources/Prototypes/Entities/Structures/Machines/solar_flare_generator.yml b/Resources/Prototypes/Entities/Structures/Machines/solar_flare_generator.yml new file mode 100644 index 000000000000..fad9f2fff5ad --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Machines/solar_flare_generator.yml @@ -0,0 +1,15 @@ +- type: entity + name: solar flare generator + parent: BaseItem + id: SolarFlareGenerator + description: We're going dark. + components: + - type: Sprite + sprite: Objects/Fun/bikehorn.rsi + state: icon + - type: Transform + anchored: true + - type: Physics + bodyType: Static + - type: SolarFlareGenerator + radius: 150 From 8e7d0e14df1833f255a33988e5218472f10dad5a Mon Sep 17 00:00:00 2001 From: Apopheosis Date: Sat, 23 Aug 2025 17:42:05 +0300 Subject: [PATCH 2/6] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=20=D0=B2=20=5FForge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/SolarFlareGeneratorComponent.cs | 0 .../EntitySystems/SolarFlareGeneratorSystem.cs | 0 .../SolarFlareGenerator/solar_flare_generator.yml | 15 +++++++++++++++ 3 files changed, 15 insertions(+) rename Content.Server/{ => _Forge}/SolarFlareGenerator/Components/SolarFlareGeneratorComponent.cs (100%) rename Content.Server/{ => _Forge}/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs (100%) create mode 100644 Content.Server/_Forge/SolarFlareGenerator/solar_flare_generator.yml diff --git a/Content.Server/SolarFlareGenerator/Components/SolarFlareGeneratorComponent.cs b/Content.Server/_Forge/SolarFlareGenerator/Components/SolarFlareGeneratorComponent.cs similarity index 100% rename from Content.Server/SolarFlareGenerator/Components/SolarFlareGeneratorComponent.cs rename to Content.Server/_Forge/SolarFlareGenerator/Components/SolarFlareGeneratorComponent.cs diff --git a/Content.Server/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs b/Content.Server/_Forge/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs similarity index 100% rename from Content.Server/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs rename to Content.Server/_Forge/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs diff --git a/Content.Server/_Forge/SolarFlareGenerator/solar_flare_generator.yml b/Content.Server/_Forge/SolarFlareGenerator/solar_flare_generator.yml new file mode 100644 index 000000000000..fad9f2fff5ad --- /dev/null +++ b/Content.Server/_Forge/SolarFlareGenerator/solar_flare_generator.yml @@ -0,0 +1,15 @@ +- type: entity + name: solar flare generator + parent: BaseItem + id: SolarFlareGenerator + description: We're going dark. + components: + - type: Sprite + sprite: Objects/Fun/bikehorn.rsi + state: icon + - type: Transform + anchored: true + - type: Physics + bodyType: Static + - type: SolarFlareGenerator + radius: 150 From c843fbac9f3df22f1124797786a9ebe8af18872e Mon Sep 17 00:00:00 2001 From: Apopheosis Date: Sat, 23 Aug 2025 17:44:42 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=20=D0=B2=20=5FForge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_Forge/SolarFlareGenerator/solar_flare_generator.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {Content.Server => Resources/Prototypes}/_Forge/SolarFlareGenerator/solar_flare_generator.yml (100%) diff --git a/Content.Server/_Forge/SolarFlareGenerator/solar_flare_generator.yml b/Resources/Prototypes/_Forge/SolarFlareGenerator/solar_flare_generator.yml similarity index 100% rename from Content.Server/_Forge/SolarFlareGenerator/solar_flare_generator.yml rename to Resources/Prototypes/_Forge/SolarFlareGenerator/solar_flare_generator.yml From 89643541df76e73d69f35281a5f0908a2d639b2b Mon Sep 17 00:00:00 2001 From: Apopheosis Date: Sat, 23 Aug 2025 17:53:21 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20EnsureComp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EntitySystems/SolarFlareGeneratorSystem.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Content.Server/_Forge/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs b/Content.Server/_Forge/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs index 55ae06be3b9b..efb5c74fb41c 100644 --- a/Content.Server/_Forge/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs +++ b/Content.Server/_Forge/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs @@ -102,9 +102,8 @@ private void OnInteractHand(Entity entity, ref Int { if (args.Handled) return; - EnsureComp(entity, out var component); - if (component.IsReady) + if (entity.Comp.IsReady) { var state = Loc.GetString("radio-jammer-component-on-state"); var message = Loc.GetString("radio-jammer-component-on-use", ("state", state)); @@ -116,8 +115,7 @@ private void OnInteractHand(Entity entity, ref Int private void OnActivate(Entity entity, InteractHandEvent args) { - EnsureComp(entity, out var component); - StartSolarFlareGenerator(component); + StartSolarFlareGenerator(entity.Comp); args.Handled = true; } From 06fde76131d423b16e8fc96553d4a7c5b5200fa0 Mon Sep 17 00:00:00 2001 From: Zekins <136648667+Zekins3366@users.noreply.github.com> Date: Sat, 23 Aug 2025 17:58:15 +0300 Subject: [PATCH 5/6] =?UTF-8?q?=D0=9B=D0=B8=D1=88=D0=BD=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Structures/Machines/solar_flare_generator.yml | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 Resources/Prototypes/Entities/Structures/Machines/solar_flare_generator.yml diff --git a/Resources/Prototypes/Entities/Structures/Machines/solar_flare_generator.yml b/Resources/Prototypes/Entities/Structures/Machines/solar_flare_generator.yml deleted file mode 100644 index fad9f2fff5ad..000000000000 --- a/Resources/Prototypes/Entities/Structures/Machines/solar_flare_generator.yml +++ /dev/null @@ -1,15 +0,0 @@ -- type: entity - name: solar flare generator - parent: BaseItem - id: SolarFlareGenerator - description: We're going dark. - components: - - type: Sprite - sprite: Objects/Fun/bikehorn.rsi - state: icon - - type: Transform - anchored: true - - type: Physics - bodyType: Static - - type: SolarFlareGenerator - radius: 150 From 69d72fcb5fd94329411f79fdeda44ef87a14cb2a Mon Sep 17 00:00:00 2001 From: Apopheosis Date: Sat, 23 Aug 2025 17:58:57 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BA=D1=83=D0=BB=D0=B4=D0=B0=D1=83=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EntitySystems/SolarFlareGeneratorSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/_Forge/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs b/Content.Server/_Forge/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs index efb5c74fb41c..a059958297df 100644 --- a/Content.Server/_Forge/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs +++ b/Content.Server/_Forge/SolarFlareGenerator/EntitySystems/SolarFlareGeneratorSystem.cs @@ -33,7 +33,7 @@ public sealed class SolarFlareGeneratorSystem : EntitySystem [Dependency] private readonly SharedJammerSystem _jammerSystem = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] protected readonly SharedPopupSystem Popup = default!; - private const float _cooldownTimerValue = 40; + private const float _cooldownTimerValue = 15; private const float _effectTimer = 30; public override void Initialize() {