Make flare gun explode, damage and stun the player when used with the wrong ammo (#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
This commit is contained in:
@@ -10,6 +10,7 @@ using Content.Shared.Damage;
|
|||||||
using Content.Shared.Damage.Systems;
|
using Content.Shared.Damage.Systems;
|
||||||
using Content.Shared.Database;
|
using Content.Shared.Database;
|
||||||
using Content.Shared.Effects;
|
using Content.Shared.Effects;
|
||||||
|
using Content.Shared.FixedPoint;
|
||||||
using Content.Shared.Interaction.Components;
|
using Content.Shared.Interaction.Components;
|
||||||
using Content.Shared.Projectiles;
|
using Content.Shared.Projectiles;
|
||||||
using Content.Shared.Weapons.Melee;
|
using Content.Shared.Weapons.Melee;
|
||||||
@@ -132,6 +133,27 @@ public sealed partial class GunSystem : SharedGunSystem
|
|||||||
case CartridgeAmmoComponent cartridge:
|
case CartridgeAmmoComponent cartridge:
|
||||||
if (!cartridge.Spent)
|
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)
|
if (cartridge.Count > 1)
|
||||||
{
|
{
|
||||||
var angles = LinearSpread(mapAngle - cartridge.Spread / 2,
|
var angles = LinearSpread(mapAngle - cartridge.Spread / 2,
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
|
using Content.Shared.Damage;
|
||||||
|
using Content.Shared.Tag;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
using Robust.Shared.GameStates;
|
using Robust.Shared.GameStates;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
|
||||||
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
|
||||||
|
|
||||||
namespace Content.Shared.Weapons.Ranged.Components;
|
namespace Content.Shared.Weapons.Ranged.Components;
|
||||||
|
|
||||||
@@ -110,6 +114,18 @@ public partial class GunComponent : Component
|
|||||||
[ViewVariables(VVAccess.ReadWrite), DataField("resetOnHandSelected")]
|
[ViewVariables(VVAccess.ReadWrite), DataField("resetOnHandSelected")]
|
||||||
public bool ResetOnHandSelected = true;
|
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>
|
/// <summary>
|
||||||
/// How fast the projectile moves.
|
/// How fast the projectile moves.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ gun-selected-mode = Selected {$mode}
|
|||||||
gun-disabled = You can't use guns!
|
gun-disabled = You can't use guns!
|
||||||
gun-clumsy = The gun blows up in your face!
|
gun-clumsy = The gun blows up in your face!
|
||||||
gun-set-fire-mode = Set to {$mode}
|
gun-set-fire-mode = Set to {$mode}
|
||||||
|
gun-component-wrong-ammo = Wrong ammo!
|
||||||
|
|
||||||
# SelectiveFire
|
# SelectiveFire
|
||||||
gun-SemiAuto = semi-auto
|
gun-SemiAuto = semi-auto
|
||||||
|
|||||||
@@ -148,4 +148,4 @@
|
|||||||
spread: 45 #deadly if you can get up close... otherwise, good luck doing any kind of real damage
|
spread: 45 #deadly if you can get up close... otherwise, good luck doing any kind of real damage
|
||||||
proto: PelletShotgunImprovised
|
proto: PelletShotgunImprovised
|
||||||
- type: SpentAmmoVisuals
|
- type: SpentAmmoVisuals
|
||||||
state: "improvised"
|
state: "improvised"
|
||||||
|
|||||||
@@ -75,7 +75,7 @@
|
|||||||
id: PelletShotgunImprovised
|
id: PelletShotgunImprovised
|
||||||
name: improvised pellet
|
name: improvised pellet
|
||||||
noSpawn: true
|
noSpawn: true
|
||||||
parent: BaseBullet
|
parent: BaseBullet
|
||||||
components:
|
components:
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
|
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
|
||||||
@@ -135,6 +135,9 @@
|
|||||||
- ItemMask
|
- ItemMask
|
||||||
restitution: 0.3
|
restitution: 0.3
|
||||||
friction: 0.2
|
friction: 0.2
|
||||||
|
- type: Tag
|
||||||
|
tags:
|
||||||
|
- PelletShotgunFlare
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
|
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
|
||||||
state: buckshot-flare
|
state: buckshot-flare
|
||||||
|
|||||||
@@ -17,8 +17,13 @@
|
|||||||
selectedMode: SemiAuto
|
selectedMode: SemiAuto
|
||||||
availableModes:
|
availableModes:
|
||||||
- SemiAuto
|
- SemiAuto
|
||||||
|
compatibleAmmo:
|
||||||
|
- PelletShotgunFlare
|
||||||
soundGunshot:
|
soundGunshot:
|
||||||
path: /Audio/Weapons/Guns/Gunshots/flaregun.ogg
|
path: /Audio/Weapons/Guns/Gunshots/flaregun.ogg
|
||||||
|
damageOnWrongAmmo:
|
||||||
|
types:
|
||||||
|
Blunt: 6.0
|
||||||
- type: BallisticAmmoProvider
|
- type: BallisticAmmoProvider
|
||||||
whitelist:
|
whitelist:
|
||||||
tags:
|
tags:
|
||||||
|
|||||||
@@ -930,6 +930,9 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
id: ShellShotgun
|
id: ShellShotgun
|
||||||
|
|
||||||
|
- type: Tag
|
||||||
|
id: PelletShotgunFlare
|
||||||
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
id: Shiv
|
id: Shiv
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user