From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 4 May 2023 02:46:02 +0000 (+1000) Subject: Flare gun 1984 (#15807) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=06efff2b2d536605988349dd674b95204af73133;p=space-station-14.git Flare gun 1984 (#15807) --- 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