From 40eecdd78ac3b76322d8d95a8f4a7ef81b6fb98d Mon Sep 17 00:00:00 2001
From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Date: Wed, 6 Jul 2022 18:06:12 +1000
Subject: [PATCH] Stamina damage (#9230)
---
.../Components/ActiveStaminaComponent.cs | 10 +
.../Damage/Components/StaminaComponent.cs | 47 ++++
.../StaminaDamageOnCollideComponent.cs | 13 ++
.../Components/StaminaDamageOnHitComponent.cs | 8 +
.../Events/StaminaDamageOnHitAttemptEvent.cs | 10 +
.../Damage/Systems/StaminaSystem.cs | 221 ++++++++++++++++++
Content.Server/Flash/FlashSystem.cs | 51 ++--
.../Components/StunbatonComponent.cs | 16 +-
.../{ => Systems}/StunOnCollideSystem.cs | 0
.../Stunnable/{ => Systems}/StunSystem.cs | 0
.../{ => Systems}/StunbatonSystem.cs | 106 +++------
.../Weapon/Ranged/Systems/GunSystem.cs | 5 +
Content.Shared/Alert/AlertCategory.cs | 1 +
Content.Shared/Alert/AlertType.cs | 1 +
Content.Shared/Alert/AlertsSystem.cs | 2 +-
.../StatusEffect/StatusEffectsComponent.cs | 2 +-
.../Weapons/Ranged/HitscanPrototype.cs | 3 +
.../Audio/Weapons/Guns/Gunshots/license.txt | 3 +
.../Audio/Weapons/Guns/Gunshots/taser2.ogg | Bin 0 -> 8189 bytes
Resources/Locale/en-US/damage/stamina.ftl | 1 +
.../components/stunbaton-component.ftl | 4 +-
Resources/Maps/bagel.yml | 17 --
Resources/Maps/marathon.yml | 24 --
Resources/Maps/nss_pillar.yml | 44 ----
Resources/Maps/splitstation.yml | 12 -
Resources/Prototypes/Alerts/alerts.yml | 12 +
.../Catalog/Fills/Boxes/ammunition.yml | 44 ----
.../Catalog/Fills/Boxes/security.yml | 26 ---
.../VendingMachines/Inventories/ammo.yml | 4 -
Resources/Prototypes/Damage/types.yml | 50 ++--
.../Entities/Mobs/Species/human.yml | 1 +
.../Guns/Ammunition/Boxes/caseless_rifle.yml | 15 --
.../Weapons/Guns/Ammunition/Boxes/magnum.yml | 15 --
.../Weapons/Guns/Ammunition/Boxes/pistol.yml | 15 --
.../Weapons/Guns/Ammunition/Boxes/rifle.yml | 15 --
.../Ammunition/Cartridges/caseless_rifle.yml | 8 -
.../Ammunition/Cartridges/light_rifle.yml | 8 -
.../Guns/Ammunition/Cartridges/magnum.yml | 8 -
.../Guns/Ammunition/Cartridges/pistol.yml | 8 -
.../Guns/Ammunition/Cartridges/rifle.yml | 8 -
.../Guns/Ammunition/Cartridges/shotgun.yml | 14 --
.../Ammunition/Magazines/caseless_rifle.yml | 17 --
.../Guns/Ammunition/Magazines/light_rifle.yml | 14 --
.../Guns/Ammunition/Magazines/magnum.yml | 14 --
.../Guns/Ammunition/Magazines/pistol.yml | 28 ---
.../Guns/Ammunition/Magazines/rifle.yml | 14 --
.../Ammunition/Projectiles/caseless_rifle.yml | 11 -
.../Ammunition/Projectiles/light_rifle.yml | 11 -
.../Guns/Ammunition/Projectiles/magnum.yml | 11 -
.../Guns/Ammunition/Projectiles/pistol.yml | 11 -
.../Guns/Ammunition/Projectiles/rifle.yml | 11 -
.../Guns/Ammunition/Projectiles/shotgun.yml | 19 +-
.../Guns/Ammunition/SpeedLoaders/magnum.yml | 20 --
.../Guns/Ammunition/SpeedLoaders/pistol.yml | 19 --
.../Weapons/Guns/Battery/battery_guns.yml | 43 +++-
.../Weapons/Guns/Projectiles/hitscan.yml | 15 --
.../Weapons/Guns/Projectiles/projectiles.yml | 44 +---
.../Objects/Weapons/Throwable/bola.yml | 5 +-
.../Entities/Objects/Weapons/security.yml | 8 +-
.../Prototypes/Recipes/Lathes/security.yml | 11 -
.../Interface/Alerts/stamina.rsi/meta.json | 124 ++++++++++
.../Interface/Alerts/stamina.rsi/stamina0.png | Bin 0 -> 1156 bytes
.../Interface/Alerts/stamina.rsi/stamina1.png | Bin 0 -> 701 bytes
.../Interface/Alerts/stamina.rsi/stamina2.png | Bin 0 -> 1003 bytes
.../Interface/Alerts/stamina.rsi/stamina3.png | Bin 0 -> 912 bytes
.../Interface/Alerts/stamina.rsi/stamina4.png | Bin 0 -> 795 bytes
.../Interface/Alerts/stamina.rsi/stamina5.png | Bin 0 -> 704 bytes
.../Interface/Alerts/stamina.rsi/stamina6.png | Bin 0 -> 1241 bytes
.../Boxes/caseless_rifle.rsi/flash.png | Bin 304 -> 0 bytes
.../Boxes/caseless_rifle.rsi/meta.json | 3 -
.../Ammunition/Boxes/magnum.rsi/flash.png | Bin 136 -> 0 bytes
.../Ammunition/Boxes/magnum.rsi/meta.json | 3 -
.../Ammunition/Boxes/pistol.rsi/flash.png | Bin 312 -> 0 bytes
.../Ammunition/Boxes/pistol.rsi/meta.json | 3 -
.../Guns/Ammunition/Boxes/rifle.rsi/flash.png | Bin 318 -> 0 bytes
.../Guns/Ammunition/Boxes/rifle.rsi/meta.json | 3 -
.../Casings/shotgun_shell.rsi/flash-spent.png | Bin 352 -> 0 bytes
.../Casings/shotgun_shell.rsi/flash.png | Bin 332 -> 0 bytes
.../Casings/shotgun_shell.rsi/meta.json | 6 -
.../caseless_rifle_mag.rsi/flash.png | Bin 358 -> 0 bytes
.../caseless_rifle_mag.rsi/meta.json | 3 -
.../caseless_rifle_mag_short.rsi/flash.png | Bin 369 -> 0 bytes
.../caseless_rifle_mag_short.rsi/meta.json | 3 -
.../LightRifle/light_rifle_mag.rsi/flash.png | Bin 403 -> 0 bytes
.../LightRifle/light_rifle_mag.rsi/meta.json | 3 -
.../Magazine/Magnum/magnum_mag.rsi/flash.png | Bin 404 -> 0 bytes
.../Magazine/Magnum/magnum_mag.rsi/meta.json | 3 -
.../Magazine/Pistol/pistol_mag.rsi/flash.png | Bin 364 -> 0 bytes
.../Magazine/Pistol/pistol_mag.rsi/meta.json | 3 -
.../Magazine/Pistol/smg_mag.rsi/flash.png | Bin 286 -> 0 bytes
.../Magazine/Pistol/smg_mag.rsi/meta.json | 3 -
.../Magazine/Rifle/rifle_mag.rsi/flash.png | Bin 333 -> 0 bytes
.../Magazine/Rifle/rifle_mag.rsi/meta.json | 3 -
.../magnum_speed_loader.rsi/flash-1.png | Bin 2191 -> 0 bytes
.../magnum_speed_loader.rsi/flash-2.png | Bin 2288 -> 0 bytes
.../magnum_speed_loader.rsi/flash-3.png | Bin 2479 -> 0 bytes
.../magnum_speed_loader.rsi/flash-4.png | Bin 2546 -> 0 bytes
.../magnum_speed_loader.rsi/flash-5.png | Bin 2564 -> 0 bytes
.../magnum_speed_loader.rsi/flash-6.png | Bin 2551 -> 0 bytes
.../Magnum/magnum_speed_loader.rsi/meta.json | 18 --
.../pistol_speed_loader.rsi/flash-1.png | Bin 2173 -> 0 bytes
.../pistol_speed_loader.rsi/flash-2.png | Bin 2231 -> 0 bytes
.../pistol_speed_loader.rsi/flash-3.png | Bin 2426 -> 0 bytes
.../pistol_speed_loader.rsi/flash-4.png | Bin 2484 -> 0 bytes
.../pistol_speed_loader.rsi/flash-5.png | Bin 2479 -> 0 bytes
.../pistol_speed_loader.rsi/flash-6.png | Bin 2479 -> 0 bytes
.../Pistol/pistol_speed_loader.rsi/meta.json | 18 --
.../Battery/antiquelasergun.rsi/meta.json | 2 +-
.../Guns/Battery/disabler.rsi/base.png | Bin 0 -> 531 bytes
.../Battery/disabler.rsi/inhand-left-0.png | Bin 0 -> 315 bytes
.../Battery/disabler.rsi/inhand-left-1.png | Bin 0 -> 318 bytes
.../Battery/disabler.rsi/inhand-left-2.png | Bin 0 -> 304 bytes
.../Battery/disabler.rsi/inhand-left-3.png | Bin 0 -> 285 bytes
.../Battery/disabler.rsi/inhand-left-4.png | Bin 0 -> 275 bytes
.../Battery/disabler.rsi/inhand-right-0.png | Bin 0 -> 312 bytes
.../Battery/disabler.rsi/inhand-right-1.png | Bin 0 -> 316 bytes
.../Battery/disabler.rsi/inhand-right-2.png | Bin 0 -> 319 bytes
.../Battery/disabler.rsi/inhand-right-3.png | Bin 0 -> 296 bytes
.../Battery/disabler.rsi/inhand-right-4.png | Bin 0 -> 290 bytes
.../Battery/disabler.rsi/mag-unshaded-0.png | Bin 0 -> 249 bytes
.../Battery/disabler.rsi/mag-unshaded-1.png | Bin 0 -> 5318 bytes
.../Battery/disabler.rsi/mag-unshaded-2.png | Bin 0 -> 5309 bytes
.../Battery/disabler.rsi/mag-unshaded-3.png | Bin 0 -> 5320 bytes
.../Battery/disabler.rsi/mag-unshaded-4.png | Bin 0 -> 5309 bytes
.../Guns/Battery/disabler.rsi/meta.json | 65 ++++++
.../projectiles_tg.rsi/impact_bullet.png | Bin 0 -> 461 bytes
.../projectiles_tg.rsi/impact_laser_blue.png | Bin 0 -> 754 bytes
.../Projectiles/projectiles_tg.rsi/meta.json | 37 +++
.../projectiles_tg.rsi/omnilaser.png | Bin 0 -> 275 bytes
129 files changed, 703 insertions(+), 778 deletions(-)
create mode 100644 Content.Server/Damage/Components/ActiveStaminaComponent.cs
create mode 100644 Content.Server/Damage/Components/StaminaComponent.cs
create mode 100644 Content.Server/Damage/Components/StaminaDamageOnCollideComponent.cs
create mode 100644 Content.Server/Damage/Components/StaminaDamageOnHitComponent.cs
create mode 100644 Content.Server/Damage/Events/StaminaDamageOnHitAttemptEvent.cs
create mode 100644 Content.Server/Damage/Systems/StaminaSystem.cs
rename Content.Server/Stunnable/{ => Systems}/StunOnCollideSystem.cs (100%)
rename Content.Server/Stunnable/{ => Systems}/StunSystem.cs (100%)
rename Content.Server/Stunnable/{ => Systems}/StunbatonSystem.cs (54%)
create mode 100644 Resources/Audio/Weapons/Guns/Gunshots/taser2.ogg
create mode 100644 Resources/Locale/en-US/damage/stamina.ftl
create mode 100644 Resources/Textures/Interface/Alerts/stamina.rsi/meta.json
create mode 100644 Resources/Textures/Interface/Alerts/stamina.rsi/stamina0.png
create mode 100644 Resources/Textures/Interface/Alerts/stamina.rsi/stamina1.png
create mode 100644 Resources/Textures/Interface/Alerts/stamina.rsi/stamina2.png
create mode 100644 Resources/Textures/Interface/Alerts/stamina.rsi/stamina3.png
create mode 100644 Resources/Textures/Interface/Alerts/stamina.rsi/stamina4.png
create mode 100644 Resources/Textures/Interface/Alerts/stamina.rsi/stamina5.png
create mode 100644 Resources/Textures/Interface/Alerts/stamina.rsi/stamina6.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/magnum.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/pistol.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/rifle.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Casings/shotgun_shell.rsi/flash-spent.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Casings/shotgun_shell.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag_short.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/LightRifle/light_rifle_mag.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Magnum/magnum_mag.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/pistol_mag.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/smg_mag.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Rifle/rifle_mag.rsi/flash.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-1.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-2.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-3.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-4.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-5.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-6.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi/flash-1.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi/flash-2.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi/flash-3.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi/flash-4.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi/flash-5.png
delete mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi/flash-6.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/base.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/inhand-left-0.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/inhand-left-1.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/inhand-left-2.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/inhand-left-3.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/inhand-left-4.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/inhand-right-0.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/inhand-right-1.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/inhand-right-2.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/inhand-right-3.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/inhand-right-4.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/mag-unshaded-0.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/mag-unshaded-1.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/mag-unshaded-2.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/mag-unshaded-3.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/mag-unshaded-4.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/meta.json
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/impact_bullet.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/impact_laser_blue.png
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/meta.json
create mode 100644 Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi/omnilaser.png
diff --git a/Content.Server/Damage/Components/ActiveStaminaComponent.cs b/Content.Server/Damage/Components/ActiveStaminaComponent.cs
new file mode 100644
index 0000000000..073d394728
--- /dev/null
+++ b/Content.Server/Damage/Components/ActiveStaminaComponent.cs
@@ -0,0 +1,10 @@
+namespace Content.Server.Damage.Components;
+
+///
+/// Tracks whether an entity has ANY stamina damage for update purposes only.
+///
+[RegisterComponent]
+public sealed class ActiveStaminaComponent : Component
+{
+
+}
diff --git a/Content.Server/Damage/Components/StaminaComponent.cs b/Content.Server/Damage/Components/StaminaComponent.cs
new file mode 100644
index 0000000000..87e881016b
--- /dev/null
+++ b/Content.Server/Damage/Components/StaminaComponent.cs
@@ -0,0 +1,47 @@
+using Content.Server.Damage.Systems;
+using Robust.Shared.GameStates;
+
+namespace Content.Server.Damage.Components;
+
+///
+/// Add to an entity to paralyze it whenever it reaches critical amounts of Stamina DamageType.
+///
+[RegisterComponent]
+public sealed class StaminaComponent : Component
+{
+ ///
+ /// Have we reached peak stamina damage and been paralyzed?
+ ///
+ [ViewVariables(VVAccess.ReadWrite), DataField("critical")]
+ public bool Critical;
+
+ ///
+ /// How much stamina reduces per second.
+ ///
+ [ViewVariables(VVAccess.ReadWrite), DataField("decay")]
+ public float Decay = 3f;
+
+ ///
+ /// How much time after receiving damage until stamina starts decreasing.
+ ///
+ [ViewVariables(VVAccess.ReadWrite), DataField("cooldown")]
+ public float DecayCooldown = 5f;
+
+ ///
+ /// How much stamina damage this entity has taken.
+ ///
+ [ViewVariables(VVAccess.ReadWrite), DataField("staminaDamage")]
+ public float StaminaDamage;
+
+ ///
+ /// How much stamina damage is required to entire stam crit.
+ ///
+ [ViewVariables(VVAccess.ReadWrite), DataField("excess")]
+ public float CritThreshold = 100f;
+
+ ///
+ /// Next time we're allowed to decrease stamina damage. Refreshes whenever the stam damage is changed.
+ ///
+ [ViewVariables(VVAccess.ReadWrite), DataField("decayAccumulator")]
+ public float StaminaDecayAccumulator;
+}
diff --git a/Content.Server/Damage/Components/StaminaDamageOnCollideComponent.cs b/Content.Server/Damage/Components/StaminaDamageOnCollideComponent.cs
new file mode 100644
index 0000000000..450fb56aab
--- /dev/null
+++ b/Content.Server/Damage/Components/StaminaDamageOnCollideComponent.cs
@@ -0,0 +1,13 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Server.Damage.Components;
+
+///
+/// Applies stamina damage when colliding with an entity.
+///
+[RegisterComponent]
+public sealed class StaminaDamageOnCollideComponent : Component
+{
+ [ViewVariables(VVAccess.ReadWrite), DataField("damage")]
+ public float Damage = 55f;
+}
diff --git a/Content.Server/Damage/Components/StaminaDamageOnHitComponent.cs b/Content.Server/Damage/Components/StaminaDamageOnHitComponent.cs
new file mode 100644
index 0000000000..fafe2a366f
--- /dev/null
+++ b/Content.Server/Damage/Components/StaminaDamageOnHitComponent.cs
@@ -0,0 +1,8 @@
+namespace Content.Server.Damage.Components;
+
+[RegisterComponent]
+public sealed class StaminaDamageOnHitComponent : Component
+{
+ [ViewVariables(VVAccess.ReadWrite), DataField("damage")]
+ public float Damage = 30f;
+}
diff --git a/Content.Server/Damage/Events/StaminaDamageOnHitAttemptEvent.cs b/Content.Server/Damage/Events/StaminaDamageOnHitAttemptEvent.cs
new file mode 100644
index 0000000000..40bb1ae1a8
--- /dev/null
+++ b/Content.Server/Damage/Events/StaminaDamageOnHitAttemptEvent.cs
@@ -0,0 +1,10 @@
+namespace Content.Server.Damage.Events;
+
+///
+/// Attempting to apply stamina damage on a melee hit to an entity.
+///
+[ByRefEvent]
+public struct StaminaDamageOnHitAttemptEvent
+{
+ public bool Cancelled;
+}
diff --git a/Content.Server/Damage/Systems/StaminaSystem.cs b/Content.Server/Damage/Systems/StaminaSystem.cs
new file mode 100644
index 0000000000..dc906711e2
--- /dev/null
+++ b/Content.Server/Damage/Systems/StaminaSystem.cs
@@ -0,0 +1,221 @@
+using Content.Server.Damage.Components;
+using Content.Server.Damage.Events;
+using Content.Server.Popups;
+using Content.Server.Weapon.Melee;
+using Content.Shared.Alert;
+using Content.Shared.Rounding;
+using Content.Shared.Stunnable;
+using Robust.Shared.Collections;
+using Robust.Shared.Physics.Dynamics;
+using Robust.Shared.Player;
+using Robust.Shared.Timing;
+
+namespace Content.Server.Damage.Systems;
+
+public sealed class StaminaSystem : EntitySystem
+{
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly AlertsSystem _alerts = default!;
+ [Dependency] private readonly PopupSystem _popup = default!;
+ [Dependency] private readonly SharedStunSystem _stunSystem = default!;
+
+ private const float UpdateCooldown = 2f;
+ private float _accumulator;
+
+ private const string CollideFixture = "projectile";
+
+ ///
+ /// How much of a buffer is there between the stun duration and when stuns can be re-applied.
+ ///
+ private const float StamCritBufferTime = 3f;
+
+ private readonly List _dirtyEntities = new();
+
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent(OnCollide);
+ SubscribeLocalEvent(OnHit);
+ SubscribeLocalEvent(OnStartup);
+ SubscribeLocalEvent(OnShutdown);
+ }
+
+ private void OnShutdown(EntityUid uid, StaminaComponent component, ComponentShutdown args)
+ {
+ SetStaminaAlert(uid);
+ }
+
+ private void OnStartup(EntityUid uid, StaminaComponent component, ComponentStartup args)
+ {
+ SetStaminaAlert(uid, component);
+ }
+
+ private void OnHit(EntityUid uid, StaminaDamageOnHitComponent component, MeleeHitEvent args)
+ {
+ if (component.Damage <= 0f) return;
+
+ var ev = new StaminaDamageOnHitAttemptEvent();
+ RaiseLocalEvent(uid, ref ev);
+
+ if (ev.Cancelled) return;
+
+ var stamQuery = GetEntityQuery();
+ var toHit = new ValueList();
+
+ // Split stamina damage between all eligible targets.
+ foreach (var ent in args.HitEntities)
+ {
+ if (!stamQuery.TryGetComponent(ent, out var stam)) continue;
+ toHit.Add(stam);
+ }
+
+ foreach (var comp in toHit)
+ {
+ var oldDamage = comp.StaminaDamage;
+ TakeStaminaDamage(comp.Owner, component.Damage / toHit.Count, comp);
+ if (comp.StaminaDamage.Equals(oldDamage))
+ {
+ _popup.PopupEntity(Loc.GetString("stamina-resist"), comp.Owner, Filter.Entities(args.User));
+ }
+ }
+ }
+
+ private void OnCollide(EntityUid uid, StaminaDamageOnCollideComponent component, StartCollideEvent args)
+ {
+ if (!args.OurFixture.ID.Equals(CollideFixture)) return;
+
+ TakeStaminaDamage(args.OtherFixture.Body.Owner, component.Damage);
+ }
+
+ private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null)
+ {
+ if (!Resolve(uid, ref component, false) || component.Deleted)
+ {
+ _alerts.ClearAlert(uid, AlertType.Stamina);
+ return;
+ }
+
+ var severity = ContentHelpers.RoundToLevels(MathF.Max(0f, component.CritThreshold - component.StaminaDamage), component.CritThreshold, 7);
+ _alerts.ShowAlert(uid, AlertType.Stamina, (short) severity);
+ }
+
+ public void TakeStaminaDamage(EntityUid uid, float value, StaminaComponent? component = null)
+ {
+ if (!Resolve(uid, ref component, false) || component.Critical) return;
+
+ var oldDamage = component.StaminaDamage;
+ component.StaminaDamage = MathF.Max(0f, component.StaminaDamage + value);
+
+ // Reset the decay cooldown upon taking damage.
+ if (oldDamage < component.StaminaDamage)
+ {
+ component.StaminaDecayAccumulator = component.DecayCooldown;
+ }
+
+ var slowdownThreshold = component.CritThreshold / 2f;
+
+ // If we go above n% then apply slowdown
+ if (oldDamage < slowdownThreshold &&
+ component.StaminaDamage > slowdownThreshold)
+ {
+ _stunSystem.TrySlowdown(uid, TimeSpan.FromSeconds(3), true, 0.8f, 0.8f);
+ }
+
+ SetStaminaAlert(uid, component);
+
+ // Can't do it here as resetting prediction gets cooked.
+ _dirtyEntities.Add(uid);
+
+ if (!component.Critical)
+ {
+ if (component.StaminaDamage >= component.CritThreshold)
+ {
+ EnterStamCrit(uid, component);
+ }
+ }
+ else
+ {
+ if (component.StaminaDamage < component.CritThreshold)
+ {
+ ExitStamCrit(uid, component);
+ }
+ }
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ if (!_timing.IsFirstTimePredicted) return;
+
+ _accumulator -= frameTime;
+
+ if (_accumulator > 0f) return;
+
+ var stamQuery = GetEntityQuery();
+
+ foreach (var uid in _dirtyEntities)
+ {
+ // Don't need to RemComp as they will get handled below.
+ if (!stamQuery.TryGetComponent(uid, out var comp) || comp.StaminaDamage <= 0f) continue;
+ EnsureComp(uid);
+ }
+
+ _dirtyEntities.Clear();
+ _accumulator += UpdateCooldown;
+
+ foreach (var active in EntityQuery())
+ {
+ // Just in case we have active but not stamina we'll check and account for it.
+ if (!stamQuery.TryGetComponent(active.Owner, out var comp) ||
+ comp.StaminaDamage <= 0f)
+ {
+ RemComp(active.Owner);
+ continue;
+ }
+
+ comp.StaminaDecayAccumulator -= UpdateCooldown;
+
+ if (comp.StaminaDecayAccumulator > 0f) continue;
+
+ // We were in crit so come out of it and continue.
+ if (comp.Critical)
+ {
+ ExitStamCrit(active.Owner, comp);
+ continue;
+ }
+
+ comp.StaminaDecayAccumulator = 0f;
+ TakeStaminaDamage(comp.Owner, -comp.Decay * UpdateCooldown, comp);
+ }
+ }
+
+ private void EnterStamCrit(EntityUid uid, StaminaComponent? component = null)
+ {
+ if (!Resolve(uid, ref component) ||
+ component.Critical) return;
+
+ // To make the difference between a stun and a stamcrit clear
+ // TODO: Mask?
+
+ component.Critical = true;
+ component.StaminaDamage = component.CritThreshold;
+ component.StaminaDecayAccumulator = 0f;
+
+ var stunTime = TimeSpan.FromSeconds(6);
+ _stunSystem.TryParalyze(uid, stunTime, true);
+
+ // Give them buffer before being able to be re-stunned
+ component.StaminaDecayAccumulator = (float) stunTime.TotalSeconds + StamCritBufferTime;
+ }
+
+ private void ExitStamCrit(EntityUid uid, StaminaComponent? component = null)
+ {
+ if (!Resolve(uid, ref component) ||
+ !component.Critical) return;
+
+ component.Critical = false;
+ component.StaminaDamage = 0f;
+ SetStaminaAlert(uid, component);
+ }
+}
diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs
index 0e053b02b5..db79e8ab75 100644
--- a/Content.Server/Flash/FlashSystem.cs
+++ b/Content.Server/Flash/FlashSystem.cs
@@ -30,7 +30,6 @@ namespace Content.Server.Flash
{
base.Initialize();
SubscribeLocalEvent(OnFlashMeleeHit);
- SubscribeLocalEvent(OnFlashUseInHand);
SubscribeLocalEvent(OnFlashExamined);
SubscribeLocalEvent(OnInventoryFlashAttempt);
@@ -78,16 +77,6 @@ namespace Content.Server.Flash
}
}
- private void OnFlashUseInHand(EntityUid uid, FlashComponent comp, UseInHandEvent args)
- {
- if (!UseFlash(comp, args.User))
- {
- return;
- }
-
- FlashArea(uid, args.User, comp.Range, comp.AoeFlashDuration, comp.SlowTo, true);
- }
-
private bool UseFlash(FlashComponent comp, EntityUid user)
{
if (comp.HasUses)
@@ -121,39 +110,40 @@ namespace Content.Server.Flash
return false;
}
- public void Flash(EntityUid target, EntityUid? user, EntityUid? used, float flashDuration, float slowTo, bool displayPopup = true)
+ public void Flash(EntityUid target, EntityUid? user, EntityUid? used, float flashDuration, float slowTo, bool displayPopup = true, FlashableComponent? flashable = null)
{
+ if (!Resolve(target, ref flashable, false)) return;
+
var attempt = new FlashAttemptEvent(target, user, used);
RaiseLocalEvent(target, attempt, true);
if (attempt.Cancelled)
return;
- if (EntityManager.TryGetComponent(target, out var flashable))
+ flashable.LastFlash = _gameTiming.CurTime;
+ flashable.Duration = flashDuration / 1000f; // TODO: Make this sane...
+ Dirty(flashable);
+
+ _stunSystem.TrySlowdown(target, TimeSpan.FromSeconds(flashDuration/1000f), true,
+ slowTo, slowTo);
+
+ if (displayPopup && user != null && target != user && EntityManager.EntityExists(user.Value))
{
- flashable.LastFlash = _gameTiming.CurTime;
- flashable.Duration = flashDuration / 1000f; // TODO: Make this sane...
- Dirty(flashable);
-
- _stunSystem.TrySlowdown(target, TimeSpan.FromSeconds(flashDuration/1000f), true,
- slowTo, slowTo);
-
- if (displayPopup && user != null && target != user && EntityManager.EntityExists(user.Value))
- {
- user.Value.PopupMessage(target, Loc.GetString("flash-component-user-blinds-you",
- ("user", user.Value)));
- }
+ user.Value.PopupMessage(target, Loc.GetString("flash-component-user-blinds-you",
+ ("user", user.Value)));
}
}
- public void FlashArea(EntityUid source, EntityUid? user, float range, float duration, float slowTo = 0f, bool displayPopup = false, SoundSpecifier? sound = null)
+ public void FlashArea(EntityUid source, EntityUid? user, float range, float duration, float slowTo = 0.8f, bool displayPopup = false, SoundSpecifier? sound = null)
{
var transform = EntityManager.GetComponent(source);
+ var mapPosition = transform.MapPosition;
var flashableEntities = new List();
+ var flashableQuery = GetEntityQuery();
foreach (var entity in _entityLookup.GetEntitiesInRange(transform.Coordinates, range))
{
- if (!EntityManager.HasComponent(entity))
+ if (!flashableQuery.HasComponent(entity))
continue;
flashableEntities.Add(entity);
@@ -162,14 +152,15 @@ namespace Content.Server.Flash
foreach (var entity in flashableEntities)
{
// Check for unobstructed entities while ignoring the mobs with flashable components.
- if (!_interactionSystem.InRangeUnobstructed(entity, transform.MapPosition, range, CollisionGroup.Opaque, (e) => flashableEntities.Contains(e)))
+ if (!_interactionSystem.InRangeUnobstructed(entity, mapPosition, range, CollisionGroup.Opaque, (e) => flashableEntities.Contains(e)))
continue;
- Flash(entity, user, source, duration, slowTo, displayPopup);
+ // They shouldn't have flash removed in between right?
+ Flash(entity, user, source, duration, slowTo, displayPopup, flashableQuery.GetComponent(entity));
}
if (sound != null)
{
- SoundSystem.Play(sound.GetSound(), Filter.Pvs(transform), transform.Coordinates);
+ SoundSystem.Play(sound.GetSound(), Filter.Pvs(transform), source);
}
}
diff --git a/Content.Server/Stunnable/Components/StunbatonComponent.cs b/Content.Server/Stunnable/Components/StunbatonComponent.cs
index 631af4b0d8..780dae688b 100644
--- a/Content.Server/Stunnable/Components/StunbatonComponent.cs
+++ b/Content.Server/Stunnable/Components/StunbatonComponent.cs
@@ -1,3 +1,4 @@
+using Content.Server.Stunnable.Systems;
using Content.Shared.Sound;
using Content.Shared.Timing;
@@ -8,21 +9,6 @@ namespace Content.Server.Stunnable.Components
{
public bool Activated = false;
- ///
- /// What the is when the stun baton is active.
- ///
- [ViewVariables(VVAccess.ReadWrite), DataField("activeCooldown")]
- public TimeSpan ActiveDelay = TimeSpan.FromSeconds(4);
-
- ///
- /// Store what the was before being activated.
- ///
- public TimeSpan? OldDelay;
-
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("paralyzeTime")]
- public float ParalyzeTime { get; set; } = 5f;
-
[ViewVariables(VVAccess.ReadWrite)]
[DataField("energyPerUse")]
public float EnergyPerUse { get; set; } = 350;
diff --git a/Content.Server/Stunnable/StunOnCollideSystem.cs b/Content.Server/Stunnable/Systems/StunOnCollideSystem.cs
similarity index 100%
rename from Content.Server/Stunnable/StunOnCollideSystem.cs
rename to Content.Server/Stunnable/Systems/StunOnCollideSystem.cs
diff --git a/Content.Server/Stunnable/StunSystem.cs b/Content.Server/Stunnable/Systems/StunSystem.cs
similarity index 100%
rename from Content.Server/Stunnable/StunSystem.cs
rename to Content.Server/Stunnable/Systems/StunSystem.cs
diff --git a/Content.Server/Stunnable/StunbatonSystem.cs b/Content.Server/Stunnable/Systems/StunbatonSystem.cs
similarity index 54%
rename from Content.Server/Stunnable/StunbatonSystem.cs
rename to Content.Server/Stunnable/Systems/StunbatonSystem.cs
index 60f4d30630..2dd6f67469 100644
--- a/Content.Server/Stunnable/StunbatonSystem.cs
+++ b/Content.Server/Stunnable/Systems/StunbatonSystem.cs
@@ -1,10 +1,11 @@
using System.Linq;
+using Content.Server.Damage.Components;
+using Content.Server.Damage.Events;
using Content.Server.Power.Components;
using Content.Server.Power.Events;
using Content.Server.Speech.EntitySystems;
using Content.Server.Stunnable.Components;
using Content.Server.Weapon.Melee;
-using Content.Server.Weapon.Melee.Components;
using Content.Shared.Audio;
using Content.Shared.Examine;
using Content.Shared.Interaction.Events;
@@ -12,55 +13,48 @@ using Content.Shared.Item;
using Content.Shared.Jittering;
using Content.Shared.Popups;
using Content.Shared.StatusEffect;
-using Content.Shared.Stunnable;
using Content.Shared.Throwing;
-using Content.Shared.Timing;
using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Player;
using Robust.Shared.Random;
-using Robust.Shared.Timing;
-namespace Content.Server.Stunnable
+namespace Content.Server.Stunnable.Systems
{
public sealed class StunbatonSystem : EntitySystem
{
- [Dependency] private readonly MeleeWeaponSystem _melee = default!;
- [Dependency] private readonly StunSystem _stunSystem = default!;
- [Dependency] private readonly StutteringSystem _stutteringSystem = default!;
- [Dependency] private readonly SharedJitteringSystem _jitterSystem = default!;
- [Dependency] private readonly UseDelaySystem _useDelay = default!;
- [Dependency] private readonly IGameTiming _timing = default!;
- [Dependency] private readonly IRobustRandom _robustRandom = default!;
-
public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent(OnMeleeHit);
SubscribeLocalEvent(OnUseInHand);
- SubscribeLocalEvent(OnThrowCollide);
SubscribeLocalEvent(OnExamined);
+ SubscribeLocalEvent(OnStaminaHitAttempt);
+ SubscribeLocalEvent(OnMeleeHit);
}
- private void OnMeleeHit(EntityUid uid, StunbatonComponent comp, MeleeHitEvent args)
+ private void OnMeleeHit(EntityUid uid, StunbatonComponent component, MeleeHitEvent args)
{
- if (!comp.Activated || !args.HitEntities.Any() || args.Handled || _useDelay.ActiveDelay(uid))
- return;
+ if (!component.Activated) return;
- if (!TryComp(uid, out var battery) || !battery.TryUseCharge(comp.EnergyPerUse))
- return;
+ // Don't apply damage if it's activated; just do stamina damage.
+ args.BonusDamage -= args.BaseDamage;
+ }
- foreach (var entity in args.HitEntities)
+ private void OnStaminaHitAttempt(EntityUid uid, StunbatonComponent component, ref StaminaDamageOnHitAttemptEvent args)
+ {
+ if (!component.Activated ||
+ !TryComp(uid, out var battery) || !battery.TryUseCharge(component.EnergyPerUse))
{
- StunEntity(entity, comp);
- SendPowerPulse(entity, args.User, uid);
+ args.Cancelled = true;
+ return;
}
- _melee.SetAttackCooldown(uid, _timing.CurTime + comp.ActiveDelay);
- _useDelay.BeginDelay(uid);
- // No combat should occur if we successfully stunned.
- args.Handled = true;
+ if (battery.CurrentCharge < component.EnergyPerUse)
+ {
+ SoundSystem.Play(component.SparksSound.GetSound(), Filter.Pvs(component.Owner, entityManager: EntityManager), uid, AudioHelpers.WithVariation(0.25f));
+ TurnOff(component);
+ }
}
private void OnUseInHand(EntityUid uid, StunbatonComponent comp, UseInHandEvent args)
@@ -75,21 +69,6 @@ namespace Content.Server.Stunnable
}
}
- private void OnThrowCollide(EntityUid uid, StunbatonComponent comp, ThrowDoHitEvent args)
- {
- if (!comp.Activated)
- return;
-
- if (!TryComp(uid, out var battery))
- return;
-
- if (_robustRandom.Prob(comp.OnThrowStunChance) && battery.TryUseCharge(comp.EnergyPerUse))
- {
- SendPowerPulse(args.Target, args.User, uid);
- StunEntity(args.Target, comp);
- }
- }
-
private void OnExamined(EntityUid uid, StunbatonComponent comp, ExaminedEvent args)
{
var msg = comp.Activated
@@ -101,24 +80,6 @@ namespace Content.Server.Stunnable
("charge", (int)((battery.CurrentCharge/battery.MaxCharge) * 100))));
}
- private void StunEntity(EntityUid entity, StunbatonComponent comp)
- {
- if (!EntityManager.TryGetComponent(entity, out StatusEffectsComponent? status) || !comp.Activated) return;
-
- SoundSystem.Play(comp.StunSound.GetSound(), Filter.Pvs(comp.Owner), comp.Owner, AudioHelpers.WithVariation(0.25f));
- _stunSystem.TryParalyze(entity, TimeSpan.FromSeconds(comp.ParalyzeTime), true, status);
-
- var slowdownTime = TimeSpan.FromSeconds(comp.ParalyzeTime);
- _jitterSystem.DoJitter(entity, slowdownTime, true, status:status);
- _stutteringSystem.DoStutter(entity, slowdownTime, true, status);
-
- if (!TryComp(comp.Owner, out var battery) || !(battery.CurrentCharge < comp.EnergyPerUse))
- return;
-
- SoundSystem.Play(comp.SparksSound.GetSound(), Filter.Pvs(comp.Owner), comp.Owner, AudioHelpers.WithVariation(0.25f));
- TurnOff(comp);
- }
-
private void TurnOff(StunbatonComponent comp)
{
if (!comp.Activated)
@@ -135,11 +96,6 @@ namespace Content.Server.Stunnable
SoundSystem.Play(comp.SparksSound.GetSound(), Filter.Pvs(comp.Owner), comp.Owner, AudioHelpers.WithVariation(0.25f));
comp.Activated = false;
- if (TryComp(comp.Owner, out var useDelay) && comp.OldDelay != null)
- {
- useDelay.Delay = comp.OldDelay.Value;
- comp.OldDelay = null;
- }
}
private void TurnOn(StunbatonComponent comp, EntityUid user)
@@ -147,13 +103,6 @@ namespace Content.Server.Stunnable
if (comp.Activated)
return;
- if (EntityManager.TryGetComponent(comp.Owner, out var sprite) &&
- EntityManager.TryGetComponent(comp.Owner, out var item))
- {
- item.EquippedPrefix = "on";
- sprite.LayerSetState(0, "stunbaton_on");
- }
-
var playerFilter = Filter.Pvs(comp.Owner, entityManager: EntityManager);
if (!TryComp(comp.Owner, out var battery) || battery.CurrentCharge < comp.EnergyPerUse)
{
@@ -162,14 +111,15 @@ namespace Content.Server.Stunnable
return;
}
- SoundSystem.Play(comp.SparksSound.GetSound(), playerFilter, comp.Owner, AudioHelpers.WithVariation(0.25f));
-
- comp.Activated = true;
- if (TryComp(comp.Owner, out var useDelay))
+ if (EntityManager.TryGetComponent(comp.Owner, out var sprite) &&
+ EntityManager.TryGetComponent(comp.Owner, out var item))
{
- comp.OldDelay = useDelay.Delay;
- useDelay.Delay = comp.ActiveDelay;
+ item.EquippedPrefix = "on";
+ sprite.LayerSetState(0, "stunbaton_on");
}
+
+ SoundSystem.Play(comp.SparksSound.GetSound(), playerFilter, comp.Owner, AudioHelpers.WithVariation(0.25f));
+ comp.Activated = true;
}
private void SendPowerPulse(EntityUid target, EntityUid? user, EntityUid used)
diff --git a/Content.Server/Weapon/Ranged/Systems/GunSystem.cs b/Content.Server/Weapon/Ranged/Systems/GunSystem.cs
index 3d7cde1f99..8d4405bd7c 100644
--- a/Content.Server/Weapon/Ranged/Systems/GunSystem.cs
+++ b/Content.Server/Weapon/Ranged/Systems/GunSystem.cs
@@ -1,4 +1,5 @@
using System.Linq;
+using Content.Server.Damage.Systems;
using Content.Server.Projectiles.Components;
using Content.Server.Weapon.Melee;
using Content.Server.Weapon.Ranged.Components;
@@ -24,6 +25,7 @@ namespace Content.Server.Weapon.Ranged.Systems;
public sealed partial class GunSystem : SharedGunSystem
{
[Dependency] private readonly EffectSystem _effects = default!;
+ [Dependency] private readonly StaminaSystem _stamina = default!;
public const float DamagePitchVariation = MeleeWeaponSystem.DamagePitchVariation;
@@ -116,6 +118,9 @@ public sealed partial class GunSystem : SharedGunSystem
var distance = result.Distance;
FireEffects(fromCoordinates, distance, entityDirection.ToAngle(), hitscan, result.HitEntity);
+ if (hitscan.StaminaDamage > 0f)
+ _stamina.TakeStaminaDamage(result.HitEntity, hitscan.StaminaDamage);
+
var dmg = hitscan.Damage;
if (dmg != null)
diff --git a/Content.Shared/Alert/AlertCategory.cs b/Content.Shared/Alert/AlertCategory.cs
index db81212271..df310ca469 100644
--- a/Content.Shared/Alert/AlertCategory.cs
+++ b/Content.Shared/Alert/AlertCategory.cs
@@ -10,6 +10,7 @@ public enum AlertCategory
Breathing,
Buckled,
Health,
+ Stamina,
Piloting,
Hunger,
Thirst,
diff --git a/Content.Shared/Alert/AlertType.cs b/Content.Shared/Alert/AlertType.cs
index 2a42b20d6f..c348edca5a 100644
--- a/Content.Shared/Alert/AlertType.cs
+++ b/Content.Shared/Alert/AlertType.cs
@@ -28,6 +28,7 @@
Overhydrated,
Thirsty,
Parched,
+ Stamina,
Pulled,
Pulling,
Magboots,
diff --git a/Content.Shared/Alert/AlertsSystem.cs b/Content.Shared/Alert/AlertsSystem.cs
index b0cfdfd11b..60a609538e 100644
--- a/Content.Shared/Alert/AlertsSystem.cs
+++ b/Content.Shared/Alert/AlertsSystem.cs
@@ -85,7 +85,7 @@ public abstract class AlertsSystem : EntitySystem
AfterShowAlert(alertsComponent);
- alertsComponent.Dirty();
+ Dirty(alertsComponent);
}
else
{
diff --git a/Content.Shared/StatusEffect/StatusEffectsComponent.cs b/Content.Shared/StatusEffect/StatusEffectsComponent.cs
index e412a41d76..c18c89168e 100644
--- a/Content.Shared/StatusEffect/StatusEffectsComponent.cs
+++ b/Content.Shared/StatusEffect/StatusEffectsComponent.cs
@@ -14,7 +14,7 @@ namespace Content.Shared.StatusEffect
///
/// A list of status effect IDs to be allowed
///
- [DataField("allowed", required: true)]
+ [DataField("allowed", required: true), Access(typeof(StatusEffectsSystem), Other = AccessPermissions.ReadExecute)]
public List AllowedEffects = default!;
}
diff --git a/Content.Shared/Weapons/Ranged/HitscanPrototype.cs b/Content.Shared/Weapons/Ranged/HitscanPrototype.cs
index 764b8c3218..2918918162 100644
--- a/Content.Shared/Weapons/Ranged/HitscanPrototype.cs
+++ b/Content.Shared/Weapons/Ranged/HitscanPrototype.cs
@@ -14,6 +14,9 @@ public sealed class HitscanPrototype : IPrototype, IShootable
[IdDataFieldAttribute]
public string ID { get; } = default!;
+ [ViewVariables(VVAccess.ReadWrite), DataField("staminaDamage")]
+ public float StaminaDamage;
+
[ViewVariables(VVAccess.ReadWrite), DataField("damage")]
public DamageSpecifier? Damage;
diff --git a/Resources/Audio/Weapons/Guns/Gunshots/license.txt b/Resources/Audio/Weapons/Guns/Gunshots/license.txt
index acff754062..9b375674fc 100644
--- a/Resources/Audio/Weapons/Guns/Gunshots/license.txt
+++ b/Resources/Audio/Weapons/Guns/Gunshots/license.txt
@@ -1,2 +1,5 @@
atreides.ogg, c-20r.ogg, flaregun.ogg, mateba.ogg, minigun.ogg, mk58.ogg were taken from https://gitlab.com/cmdevs/colonial-warfare/-/tree/32cb5892413243cc74bb2d11df8e3085f8ef1164/sound/weapons
They are licensed under CC-BY-SA 3.0
+
+taser2.ogg was taken from https://github.com/tgstation/tgstation/tree/88d7dbfc105fbf40284d7b7c4587f8d23c0ac3ac
+It is licensed under CC-BY-SA 3.0
\ No newline at end of file
diff --git a/Resources/Audio/Weapons/Guns/Gunshots/taser2.ogg b/Resources/Audio/Weapons/Guns/Gunshots/taser2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..b53f9db5c3d3768ed1f90a66efe284a1d55b6990
GIT binary patch
literal 8189
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
O89ZJ6T-G@yGywpEN>QKy
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Interface/Alerts/stamina.rsi/stamina2.png b/Resources/Textures/Interface/Alerts/stamina.rsi/stamina2.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3d263d7518eae46a91c3f40441e33315930d8a6
GIT binary patch
literal 1003
zcmVJNRCt{2oiUEvFc3u`X1uFB7l>HKA@RD6lwkJ*91~1fSBq6^xwbz`SJ7Dmn0&(epLY`an((@
z>At=G?oyKKTa7*=NX+g6JcIQ=yI-nrwb#J`Vs;gP?)T~b8#q8raRHXyf3_Qz-G6<*
z3<76`2^6zVA|0JGn3_D{HM#FB`!$Ipts)#_pr`xYyZ?sESqov&09Y+|Lj?`&+9za
zUlz!-`!n@zp`ZP9lr@4LU2Lm39<;3Qz6SKn{-V7>=#5wl>w~KUdb+=OXUt)on5wTN
zNBfOW052bl&{+L+X7^3{BZFAqYV>h{7?%Q^-F+?T;{Y+$1-R1vRr)wU%lft%=zf2F@&RJ~
z?0mpl_isDG_5J++{(ie7pI`s5ry$mci;n}C{m1HOw~KU=>Bqj4&%gB=L1H%+aJ-7g;n}EKn(c+u|5tELq0&P
zj|0Sz4-o5<4-o4!g2Ye&G2{cp`Yq%GOswCL4+u>3e1M7dyV~pE05OsC0VdY(Jg$WU
z#6-;p*i7F9`rS-_;4m&Q5%U2i*6%#889g6hV*TN?(@?tqnE#`ce1KR#Qa->|^esK)
z`G0>w%lUv1>qC@$fQj|HqpsgdKEM|GcCvoA(9eE4A|D{uZ!sTWk@f~HkeI5&IJ&+b93Wj#1m?rW8k--6C!si2`g9F5b%?GqX=zKs6
Z`~_$WJe4kONB95$002ovPDHLkV1nv;@n8S|
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Interface/Alerts/stamina.rsi/stamina3.png b/Resources/Textures/Interface/Alerts/stamina.rsi/stamina3.png
new file mode 100644
index 0000000000000000000000000000000000000000..356916dfe0be5242dbfbc5f052a3cf387d778138
GIT binary patch
literal 912
zcmeAS@N?(olHy`uVBq!ia0vp^2|(Py!3HG1+{xJmq&N#aB8wRq_>O=u<5X=vX$A&n
zCr=m0kcv5P=U&Xc?I7Ty@3@Qe4)f>Ku!&LYgqhbJ`o}ff!#d3A029Ydp~~&rePti-
zEl>WydTVZR$tMMSE{{Zpq%+JF|Gs|y^6&Zk?Mh0!?wd4hj`^x|=HB-E_uDsm{Jr|<
zIfu|?+XnZJe|!EW)o-lwD~={e_ns$Um3@wHPZ`&1wYPtvYA6jVcBl^1K)oC@NAf|uI@n5@8j3|
zAI{}Z+R@YPRczm|`Tq5MuLBp4pYPi5^4&xvEa({0Zdidw}&-i`&
zwoVlMqsu8FwQu`}NW;Gk0(HL_lR(Pm*EQVmw|9869B6;Bqw2E)MLjKKI|
z`oH0Wf6OsfwIr~j=f;b_Gq1W~FIy&k>f8P2|MeFDt#p6Ienqri*Sz2xzxF@<`0TGh
zfsl>$yV{Z6bs6ZImq2U3FdwPYdyMHgVCaHe1(NPlFywLY`BCRka%TI&&)w$*em&$6
zO5W9z{QB(#2E)658MfVL2ZrZr`3-mKE+sUxbY#9`-|%+djy;0f7kq>58^mwV|M0ir
z#hZ8RYxd5F);CyrGYy*yhvU^Qb<9q#$Le+7%(^L9K@WyGaG&2FLhNgO?;WW6PU#qJYD@<
J);T3K0RWk*wg&(J
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Interface/Alerts/stamina.rsi/stamina4.png b/Resources/Textures/Interface/Alerts/stamina.rsi/stamina4.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0645f4ebdb3d6fd10cc85985e86e35fd2fdde34
GIT binary patch
literal 795
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
Ba1;Ol
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.rsi/flash.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.rsi/flash.png
deleted file mode 100644
index b50945ba8f785ec2e11a3d7160b712bf72305449..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 304
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ@18D>ArY;~60D08M0%P64IVKn
zuVfSun|5qL{+i+WyKo|k%|pR1OHz<%J=5>afV`!P-lkePt(Mf^(^_!gDZjtz@kI^GEc>8hV*d~d%mEnbP0l+XkK%AP2J
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/magnum.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/magnum.rsi/meta.json
index 5efc1be2a8..a85b6144c4 100644
--- a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/magnum.rsi/meta.json
+++ b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/magnum.rsi/meta.json
@@ -13,9 +13,6 @@
{
"name": "mag-1"
},
- {
- "name": "flash"
- },
{
"name": "hv"
},
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/pistol.rsi/flash.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/pistol.rsi/flash.png
deleted file mode 100644
index 0698be7c2f35c7fdf630812507f74067cf8d7f72..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 312
zcmV-80muG{P)=sA%bi909_g
z`3xDR^uHy`auA>>4OkniFdRL5hiuD7!6+C7qhJ(_f`JDN3=9D8CUB^}bkHdP0000<
KMNUMnLSTa8{en&a
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/pistol.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/pistol.rsi/meta.json
index 5efc1be2a8..a85b6144c4 100644
--- a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/pistol.rsi/meta.json
+++ b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/pistol.rsi/meta.json
@@ -13,9 +13,6 @@
{
"name": "mag-1"
},
- {
- "name": "flash"
- },
{
"name": "hv"
},
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/rifle.rsi/flash.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/rifle.rsi/flash.png
deleted file mode 100644
index 7de6be0c898a68597407f975bcd32e47654af79d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 318
zcmV-E0m1%>P)*-41)Y3Bv}pu6eU7*hmdMHSq^yr
z@ioKx^(%48lVUjtkQ@at!=d?`AuuqUY|F`V04|3hi;aR&FbakaU|?VX07lYu33mqT
Q!2kdN07*qoM6N<$f&~tI8~^|S
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/rifle.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/rifle.rsi/meta.json
index 52a51b7fc7..a92a8ed5d5 100644
--- a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/rifle.rsi/meta.json
+++ b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/rifle.rsi/meta.json
@@ -19,9 +19,6 @@
{
"name": "magb-1"
},
- {
- "name": "flash"
- },
{
"name": "hv"
},
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Casings/shotgun_shell.rsi/flash-spent.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Casings/shotgun_shell.rsi/flash-spent.png
deleted file mode 100644
index 075ef807e62f832ad4cd3b31025e9de710992b40..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 352
zcmV-m0iXVfP)T0{AB{<)8pmjDNA;3eg$hf8Upk
zXRw^Nx`|GJI({^T@eCfr>fL_;Hk(b!)v}6zNKi4HPhgd5A$HrwgCM9DdlOLeYQ9QI
zE}t!(y|e+vdRkuJ{T?vOGB|#~dpgsOYXgK3rIZK2A@Etn0i_i0E#jc@4G1Ah$8qX)
znpkz*w(VB(-^nv54_Jmo)hT;8l(~#Tx^{Ftm!I!1G*O*X8E+l(#iFBiSk57_dbE
y5fnNqT$igy;=Ozn=`FDXeBr
zU!oVFjh|;Qn!?Lm_WlFVG>zeYCGk%MdI>iZSeI6aL)Uno=dw7OfS$?ox}>;UL^kiT
z25hU$JUn&>tm_&spSgY=TgR;d5fiH;zT5CQW;$ZO)ba9!oh}w7@$4>FR0oy7w
z7fH7+iyZ*(D(Mx6J+I&_QPHN#4D8yyO(pw%;$U$Fg76!+0{lhzidzGI5x(M10N)b;
e0T2L#1AYMLA7rLrlI)xS0000Po*L>oB=9ji)C9?z&@bsM7*kxbwp=05KEpPv~ywjQ_>o|#7
zZ;tgz1qGE(#dQl5j(>P?P&w$W+F3?}Zc&jZ22b9s@i|e(aIy2l;oZ**PA5*An5`Mf
zw?I_kB%^`+VJ9Xxd8@KEMLjK$iM;uK3r{eNyxExeaZ)PJL_tND>Fg@447(1VpJ(s9@FXMiJZ_IJCN?&Yxghs!
zbx2BR5b^4swl-N|TZEb=%ZjbIJqt+l)J2{bT2so0wwB%-ng^
z(CEj9cb11)x2#ZD9_Uo0x4=x|Ls0@aL<-m$7|a>6pFQ02ehM)B7(8A5T-G@yGywn|
C=8jDO
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag.rsi/meta.json
index 0da5f470a4..8675d7f4ab 100644
--- a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag.rsi/meta.json
+++ b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag.rsi/meta.json
@@ -10,9 +10,6 @@
{
"name": "base"
},
- {
- "name": "flash"
- },
{
"name": "high_velocity"
},
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag_short.rsi/flash.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag_short.rsi/flash.png
deleted file mode 100644
index 9f1109656ffc674a96ddd66477a92c16952c7331..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 369
zcmV-%0gnEOP)Lf6LrA0t!#nUq*^b)B&RopcDWAh?Q;+SrrG?
P00000NkvXXu0mjfK!KL8
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag_short.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag_short.rsi/meta.json
index 0da5f470a4..8675d7f4ab 100644
--- a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag_short.rsi/meta.json
+++ b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/CaselessRifle/caseless_rifle_mag_short.rsi/meta.json
@@ -10,9 +10,6 @@
{
"name": "base"
},
- {
- "name": "flash"
- },
{
"name": "high_velocity"
},
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/LightRifle/light_rifle_mag.rsi/flash.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/LightRifle/light_rifle_mag.rsi/flash.png
deleted file mode 100644
index 837797e9307e5f40248fac1cccaefef4deacf95c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 403
zcmV;E0c`$>P)dU
zX+T?5l;O*prwq={4rJ*k$pOfrpsgy(psgy3BLDsiE6Hhrh0GIlV+@D
zFt;=yIYE-_fXIjt#%Ir;!7aXe`!!q+mLN%S1X*d|(v`O;79#^v9YK}@kkbM#M-U6h
z&IR}!0V^lI;ix;P;s9KZfbqY*eaQaaqTlnh?HL@$s&L;MP%iJtiHe2c_^e4p-qpUz9u6hqp@pwUNw5nu!u0RUXu9Ezgo_}dpqiDi;_X9H*l
z6+&R*`?#4-0RWpk$M<&2jSYZV0wQXH13;E#Fvb7?s;W9KfY#bG#vlyC=C*avqAU?e
ziHF6aQyOOge;E-qdz&(_0E7@7-zLwSy-gWd0Cnx#RtwSAJnldeMbVLnkYyPrzTecp
zUIDOvM<ZJpABLYs(1E)-D{cl6E0&r=Ak7Ogj-~c~)qj;PiMB#`40000=*N
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Magnum/magnum_mag.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Magnum/magnum_mag.rsi/meta.json
index 542b70c21e..a3bcacb549 100644
--- a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Magnum/magnum_mag.rsi/meta.json
+++ b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Magnum/magnum_mag.rsi/meta.json
@@ -10,9 +10,6 @@
{
"name": "base"
},
- {
- "name": "flash"
- },
{
"name": "high_velocity"
},
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/pistol_mag.rsi/flash.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/pistol_mag.rsi/flash.png
deleted file mode 100644
index dd4541b16bb8179eda2fbdc9f48cad7836eb987b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 364
zcmV-y0h9iTP)t)500su~(3
z6&Ug}8%U~#VSuFC5LaqPPZKn80GF^NUW>@h1&pIzvrz{Ov;zRtU1G9ty!vGT0000<
KMNUMnLSTY7r;l_1
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/pistol_mag.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/pistol_mag.rsi/meta.json
index 542b70c21e..a3bcacb549 100644
--- a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/pistol_mag.rsi/meta.json
+++ b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/pistol_mag.rsi/meta.json
@@ -10,9 +10,6 @@
{
"name": "base"
},
- {
- "name": "flash"
- },
{
"name": "high_velocity"
},
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/smg_mag.rsi/flash.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/smg_mag.rsi/flash.png
deleted file mode 100644
index 53f842161382172fbd31d37e8be41d8cc43a3265..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 286
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJr=Bj3Ar*6yZ3-SR9Clz@#<;ci
z3S;v@Mx7@ar*zl+?AJ5fxxaN{9$x|wT(}V6{_wfjwLj{|1yd{^eEpoxvwpt4v!L+Q
zDN4sRKFKI(X+0O{QOI+AN{d1&@w!{<3IjY;1gZA<*Y^Nok0uS^9zEgDaTZwlTk1
zqbmW#8bu5@cRo1QJDbNm@6Hj82``>8c-n$UI?!)9SxGyjvvy
z{rTy-DUw-^iTNGFrbQ2KoaE+_lDZ#wq@~4GGVN@vN73qx1I`Uud=@2NSloA!L4kBH|4(6n^Q(Y?#;#Tle^b-^(=Yqoxh0adJS@CmRw=Sh1x9D``z&j|x
z%~gjZMT-bYIZq+KC6G5H&ztv`KaTJF}gfym?Nh008x7
zV{d;HCOr3t>(`ejEeLIZ+2!DzT`(1`FIZiC{-jY83O^AS2d=A
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ulH@iB{jXEx2m*wVj)T6ca)TT{PqL?Hx_5T7
znN3xyQnA~Xg)ssiAUe!HeqZ4?9LzC=q*ijxIpRn)Rdzg-cpcYBF`fH4_qtSG$MYi%pWx>5-ol_KKO5~QP!H5b)Is7yYg++nYm{ekTd{Lr7PK)LlJ9Vg-c(P$+?(q1g6)~>d0R~Ch
zCoQ%hRR*wN=|E0E=7%nH)~$OzELO1cAaF847%+Z5!zocb#$*OQx31tXMTKQc}^9i>g!-KajJ_KMt(QKK6*K0s|gdq)jqvo{g6%ZYBxfEXtN
z;3Q*u)9LEPgHzt;Ff;~rGKD>jgS2zin
zENYs4jlB81!%tL>4aTBynZtFd&EVK4@!>JTcA3Y0VLZ`Ls7ZeY;Csl0pMaJQtO%od
zM-R$%V(hPeV$jjlwGyVoxK^fP%YebqV_S?5c$L!IuH|jaHdb$FJ?ot47rSvUR%
zrko1}BoR8gZPq#w0)qf#oreOK9mm|3C+hQh+kB&hX3_e!cAfFX-PCgeDW^H2eu|$t1DBxSNvz
z00D(*LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~N-OGPUVRuFN>&^m|(Q4vR}Vi7Eq
zwnD28CYOFelZGV4#ZhoAIQX$xb#QUk)xlK|1V2EW9Gw(hq{ROvg%&X$9QWhhy~o`<
zz}u)W#ps#<6xGyI@tBa!tqOrx_%VoHL@*{YLrbI=GjJVW_wexbF3Pjq&;2?26NhC*rF?JJVVUz5XQfhOt$Xqp2J`Aln(H)25XTY{NJ4;w8p^1^M3h#Q6ay*R
zkGc4VZGVzn61mD??&J
zfh)D`uQq_$PtxmcEqny@Zvz+CZB5z(E_Z;TCr#8vTk_HL77D=o8GTa@7`O#`)|}p2
z`#607GSt=b4RCM>j20<--R0fgoxS~grq$mMtMGEZ1=0Fx00006VoOIv0RI600RN!9
zr;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|uw&NxY{m&}81SBB@%i;5!?x4%>74}PB(&@DG
zW`6b5PJ)fGknR;%B&Jd-CJ
zm!Xfa@*7TfKj~Y)Jf`6nkBA>L^Jk9`zQxbSC;axFW$$%G*AnumrhEtW5z4v3zz#U&
zyq0kqzKUx*XT@1!ivz4pgxW*wxT(ZId{d%HjW(^*4jOPV@nS>EJb<|O6)~%dE34T1cgp
zmae>Pl~q^U$h9pyZQXg>F1zmbVC`o0m9=-~zRw!ntnner$JvuLbenycAeR$$&cGNa
z0^{ZkAfeegi-l5RXU;i`l_iKM!%KB?COKnZFfC%;^x*Ev+~4vRfbNg-#@}KtICZ~*
zx!}}&V(zcJeS@{xj@-&2$X6jSg+dCJ-%hb{!6$yT4L@t(e?$L0LmRnS8`kthP~6;)W9l;Z-YKfCtr-84cpk$y;yxi1RxQ;PD)%1Vz3|w@Vv8oo~DIiQ(NEg58Bgd
zt&}+{p0<7lOk1&|y25l@P=Gw4C+hdum_Ur`5bLq$;41Tk#EcWR9%=${i4#pqCBKoE
zGd408wke*-u)7T(7ysBE1jx-p(y$+B%UW;L*2rx(f@XIEUjsl;>t%xl7deRH9IG|d
z=h^1gu7&%oaAI-pOYpMpHhi3xZ4iGt@B*0*j8O*w=|pt(RhNgjS6d41tHDm!0`s4anD
zucmGXK1j
zvY@_w2fyPa;vA{%6R*>c{gq@ZH`DwzB?%AZAZx7*{JZjGJb_!yQ}amGx3ic;vpli~
zwN(v&Rva#2BuMxk3Vcw&sDr|ZrVA?IZZW%9Ognj2kpVr-vDv$J?gyL8-`?V~uZ4En
zL+~o~4iuSQi___GHEcb5Sw1$46l-g-XX+@eq!Gh?i^tS^!C3gG%a@~*j~F^a#RZD-Ko=amdg*hy_s*N2y{FER?oFs}3fYenFFlB*n#1a4k6au~>C*an{wrRS*O}
zK%5+%6kVjm|0RVMF&-TEBH7MVq}mGo)uy^TZ)yq1eGv2eXo{5Kj|_WkscYZ`NU%^A=~NQe&-q@)rj4>PnjH
zG)EA}5)w#4fP@;#sK7*&R+SV3DcX;@_=jzOl3WtG%3$PJKotr^+YkN+zq>UGQuoK31oUqM7uRh~+5;|kfT1T%
z)J0qJ(exGy!220}Qw|uo1$x$;-dg)OeE>4l)$$E+a0rYRDSO@J-QAtN{d=a>-w&(s
za=r!8`e^_F00v@9M??Vs0RI60puMM)00009a7bBm001r{001r{0eGc9b^rhX2XskI
zMF->s6$?57Db$Ny0004lNklF-yZh7>3`=;O3Y@6fy*%WNC-47W@eYgn~;p
zD@7b6LY7QfN-2&3yLBmcia)?1rBcXHOADoobSP+{#XsN@7jv{W(o2j6B;OKpNqC;`
zy(D+UaU3LB91^ZnAQeaj{+EEJ8=j^cULpdTZg`4Pf+WfaBf-T9ANEIUV}BxWe|6;D
zolhxzI-4L&5?qKb1K}5!`*`ZU;AFQ!;bD^CSmB=?1;PQKHvqmS!BS+~a_qwaAYaH~
z*dJlFXJ+F<6^!a+#B(Y3EzL2BG*Ml?i9lSRH4&S>>a3+Cz)eMZYHZGDNIBVyj
z5~x>A*mfHL=p0L;jK`fK34$NrI3(8pfMvCyC?zW4mn6!#e#nxj@T~%xZoslybp9n#
zhU<3d_33N^UdX_H%aSPYtpbuLQ@9^JFJ$1lowfI3RU%e_O63%`-Cp~)m-7Xh&08$z
z3wobF7NrQwwp>-q;DyWvNL9-K5E;%a5Etx60_lz@6-Whst3Cjv^UR=)4M~;&0000<
KMNUMnLSTYX;ybAT
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-3.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-3.png
deleted file mode 100644
index e2997462a024a831760e39a8c0ba2c8522bb034d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2479
zcmV;g2~hTlP)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|clH@21{O1&V1YUY@96%7UH`wEE3cIVjYo=#s
zx+h|P#;z)CjD?gbB~)1d{Jq0pIC7~PDv5GqjyP(oEq7dKypF3)v7X;^E5%dK*gd-PFZr_G`PHybYCn^{4wjwEKn5Z^F61
zdERDU!g{)|0x*nVujG(dNhO}&e9cs@Z^xJLn@jS6c;0a@_^oH;6Mo?V-FE$EdXxLEVbf;Q&~#Jx|8
z?2d!*j=H&v%CQ_B2l^
z>H{nIl|5_VhBN2C7zIMozA>ePZwglvpARRtfI&JiD+26sTqXvk*W4DN4?g5^z-T)8RP;Bo8oAY&97H)+~h>m8H!+F`3>d`HK~ql`Le@Q|USjXse+vrd{kW$J9RTef15fM9H5
zYR&pe3#qi~qQy&=uD1F{uI;kxrp;Tn?za1bwVT!VtUWXLW7g8mT0TViIC*6a-6Ah0
zlFJD>XJ9PX1jfY~KtgBdENZGXJ9ExiY`KI|D8ox~ax6JxV6d)~X{QHwugrbOTL8Mh
z%3J;(bHSyzDyZVVCS&SRvBHgs1n($5lt-TL
zybOg}sdQV>c;f2u*W2)e0hm7zmDF_ZJ|ypfa}(%SMybCW{e7$}9|9OQ47&?qzFt>oXCeaPOcwOD5P+Qxc>P
z%nWQGCe}F3!?hD06E}!#fbdzJozPFqsRckQ^RO}FDnPSLOl948bdnKCoQs#(2yfCc7rJ|ID%JFN*g-3mGP1Js9A
zd0@+f@Ug8Rs4mIK9(YAU5fW-s8|;?ORvfR~Ag-|^VL#ddh>Q^!IpnKw^p(NcgCFR!
z8{wlZyorxd3k52byY9$r1Hebb*J(pCdyKNX
z3O)QFHGZb0l{ZmR3&>yO$BB4nLsBUA2PgM)pPamc0T4Vy+z}asSD6T0B4pJ$e2GSx
zjbM8Y{H17XQJl0v*p)SBI%Wl0_>~lu2!=8|LZQ1@k1Gb59zJ3K{B86kFb2X1@5L(B>T$aD6*4e0{P0W9WZ1gf+lg_!r6#
zV5fGSa%TVl0flKpLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ#a~-XMJooi9Y#}X1qLV$!C%Ba9Z
zlvb4#11Z{%x%h`|f0A4hxyoSVSU?pDMB5Mk2fw>D3R9C#QZNSiUo7h*0t9w}X5F&B
zk1eZt0{EVRE4A&fHh|er((7$4d<67w0~gnAP1*x4cYvWMP1HqO^3n7b3c&jreNzq?
zxCMIFoZeddIDG&z)YbA0aBv8W7Abq(<=x$#z5RQp)!z@R@N&Kd(fVls000JJOGiWi
z{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Rf1r-Z9D?m#?@&Et<
zwMj%lR9M69mN7^IQ5eVn?*_L<1ru&K2sr|!+#;d5mJWi0mfJE!nk*!65<)^6ALJ&1
zBm_6r)S#RMH)Irq5OISbg3{F1VuRe_;eqeY3nA`59rq4?zx%%TJsxQ`n^GXX}~;
zH(SC|362#m@FFhX)5HnBwJ~|VJvL_c!@?CX;Q$~>GR`0Nh!Z?_5<^Gp<6xy~gICHW
z;!6w6aZ9EWxcfdLPH?m6{wU;P}PQQ<^^6vJCr6)
z@cpYM@%0>_v<^v
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|cmfJQA{pTvW1Og-oayj7ZobI5@?*%1$;+aX>
zNz%Vcwkc5*9`^zu9M)fd?(hc=PRb#R*3wFeIC9I44Hq?D$2C&S=l2|ZKf?XXe0V-!
zOeKuzx-IKoZq@Jf{8`Q=Mfy1s_5;FlBmLOeIz>zUz?_=P8Qp8)v0dWT7czv55GonO~^x&p`Nq-`=zCy)N%8mjJlR?bO4SbA^Q+aHjKG
z!KwHPuJxP^XN?vISetOQhuCq`h=KT~Op}Z@tuqc9FfsFD#mGE>xX)Dta^nFqC}lrs
zvxd~tOchKFFqbgRPh05dZLSZ>Dl|{RN+t*+=kD7xyr1~l^F`3!9_B=`KCyyb>`?Y0QUN)YT{qrQI%`?@nnrm65t0g$q=Fy=
zSvgBC$hV3RvLH#ah!jz&(!@$CxkxERi`OaBq*+Cas#a}kHPu|Dma4VZR;_VMC}R>@
zY1(RQ%?wH{8)O;Q8zwsU)N_|!y7t;zw}J2(dB`Y3M;&e0js;e#Ah_#(|-m=TqU3c5|WbJ14m9_WG{g^enS>r>LuhTcyFs=F!L0(S8IRj&y
z35=^VfPiM_ELO^yojK<$HclZWVOS|n&Ln3H4CX~Fo1WagG51~G0?_>`Z~Pf^!KwQl
z%mt_J8|FUp_6cj#PPt8oAkRWziVB&Kemh6wickF6G5o54{{{UnL7UX94s<5kvykl6
zMJM)-X7|DtQUCBLhsVXQj^7cawNIo`LKfQ^1*&_-4%Y_)+>m@o4<0X8h9oUzxuw*2
z{IdA7QAX(?^Vsn<==h)cZQ!Tqt!Gywn4d$wm+`WzJ;GoJ#T0(8j8!Lw*XG?|Z0YFe2
z9S4cuj^X{pKaDyT$_4NxP(f{rELdK4(B9BQz~%ko^6^+Nj~9%Qk=??wV@0u?3~%xw
z6EH~bvxT`OF*dj*YO9tmrLzHs5utH)8FQ^^v#h>M>#ogFj#rtJ69BMMQwd7F+`(WC
z2E!OzDZfUtwEj;a5`GjLeQAO9h`?S)#$GbEvmvOaf&eXLLUVF{tp`A{DdsC9cK=2@P&+^{$*;;4{J4aY}znG1`d9EpKfc2T@h7u;+ENfPJo0u{7M
zbBo-VX7IZfnXT>_R6W*E?xm~rTvWB7^IyC?&HtcifX?QCH
z|9Ygu0kA^M9zL)$<-q7A?4WC&-tNpOK45o5C9>6lbTfoNN8}~;fTJaDXWy%8?={1d%HbdxR7x9ouk+SuQnk2R#H
zg<^AT%wNcz@bLj`LIzQtBOZL+^9@36RGB0
zGE!jgs(VnH2uaAgqbb>X_=cVVtqdB6nOEqDC_scg`;-l22wIyp;4G3%E0Vi!Zy}ne
z^D%fv^fey{4gZ$;Q$BXi^D5_{JP#DIkz!O2%mUt~&>B&Vf{G
zBnEEr4+jKI{J})40)IUTd&n9$BIoi%oWOgq`>FE2`
z2&B^O*5^CMXJd%J$)x`U{g;9ijXTP8_#23^YR6l+1AqVk0flKpLr_UWLm+T+Z)Rz1
zWdHzpoPCi!NW(xJ#a~-XMJooi9Y#}X1qLV$!C%Ba9Zlvb4#11Z{%x%h`|f0A4hxyoSVSU?pD
zMB5Mk2fw>D3R9C#QZNSiUo7h*0t9w}X5F&Bk1eZt0{EVRE4A&fHh|er((7$4d<67w
z0~gnAP1*x4cYvWMP1HqO^3n7b3c&jreNzq?xCMIFoZeddIDG&z)YbA0aBv8W7Abq(
z<=x$#z5RQp)!z@R@N&Kd(fVls000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{
zBLR4&KXw2B00(qQO+^Rf1r-Z97jGmybpQYX+(|@1R9M69mN7^hQ5=WA7m8cQ1fp=m
zfyf~!)j=qTofV`9g@8*6Vg+?n5y7Pa32o?5^q`8+CEz~e4&fcS8tTg#3CR7IgS&(81GHKS??-vY&zH_mMDh6@L{_;UhKl|;xdyra7bfabF?4_wy_
zbj`rBGR~6-l*9M8t^jB}UvS|7L!*NXjSea$p)4>yHB%A3eNg&7*}CPz0d{h`N}UL)
z!gbBy({Z<`1b_Xi^j!XU%i{bJJGouA7mrRr!U0S(#`KRqQ3>8Z@t(`vPiA{JJf%z}
z6QU+dAh%n4XB%rbA4Da%Oy}Lp1tqwWKq{GV8(u!Y8%oRZFI=Xh0#{BTl}upUtDZeC
zJF))x`#t#EFIiF3bHK7Pm}bnCkfUn`6Te!-+*f~afEOwSlbH
zb^*b`sZ%Zd!34_TGWu{dLO#Fg=|wmi!T#GK{G6))6&M*Az_wRC+v>VdB%S`ob)o3~
zC*S!Qp>i#c$A<|=Blke@_%MKPxUxX4V2=_A?u3CrAn;Uk2W`LRA04Eny#N3J07*qo
IM6N<$f*#|*0ssI2
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-5.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-5.png
deleted file mode 100644
index c7b19398d1eed7912378f619414d452fcab98020..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2564
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
aR^0(;Df#HR0l_5z0000w
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-6.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi/flash-6.png
deleted file mode 100644
index c5c22638d84c8b34d80fe01c47f7546525af5799..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2551
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
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi/flash-2.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi/flash-2.png
deleted file mode 100644
index 87c172f616a7cd96d45978c50a9e647619e24da4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2231
zcmV;o2uSydP)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|clH@21{O1&V1Oy0);|K&1dxJgxCfHTo)jf~c
zo{9Y$yQ;8dtVgCKs4)NedxgJnq*OH&7Okz;h@-U9lHo$*bzCFGa(>T|?nk(Pk%#Al
z1X0GAuiHBB`35<^y&&b5_g8t4aqH1r5ycnNd0XDsemi+9%IT8ReIMHWg4K87+}|{A
zwU4kq+!p~D&d`@rNHbH8=QmxJ^7S=*8NVsho`~m`%aNyCKI0dj(0v2I=hX-N;={B2
z2FIo75mxBS>TPs{1ON25fE?~ix*t>wDbyrQ#G1K_H6P>)c~6()AT
zna^t#r{K%DmUA|o8Z8d6<_NWi*m2V+0r5qJoQxLDGY%SXv80&{Cb9ug0G%0iq_g`P89Wt75qv&
zzu?AZZvSEy2%&Xj$_HNx*APD*o7fBn`M|6Q&|<$-bf&l5%7^D1IbdpuSG|zanBzfv!fH-h+c$rGh7365zw(*Y8nVUFWVzd_!!MSDu
zH7y&+Duqi$y(v=20%tDFTv=GTvDI8lcqKo3(U^+VkX%HHbwXDrmP8-kgE4
zR0xdAW&jDDHfK?(l(d=KoW+)M$e9zoV5}vVN>^xxzD_PgEhC)Zu22%S0OM(hs-FyRiY)uCw_GdzpCJmqCbj$o1)b`pq>hL
zODxt{$XSM!HhoLRbY7)6%ABzh6nr$E*DZb;!}lKiV1#|^Q=3)n;vNQ$qK*o+DTdPY
z#;A24Qw__Gn=kH+cX=A)3e~)u1^1@nl3RE0Z0>c1?rSuu*uqTeXaQK92TX`o%k1
z;CL5$9+qI>y<=!h7Q?};JzV_4xS@odfK?9-RrPo1)v+fq2mGW(wBH9Hz#xxynTHwJ3Pi)k2od-ok?1;Nc&oaR9+
zyh3&(hRxE?FvF)rU04_noeI{zkN{^qU>hN_4Sa9|0_eM-_n5&Jgm~;#Bky7F?5a6L
z0BOG<14~SwqxwWntjTM|vZMyB30pm6FwzC#HyE3#_R(HY!x}}W7-p#*EMqOi%Hsu_
z$*mstgWAqRW`!xinloGNG{LITHfug7okD@Pb$V0%cCm#2hD{$xam&<|#yUw#Ja@+T
zKuLB{Zgg}!l1UASjOe^y9o7-!+)H=^uY`rtr30-s2$^D}9XSYCC_fFw^FS*n=Jvv3Eok*e*LA*m3o)yB+kD
z41Wpob+=X3IWZOfA-z$e*t?t%kViXwgBG@|f@-=V!REnn*Xvv0UET%qc?`dj&AW@C
zmPC-R0j0=|b`2?#$IDIpB`jn
z%xy6l8pIt|`-!IT>nqwHMgOCsys*!0;a^lOVM$s?x<3E_0flKpLr_UWLm+T+Z)Rz1
zWdHzpoPCi!NW(xJ#a~-XMJooi9Y#}X1qLV$!C%Ba9Zlvb4#11Z{%x%h`|f0A4hxyoSVSU?pD
zMB5Mk2fw>D3R9C#QZNSiUo7h*0t9w}X5F&Bk1eZt0{EVRE4A&fHh|er((7$4d<67w
z0~gnAP1*x4cYvWMP1HqO^3n7b3c&jreNzq?xCMIFoZeddIDG&z)YbA0aBv8W7Abq(
z<=x$#z5RQp)!z@R@N&Kd(fVls000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{
zBLR4&KXw2B00(qQO+^Rf1r-Y@8QVoNVgLXEaY;l$R9M69mN83&PyomO&!Mf+0|^`?
zI9zII?Vyj45C|=9T^!L61};u664EHtc8heAeSij!i@>3xAZ~LwsDnHD0xh=WL+^sr
zd*Sl_i}0TK`@R2Dc_fM=G#LR6hYN54F2Dtt37D3hnwFh5B4Ao}s%bhDSw&R|fffAa
z@wG602lbLd;>HHz4VZ2B2WMT002ovPDHLk
FV1g=&BMtxn
diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi/flash-3.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi/flash-3.png
deleted file mode 100644
index 45dc0a2735a640b23942f20153b2bf332053ae88..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2426
zcmV-=35E8FP)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|umh7eu{Ld=h5&$72mLtB-$qusol(46Jx-&P)
zog_crIkCr$jj@obq=E_S*I#z{AC62}Lt)X{YK=HbD=iytG+xKmrdZDJIr9Aq&oBMq
z@gk#((9-o-*FE0Q&(9B}-2MHvKghW4=xr#)m#N8T_WOA|c^jg9^{4wewEF|ApTfDX
zJZ`feVZA*U0T`2Ek8;S162V`!Q}Tg$Z&dF7{CoVu1G+B&eB8a^7e73s
zCmffdkFe?+PIrIew|;s|lV3ba`7v|;?9tv);^*TNetS>ddtK34sR3}+JE)IP(q&|J
zz)9z`ic@eg?&X{fr$&ndtWAX4L+p5HDFgAHN}9>iPV2NI4Y*kH%7QlM0mQveNpi~r
zpeMkOGwm#a8ckBLGQb?6J3o9$XWr)XVKT+cGht*-Fb0la&+y*y-SfrJ-k#AX
zK!mv&&Ljc@u_oeFQAXPdUt
zLMpAYc-19KS6jA`Ynyi2yz7>&yKQ^0cC-4*+B
z1*h(xU@kaypP2hSZ(p!B?Z_=1g1icWDHM`We!E1=iof{XHvC-!{~7xKH?)(O>A;>S
z@z^ZZ7}d8Sk4x&tUTmz%yOde$g!C51Uw*X}{sCuR4edN2ZKGDAWpnhk=GwAMxMFiQ
z{mG_{$|zsr&aAzle8!N~`Z#K?!6vNpeQk_`(l)R240$Sw{7#1V&eh&{p`y~8c2
zp+OLHuXB^kv8BhZx?M^0tU#h1B-prgDC=eljCI@N6ht<3R@w_YHY_TA!ISApj`^e+
z1MpTC;O4O~Q=Lc#m~HYhh#UBCQ*1$HePH;1cVT>H=~XF4&XP(ssx-ER}zO{x4fP
zIia=BJ3oMwmQ#^FOTpSCAx($O6ZmWqrw8e{d2C4FuAp!+KzwP<)$SYnN
zP5A1?Q=WvTXDKqXfx9|Na{zq0O7W0_+`@tljPNfIQesoKiAA)@z`Ebps89ojAn^9x
zYuVUD)Qlx|ZU^DY)J_hR#gkG2nS$NrY`_AAxwGdEimP6UcM!9<Vl-`
zJb^5;0F^-G{TVsB