Skip to content

Commit

Permalink
Make flare gun explode, damage and stun the player when used with the…
Browse files Browse the repository at this point in the history
… wrong ammo (space-wizards#22349)

* Flare gun can now only be loaded with actual flares

* Make flare gun loadable with other shells, but destroy it and damage and stun the user when used

* tweak

* Logic fix + QOL add-ons

* damageOnWrongAmmo in gun component

* cleanup
  • Loading branch information
MendaxxDev authored Dec 15, 2023
1 parent 353ab95 commit e301378
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 2 deletions.
22 changes: 22 additions & 0 deletions Content.Server/Weapons/Ranged/Systems/GunSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using Content.Shared.Damage.Systems;
using Content.Shared.Database;
using Content.Shared.Effects;
using Content.Shared.FixedPoint;
using Content.Shared.Interaction.Components;
using Content.Shared.Projectiles;
using Content.Shared.Weapons.Melee;
Expand Down Expand Up @@ -132,6 +133,27 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid?
case CartridgeAmmoComponent cartridge:
if (!cartridge.Spent)
{
if (gun.CompatibleAmmo != null &&
!gun.CompatibleAmmo.Exists(ammoAllowed => ammoAllowed.Equals(cartridge.Prototype))
&& user != null)
{
if (gun.DamageOnWrongAmmo != null)
Damageable.TryChangeDamage(user, gun.DamageOnWrongAmmo, origin: user);
_stun.TryParalyze(user.Value, TimeSpan.FromSeconds(3f), true);

Audio.PlayPvs(new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/bang.ogg"), gunUid);

PopupSystem.PopupEntity(Loc.GetString("gun-component-wrong-ammo"), user.Value);
_adminLogger.Add(LogType.EntityDelete, LogImpact.Medium, $"Shot wrong ammo by {ToPrettyString(user.Value)} deleted {ToPrettyString(gunUid)}");
userImpulse = false;

SetCartridgeSpent(ent!.Value, cartridge, true);
MuzzleFlash(gunUid, cartridge, user);
Del(gunUid);
if (cartridge.DeleteOnSpawn)
Del(ent.Value);
return;
}
if (cartridge.Count > 1)
{
var angles = LinearSpread(mapAngle - cartridge.Spread / 2,
Expand Down
16 changes: 16 additions & 0 deletions Content.Shared/Weapons/Ranged/Components/GunComponent.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
using Content.Shared.Damage;
using Content.Shared.Tag;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;

namespace Content.Shared.Weapons.Ranged.Components;

Expand Down Expand Up @@ -110,6 +114,18 @@ public partial class GunComponent : Component
[ViewVariables(VVAccess.ReadWrite), DataField("resetOnHandSelected")]
public bool ResetOnHandSelected = true;

/// <summary>
/// Type of ammo the gun can work with
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField("compatibleAmmo")]
public List<ProtoId<TagPrototype>>? CompatibleAmmo;

/// <summary>
/// Damage the gun deals when used with wrong ammo
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField("damageOnWrongAmmo")]
public DamageSpecifier? DamageOnWrongAmmo = null;

/// <summary>
/// How fast the projectile moves.
/// </summary>
Expand Down
1 change: 1 addition & 0 deletions Resources/Locale/en-US/weapons/ranged/gun.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ gun-selected-mode = Selected {$mode}
gun-disabled = You can't use guns!
gun-clumsy = The gun blows up in your face!
gun-set-fire-mode = Set to {$mode}
gun-component-wrong-ammo = Wrong ammo!
# SelectiveFire
gun-SemiAuto = semi-auto
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,4 +148,4 @@
spread: 45 #deadly if you can get up close... otherwise, good luck doing any kind of real damage
proto: PelletShotgunImprovised
- type: SpentAmmoVisuals
state: "improvised"
state: "improvised"
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
id: PelletShotgunImprovised
name: improvised pellet
noSpawn: true
parent: BaseBullet
parent: BaseBullet
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
Expand Down Expand Up @@ -135,6 +135,9 @@
- ItemMask
restitution: 0.3
friction: 0.2
- type: Tag
tags:
- PelletShotgunFlare
- type: Sprite
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
state: buckshot-flare
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,13 @@
selectedMode: SemiAuto
availableModes:
- SemiAuto
compatibleAmmo:
- PelletShotgunFlare
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/flaregun.ogg
damageOnWrongAmmo:
types:
Blunt: 6.0
- type: BallisticAmmoProvider
whitelist:
tags:
Expand Down
3 changes: 3 additions & 0 deletions Resources/Prototypes/tags.yml
Original file line number Diff line number Diff line change
Expand Up @@ -930,6 +930,9 @@
- type: Tag
id: ShellShotgun

- type: Tag
id: PelletShotgunFlare

- type: Tag
id: Shiv

Expand Down

0 comments on commit e301378

Please sign in to comment.