]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Flare gun 1984 (#15807)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Thu, 4 May 2023 02:46:02 +0000 (12:46 +1000)
committerGitHub <noreply@github.com>
Thu, 4 May 2023 02:46:02 +0000 (12:46 +1000)
Content.Server/Atmos/Components/IgniteOnCollideComponent.cs
Content.Server/Atmos/EntitySystems/FlammableSystem.cs
Content.Server/Weapons/Ranged/Systems/GunSystem.cs
Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml

index 4b7bc3339743370bb04525fbf145c40ce78ff002..212caba54bc6f395f2db55fe055ba845c054d9dc 100644 (file)
@@ -1,9 +1,16 @@
-namespace Content.Server.Atmos.Components
+using Content.Server.Atmos.EntitySystems;
+
+namespace Content.Server.Atmos.Components;
+
+[RegisterComponent, Access(typeof(FlammableSystem))]
+public sealed class IgniteOnCollideComponent : Component
 {
-    [RegisterComponent]
-    public sealed class IgniteOnCollideComponent : Component
-    {
-        [DataField("fireStacks")]
-        public float FireStacks { get; set; }
-    }
+    /// <summary>
+    /// How many more times the ignition can be applied.
+    /// </summary>
+    [ViewVariables(VVAccess.ReadWrite), DataField("count")]
+    public int Count = 1;
+
+    [ViewVariables(VVAccess.ReadWrite), DataField("fireStacks")]
+    public float FireStacks;
 }
index f612f1205fab2bdacf00a0528bdb06adf381fe4e..8baae83641e3a82a01b95aa8ff24a87be0b872df 100644 (file)
@@ -13,6 +13,7 @@ using Content.Shared.Physics;
 using Content.Shared.Popups;
 using Content.Shared.Rejuvenate;
 using Content.Shared.Temperature;
+using Content.Shared.Throwing;
 using Content.Shared.Weapons.Melee.Events;
 using Robust.Server.GameObjects;
 using Robust.Shared.Physics;
@@ -58,7 +59,10 @@ namespace Content.Server.Atmos.EntitySystems
             SubscribeLocalEvent<FlammableComponent, IsHotEvent>(OnIsHot);
             SubscribeLocalEvent<FlammableComponent, TileFireEvent>(OnTileFire);
             SubscribeLocalEvent<FlammableComponent, RejuvenateEvent>(OnRejuvenate);
+
             SubscribeLocalEvent<IgniteOnCollideComponent, StartCollideEvent>(IgniteOnCollide);
+            SubscribeLocalEvent<IgniteOnCollideComponent, LandEvent>(OnIgniteLand);
+
             SubscribeLocalEvent<IgniteOnMeleeHitComponent, MeleeHitEvent>(OnMeleeHit);
         }
 
@@ -74,15 +78,27 @@ namespace Content.Server.Atmos.EntitySystems
             }
         }
 
+        private void OnIgniteLand(EntityUid uid, IgniteOnCollideComponent component, ref LandEvent args)
+        {
+            RemCompDeferred<IgniteOnCollideComponent>(uid);
+        }
+
         private void IgniteOnCollide(EntityUid uid, IgniteOnCollideComponent component, ref StartCollideEvent args)
         {
-            var otherFixture = args.OtherFixture.Body.Owner;
+            if (!args.OtherFixture.Hard || component.Count == 0)
+                return;
 
-            if (!EntityManager.TryGetComponent(otherFixture, out FlammableComponent? flammable))
+            var otherEnt = args.OtherEntity;
+
+            if (!EntityManager.TryGetComponent(otherEnt, out FlammableComponent? flammable))
                 return;
 
             flammable.FireStacks += component.FireStacks;
-            Ignite(otherFixture, flammable);
+            Ignite(otherEnt, flammable);
+            component.Count--;
+
+            if (component.Count == 0)
+                RemCompDeferred<IgniteOnCollideComponent>(uid);
         }
 
         private void OnMapInit(EntityUid uid, FlammableComponent component, MapInitEvent args)
index 8e4a291f333f1dec5fe6603c414b2e53cec1015c..72a85776ed73715b5aa483690d7103ff12f48a88 100644 (file)
@@ -116,17 +116,9 @@ public sealed partial class GunSystem : SharedGunSystem
         foreach (var (ent, shootable) in ammo)
         {
             // pneumatic cannon doesn't shoot bullets it just throws them, ignore ammo handling
-            if (throwItems)
+            if (throwItems && ent != null)
             {
-                if (!HasComp<ProjectileComponent>(ent!.Value))
-                {
-                    RemComp<AmmoComponent>(ent.Value);
-                    // TODO: Someone can probably yeet this a billion miles so need to pre-validate input somewhere up the call stack.
-                    ThrowingSystem.TryThrow(ent.Value, mapDirection, gun.ProjectileSpeed, user);
-                    continue;
-                }
-
-                ShootProjectile(ent.Value, mapDirection, gunVelocity, user, gun.ProjectileSpeed);
+                ShootOrThrow(ent.Value, mapDirection, gunVelocity, gun, user);
                 continue;
             }
 
@@ -144,14 +136,14 @@ public sealed partial class GunSystem : SharedGunSystem
                             for (var i = 0; i < cartridge.Count; i++)
                             {
                                 var uid = Spawn(cartridge.Prototype, fromEnt);
-                                ShootProjectile(uid, angles[i].ToVec(), gunVelocity, user, gun.ProjectileSpeed);
+                                ShootOrThrow(uid, angles[i].ToVec(), gunVelocity, gun, user);
                                 shotProjectiles.Add(uid);
                             }
                         }
                         else
                         {
                             var uid = Spawn(cartridge.Prototype, fromEnt);
-                            ShootProjectile(uid, mapDirection, gunVelocity, user, gun.ProjectileSpeed);
+                            ShootOrThrow(uid, mapDirection, gunVelocity, gun, user);
                             shotProjectiles.Add(uid);
                         }
 
@@ -183,17 +175,7 @@ public sealed partial class GunSystem : SharedGunSystem
                     shotProjectiles.Add(ent!.Value);
                     MuzzleFlash(gunUid, newAmmo, user);
                     Audio.PlayPredicted(gun.SoundGunshot, gunUid, user);
-
-                    // Do a throw
-                    if (!HasComp<ProjectileComponent>(ent.Value))
-                    {
-                        RemComp<AmmoComponent>(ent.Value);
-                        // TODO: Someone can probably yeet this a billion miles so need to pre-validate input somewhere up the call stack.
-                        ThrowingSystem.TryThrow(ent.Value, mapDirection, gun.ProjectileSpeed, user);
-                        break;
-                    }
-
-                    ShootProjectile(ent.Value, mapDirection, gunVelocity, user, gun.ProjectileSpeed);
+                    ShootOrThrow(ent.Value, mapDirection, gunVelocity, gun, user);
                     break;
                 case HitscanPrototype hitscan:
 
@@ -283,6 +265,20 @@ public sealed partial class GunSystem : SharedGunSystem
         });
     }
 
+    private void ShootOrThrow(EntityUid uid, Vector2 mapDirection, Vector2 gunVelocity, GunComponent gun, EntityUid? user)
+    {
+        // Do a throw
+        if (!HasComp<ProjectileComponent>(uid))
+        {
+            RemComp<AmmoComponent>(uid);
+            // TODO: Someone can probably yeet this a billion miles so need to pre-validate input somewhere up the call stack.
+            ThrowingSystem.TryThrow(uid, mapDirection, gun.ProjectileSpeed, user);
+            return;
+        }
+
+        ShootProjectile(uid, mapDirection, gunVelocity, user, gun.ProjectileSpeed);
+    }
+
     public void ShootProjectile(EntityUid uid, Vector2 direction, Vector2 gunVelocity, EntityUid? user = null, float speed = 20f)
     {
         var physics = EnsureComp<PhysicsComponent>(uid);
index 89b80b39f117423adb87bf4b21e5e383bb963245..c65be958298d58f869a968979d28894570ee745f 100644 (file)
   id: PelletShotgunFlare
   name: pellet (.50 flare)
   noSpawn: true
-  parent: BaseBullet
   components:
+  - type: CollisionWake
+  - type: TileFrictionModifier
+    modifier: 0.5
+  - type: Physics
+    bodyType: Dynamic
+    fixedRotation: false
+  - type: Fixtures
+    fixtures:
+      - shape:
+          !type:PhysShapeAabb
+          bounds: "-0.25,-0.25,0.25,0.25"
+        density: 20
+        mask:
+          - ItemMask
+        restitution: 0.3
+        friction: 0.2
   - type: Sprite
     sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
     state: buckshot-flare
-  - type: Projectile
-    damage:
-      groups:
-        Burn: 14
+  - type: IgnitionSource
+    temperature: 1000
+  - type: TimedDespawn
+    lifetime: 240
+  - type: AmbientSound
+    enabled: true
+    volume: 0
+    range: 7
+    sound:
+      path: /Audio/Items/Flare/flare_burn.ogg
+      params:
+        loop: true
+  - type: IgniteOnCollide
+    fireStacks: 1
   - type: PointLight
     enabled: true
     color: "#FF8080"
     radius: 15.0
     energy: 9.0
-  - type: IgniteOnCollide
-    fireStacks: 4