From 06efff2b2d536605988349dd674b95204af73133 Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Thu, 4 May 2023 12:46:02 +1000
Subject: [PATCH] Flare gun 1984 (#15807)
---
.../Components/IgniteOnCollideComponent.cs | 21 ++++++----
.../Atmos/EntitySystems/FlammableSystem.cs | 22 ++++++++--
.../Weapons/Ranged/Systems/GunSystem.cs | 42 +++++++++----------
.../Guns/Ammunition/Projectiles/shotgun.yml | 37 ++++++++++++----
4 files changed, 82 insertions(+), 40 deletions(-)
diff --git a/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs b/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs
index 4b7bc33397..212caba54b 100644
--- a/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs
+++ b/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs
@@ -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; }
- }
+ ///
+ /// How many more times the ignition can be applied.
+ ///
+ [ViewVariables(VVAccess.ReadWrite), DataField("count")]
+ public int Count = 1;
+
+ [ViewVariables(VVAccess.ReadWrite), DataField("fireStacks")]
+ public float FireStacks;
}
diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs
index f612f1205f..8baae83641 100644
--- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs
+++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs
@@ -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(OnIsHot);
SubscribeLocalEvent(OnTileFire);
SubscribeLocalEvent(OnRejuvenate);
+
SubscribeLocalEvent(IgniteOnCollide);
+ SubscribeLocalEvent(OnIgniteLand);
+
SubscribeLocalEvent(OnMeleeHit);
}
@@ -74,15 +78,27 @@ namespace Content.Server.Atmos.EntitySystems
}
}
+ private void OnIgniteLand(EntityUid uid, IgniteOnCollideComponent component, ref LandEvent args)
+ {
+ RemCompDeferred(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(uid);
}
private void OnMapInit(EntityUid uid, FlammableComponent component, MapInitEvent args)
diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs
index 8e4a291f33..72a85776ed 100644
--- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs
+++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs
@@ -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(ent!.Value))
- {
- RemComp(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(ent.Value))
- {
- RemComp(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(uid))
+ {
+ RemComp(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(uid);
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml
index 89b80b39f1..c65be95829 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml
@@ -108,19 +108,42 @@
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
--
2.51.2