]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add flash reaction effect (#32377)
authorslarticodefast <161409025+slarticodefast@users.noreply.github.com>
Fri, 25 Oct 2024 22:47:11 +0000 (00:47 +0200)
committerGitHub <noreply@github.com>
Fri, 25 Oct 2024 22:47:11 +0000 (00:47 +0200)
add flash reaction effect

Content.Server/EntityEffects/Effects/FlashReactionEffect.cs [new file with mode: 0644]
Resources/Locale/en-US/guidebook/chemistry/effects.ftl
Resources/Prototypes/Entities/Effects/chemistry_effects.yml
Resources/Prototypes/Recipes/Reactions/chemicals.yml

diff --git a/Content.Server/EntityEffects/Effects/FlashReactionEffect.cs b/Content.Server/EntityEffects/Effects/FlashReactionEffect.cs
new file mode 100644 (file)
index 0000000..fbf99e9
--- /dev/null
@@ -0,0 +1,82 @@
+using Content.Shared.EntityEffects;
+using Content.Server.Flash;
+using Robust.Server.GameObjects;
+using Robust.Shared.Audio;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server.EntityEffects.Effects;
+
+[DataDefinition]
+public sealed partial class FlashReactionEffect : EntityEffect
+{
+    /// <summary>
+    ///     Flash range per unit of reagent.
+    /// </summary>
+    [DataField]
+    public float RangePerUnit = 0.2f;
+
+    /// <summary>
+    ///     Maximum flash range.
+    /// </summary>
+    [DataField]
+    public float MaxRange = 10f;
+
+    /// <summary>
+    ///     How much to entities are slowed down.
+    /// </summary>
+    [DataField]
+    public float SlowTo = 0.5f;
+
+    /// <summary>
+    ///     The time entities will be flashed in seconds.
+    ///     The default is chosen to be better than the hand flash so it is worth using it for grenades etc.
+    /// </summary>
+    [DataField]
+    public float Duration = 4f;
+
+    /// <summary>
+    ///     The prototype ID used for the visual effect.
+    /// </summary>
+    [DataField]
+    public EntProtoId? FlashEffectPrototype = "ReactionFlash";
+
+    /// <summary>
+    ///     The sound the flash creates.
+    /// </summary>
+    [DataField]
+    public SoundSpecifier? Sound = new SoundPathSpecifier("/Audio/Weapons/flash.ogg");
+
+    protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
+        => Loc.GetString("reagent-effect-guidebook-flash-reaction-effect", ("chance", Probability));
+
+    public override void Effect(EntityEffectBaseArgs args)
+    {
+        var transform = args.EntityManager.GetComponent<TransformComponent>(args.TargetEntity);
+        var transformSystem = args.EntityManager.System<SharedTransformSystem>();
+
+        var range = 1f;
+
+        if (args is EntityEffectReagentArgs reagentArgs)
+            range = MathF.Min((float)(reagentArgs.Quantity * RangePerUnit), MaxRange);
+
+        args.EntityManager.System<FlashSystem>().FlashArea(
+            args.TargetEntity,
+            null,
+            range,
+            Duration * 1000,
+            slowTo: SlowTo,
+            sound: Sound);
+
+        if (FlashEffectPrototype == null)
+            return;
+
+        var uid = args.EntityManager.SpawnEntity(FlashEffectPrototype, transformSystem.GetMapCoordinates(transform));
+        transformSystem.AttachToGridOrMap(uid);
+
+        if (!args.EntityManager.TryGetComponent<PointLightComponent>(uid, out var pointLightComp))
+            return;
+        var pointLightSystem = args.EntityManager.System<SharedPointLightSystem>();
+        // PointLights with a radius lower than 1.1 are too small to be visible, so this is hardcoded
+        pointLightSystem.SetRadius(uid, MathF.Max(1.1f, range), pointLightComp);
+    }
+}
index b65c332346a923129c5c6dd82f8f62e06e4a5877..642555b237eaa2fa1e397e98fe6aa6090b59fce0 100644 (file)
@@ -37,6 +37,12 @@ reagent-effect-guidebook-emp-reaction-effect =
         *[other] cause
     } an electromagnetic pulse
 
+reagent-effect-guidebook-flash-reaction-effect =
+    { $chance ->
+        [1] Causes
+        *[other] cause
+    } a blinding flash
+
 reagent-effect-guidebook-foam-area-reaction-effect =
     { $chance ->
         [1] Creates
index 59fa1b0d1a6e791a06ac3a9c120b9fcd30a7348e..8784ed77cecd70d1e9af2391236dc40c65a7e110 100644 (file)
       state: metal_foam-north
     - map: [ "enum.EdgeLayer.West" ]
       state: metal_foam-west
+
+- type: entity
+  id: ReactionFlash
+  categories: [ HideSpawnMenu ]
+  components:
+  - type: PointLight
+    enabled: true
+    radius: 2
+    energy: 8
+  - type: LightFade
+    duration: 0.5
+  - type: TimedDespawn
+    lifetime: 0.5
index 537a792e8596a46dca7dd6a6bedd31ac25fa13d6..78fdfec7c9a37d6453ec14e25eaf0b40057b63bd 100644 (file)
@@ -81,7 +81,7 @@
       amount: 1
     Sulfur:
       amount: 1
-    Oxygen: 
+    Oxygen:
       amount: 2
   products:
     SulfuricAcid: 3
       energyConsumption: 12500
       duration: 15
 
+- type: reaction
+  id: Flash
+  impact: High
+  priority: 20
+  reactants:
+    Aluminium:
+      amount: 1
+    Potassium:
+      amount: 1
+    Sulfur:
+      amount: 1
+  effects:
+    - !type:FlashReactionEffect
+
 - type: reaction
   id: TableSalt
   minTemp: 370
       amount: 1
   products:
     Tazinide: 1
+