From 2849008ba13dbd893eecd3b333668db7f4a9461b Mon Sep 17 00:00:00 2001
From: ScarKy0 <106310278+scarky0@users.noreply.github.com>
Date: Tue, 22 Oct 2024 16:03:42 +0300
Subject: [PATCH] Syringe gun! (#32112)
* Init testing
* copyright
* oops
* Tracking the embed entity uid
* testing stuff for gradual injection
* work
* weh
* god save me
* bleh
* Yippee!
* Again
* Mini syringe ammo
* cleaning up
* mini syringes have a texture for fill amount
* -3 cool points :(
* hitboxes
* init cleanup
* much needed fixes
* Fixes
(cherry picked from commit 62f5a31c4abcaaca09af84f591cbe727e6fcb7cb)
---
.../SolutionInjectOnEmbedComponent.cs | 9 +-
.../SolutionInjectWhileEmbeddedComponent.cs | 46 +++----
.../SolutionInjectOnEventSystem.cs | 16 ++-
.../SolutionInjectWhileEmbeddedSystem.cs | 60 +++++++++
.../Items/BloodSpear/BloodSpearSystem.cs | 2 +-
.../Weapons/Ranged/SyringeGunSystem.cs | 40 ------
.../Chemistry/InjectOverTimeEvent.cs | 13 ++
.../EmbeddableProjectileComponent.cs | 34 ++---
.../Projectiles/SharedProjectileSystem.cs | 11 +-
.../BloodCult/Items/CultItemSystem.cs | 2 +-
.../Weapons/Ranged/SyringeGunComponent.cs | 21 ---
.../catalog/uplink/job_specific.ftl | 3 -
.../objects/weapons/guns/pneumatic_cannon.ftl | 6 -
.../objects/weapons/guns/pneumatic_cannon.ftl | 2 -
.../catalog/uplink/job_specific.ftl | 3 -
.../objects/specific/chemistry/syringes.ftl | 2 -
.../objects/weapons/guns/pneumatic_cannon.ftl | 6 -
.../objects/weapons/guns/pneumatic_cannon.ftl | 2 -
.../Entities/Objects/Specific/chemistry.yml | 123 +++++++++---------
.../Objects/Weapons/Guns/pneumatic_cannon.yml | 2 +-
.../Entities/Structures/Machines/lathe.yml | 2 -
.../Prototypes/Recipes/Lathes/chemistry.yml | 8 --
.../Prototypes/Recipes/Lathes/medical.yml | 11 --
.../Objects/Weapons/Guns/syringe_gun.yml | 101 --------------
.../_White/Catalog/Uplink/job_specific.yml | 18 ---
Resources/Prototypes/_White/tags.yml | 3 -
Resources/Prototypes/tags.yml | 3 +
.../Chemistry/syringe.rsi/syringeproj.png | Bin 257 -> 5589 bytes
.../equipped-BACKPACK.png | Bin 886 -> 0 bytes
.../equipped-SUITSTORAGE.png | Bin 886 -> 0 bytes
.../Cannons/rapid_syringe_gun.rsi/icon.png | Bin 324 -> 0 bytes
.../rapid_syringe_gun.rsi/inhand-left.png | Bin 804 -> 0 bytes
.../rapid_syringe_gun.rsi/inhand-right.png | Bin 801 -> 0 bytes
.../Cannons/rapid_syringe_gun.rsi/meta.json | 30 -----
.../syringe_gun.rsi/equipped-BACKPACK.png | Bin 975 -> 0 bytes
.../syringe_gun.rsi/equipped-SUITSTORAGE.png | Bin 975 -> 0 bytes
.../Cannons/syringe_gun.rsi/icon-dart.png | Bin 287 -> 0 bytes
.../Guns/Cannons/syringe_gun.rsi/icon.png | Bin 288 -> 0 bytes
.../Cannons/syringe_gun.rsi/inhand-left.png | Bin 769 -> 0 bytes
.../Cannons/syringe_gun.rsi/inhand-right.png | Bin 795 -> 0 bytes
.../Guns/Cannons/syringe_gun.rsi/meta.json | 33 -----
41 files changed, 188 insertions(+), 424 deletions(-)
create mode 100644 Content.Server/Chemistry/EntitySystems/SolutionInjectWhileEmbeddedSystem.cs
delete mode 100644 Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs
create mode 100644 Content.Shared/Chemistry/InjectOverTimeEvent.cs
delete mode 100644 Content.Shared/_Goobstation/Weapons/Ranged/SyringeGunComponent.cs
delete mode 100644 Resources/Locale/en-US/ss14-ru/prototypes/_goobstation/entities/objects/weapons/guns/pneumatic_cannon.ftl
delete mode 100644 Resources/Locale/en-US/ss14-ru/prototypes/entities/objects/weapons/guns/pneumatic_cannon.ftl
delete mode 100644 Resources/Locale/ru-RU/_white/prototypes/entities/objects/specific/chemistry/syringes.ftl
delete mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_goobstation/entities/objects/weapons/guns/pneumatic_cannon.ftl
delete mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/weapons/guns/pneumatic_cannon.ftl
delete mode 100644 Resources/Prototypes/_Goobstation/Entities/Objects/Weapons/Guns/syringe_gun.yml
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/equipped-BACKPACK.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/equipped-SUITSTORAGE.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/icon.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/inhand-left.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/inhand-right.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/meta.json
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/equipped-BACKPACK.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/equipped-SUITSTORAGE.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/icon-dart.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/icon.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/inhand-left.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/inhand-right.png
delete mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/meta.json
diff --git a/Content.Server/Chemistry/Components/SolutionInjectOnEmbedComponent.cs b/Content.Server/Chemistry/Components/SolutionInjectOnEmbedComponent.cs
index 3754ab12a2..241da38045 100644
--- a/Content.Server/Chemistry/Components/SolutionInjectOnEmbedComponent.cs
+++ b/Content.Server/Chemistry/Components/SolutionInjectOnEmbedComponent.cs
@@ -5,11 +5,4 @@ namespace Content.Server.Chemistry.Components;
/// contained solution into a target when they become embedded in it.
///
[RegisterComponent]
-public sealed partial class SolutionInjectOnEmbedComponent : BaseSolutionInjectOnEventComponent
-{
- ///
- /// Used to override the PierceArmor setting when fired from a SyringeGun.
- ///
- [ViewVariables(VVAccess.ReadWrite)]
- public bool? PierceArmorOverride;
-}
+public sealed partial class SolutionInjectOnEmbedComponent : BaseSolutionInjectOnEventComponent { }
diff --git a/Content.Server/Chemistry/Components/SolutionInjectWhileEmbeddedComponent.cs b/Content.Server/Chemistry/Components/SolutionInjectWhileEmbeddedComponent.cs
index aa21b8ec80..bbf7c2a88a 100644
--- a/Content.Server/Chemistry/Components/SolutionInjectWhileEmbeddedComponent.cs
+++ b/Content.Server/Chemistry/Components/SolutionInjectWhileEmbeddedComponent.cs
@@ -1,34 +1,24 @@
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
+
+
namespace Content.Server.Chemistry.Components;
///
-/// Used for embeddable entities that should try to inject their
-/// contained solution into the entity they are embedded in over time.
+/// Used for embeddable entities that should try to inject a
+/// contained solution into a target over time while they are embbeded into.
///
-[RegisterComponent]
-public sealed partial class SolutionInjectWhileEmbeddedComponent : BaseSolutionInjectOnEventComponent
-{
- ///
- /// The interval between injection attempts, in seconds.
- ///
- [DataField]
- public float UpdateInterval = 3.0f;
+[RegisterComponent, AutoGenerateComponentPause]
+public sealed partial class SolutionInjectWhileEmbeddedComponent : BaseSolutionInjectOnEventComponent {
+ ///
+ ///The time at which the injection will happen.
+ ///
+ [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField]
+ public TimeSpan NextUpdate;
- ///
- /// Maximum number of injections that can be performed before the component removes itself.
- /// Null means unlimited.
- ///
- [DataField]
- public int? Injections = 5;
+ ///
+ ///The delay between each injection in seconds.
+ ///
+ [DataField]
+ public TimeSpan UpdateInterval = TimeSpan.FromSeconds(3);
+}
- ///
- /// Used to override the PierceArmor setting when fired from a SyringeGun.
- ///
- [ViewVariables(VVAccess.ReadWrite)]
- public bool? PierceArmorOverride;
-
- ///
- /// Used to speed up injections when fired from a SyringeGun.
- ///
- [ViewVariables(VVAccess.ReadWrite)]
- public float SpeedMultiplier = 1f;
-}
\ No newline at end of file
diff --git a/Content.Server/Chemistry/EntitySystems/SolutionInjectOnEventSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionInjectOnEventSystem.cs
index 07aa5a3774..86f4a3ebd6 100644
--- a/Content.Server/Chemistry/EntitySystems/SolutionInjectOnEventSystem.cs
+++ b/Content.Server/Chemistry/EntitySystems/SolutionInjectOnEventSystem.cs
@@ -2,10 +2,9 @@ using Content.Server._White.Chemistry.Components;
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
using Content.Server.Chemistry.Components;
-using Content.Server.Chemistry.Containers.EntitySystems;
-using Content.Server.Explosion.Components;
using Content.Shared._White.Blocking;
using Content.Shared.Chemistry.EntitySystems;
+using Content.Shared.Chemistry.Events;
using Content.Shared.Inventory;
using Content.Shared.Popups;
using Content.Shared.Projectiles;
@@ -33,11 +32,9 @@ public sealed class SolutionInjectOnCollideSystem : EntitySystem
base.Initialize();
SubscribeLocalEvent(HandleProjectileHit);
SubscribeLocalEvent(HandleEmbed);
- //WWDP edit start
- SubscribeLocalEvent(HandleMeleeHit,
- after: new[] {typeof(MeleeBlockSystem)});
- SubscribeLocalEvent(HandleTrigger);
- //WWDP edit end
+ SubscribeLocalEvent(HandleMeleeHit, after: new[] {typeof(MeleeBlockSystem)}); // WD EDIT
+ SubscribeLocalEvent(OnInjectOverTime);
+ SubscribeLocalEvent(HandleTrigger); // WD EDIT
}
private void HandleProjectileHit(Entity entity, ref ProjectileHitEvent args)
@@ -68,6 +65,11 @@ public sealed class SolutionInjectOnCollideSystem : EntitySystem
TryInjectTargets((entity.Owner, entity.Comp), args.HitEntities, args.User);
}
+ private void OnInjectOverTime(Entity entity, ref InjectOverTimeEvent args)
+ {
+ DoInjection((entity.Owner, entity.Comp), args.EmbeddedIntoUid);
+ }
+
private void DoInjection(Entity injectorEntity, EntityUid target, EntityUid? source = null)
{
TryInjectTargets(injectorEntity, [target], source);
diff --git a/Content.Server/Chemistry/EntitySystems/SolutionInjectWhileEmbeddedSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionInjectWhileEmbeddedSystem.cs
new file mode 100644
index 0000000000..2baeba9da1
--- /dev/null
+++ b/Content.Server/Chemistry/EntitySystems/SolutionInjectWhileEmbeddedSystem.cs
@@ -0,0 +1,60 @@
+using Content.Server.Body.Components;
+using Content.Server.Body.Systems;
+using Content.Server.Chemistry.Components;
+using Content.Shared.Chemistry.EntitySystems;
+using Content.Shared.Chemistry.Events;
+using Content.Shared.Inventory;
+using Content.Shared.Popups;
+using Content.Shared.Projectiles;
+using Content.Shared.Tag;
+using Content.Shared.Weapons.Melee.Events;
+using Robust.Shared.Collections;
+using Robust.Shared.Timing;
+
+namespace Content.Server.Chemistry.EntitySystems;
+
+///
+/// System for handling injecting into an entity while a projectile is embedded.
+///
+public sealed class SolutionInjectWhileEmbeddedSystem : EntitySystem
+{
+ [Dependency] private readonly IGameTiming _gameTiming = default!;
+ [Dependency] private readonly BloodstreamSystem _bloodstream = default!;
+ [Dependency] private readonly InventorySystem _inventory = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
+ [Dependency] private readonly TagSystem _tag = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnMapInit);
+ }
+
+ private void OnMapInit(Entity ent, ref MapInitEvent args)
+ {
+ ent.Comp.NextUpdate = _gameTiming.CurTime + ent.Comp.UpdateInterval;
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ var query = EntityQueryEnumerator();
+ while (query.MoveNext(out var uid, out var injectComponent, out var projectileComponent))
+ {
+ if (_gameTiming.CurTime < injectComponent.NextUpdate)
+ continue;
+
+ injectComponent.NextUpdate += injectComponent.UpdateInterval;
+
+ if(projectileComponent.EmbeddedIntoUid == null)
+ continue;
+
+ var ev = new InjectOverTimeEvent(projectileComponent.EmbeddedIntoUid.Value);
+ RaiseLocalEvent(uid, ref ev);
+
+ }
+ }
+}
diff --git a/Content.Server/WhiteDream/BloodCult/Items/BloodSpear/BloodSpearSystem.cs b/Content.Server/WhiteDream/BloodCult/Items/BloodSpear/BloodSpearSystem.cs
index 7e0f552a36..ec1df38111 100644
--- a/Content.Server/WhiteDream/BloodCult/Items/BloodSpear/BloodSpearSystem.cs
+++ b/Content.Server/WhiteDream/BloodCult/Items/BloodSpear/BloodSpearSystem.cs
@@ -74,7 +74,7 @@ public sealed class BloodSpearSystem : EntitySystem
var cultistCoords = _transform.GetWorldPosition(cultist);
if (TryComp(spearUid, out var embeddableProjectile)
- && embeddableProjectile.Target.HasValue)
+ && embeddableProjectile.EmbeddedIntoUid.HasValue)
_projectile.RemoveEmbed(spearUid.Value, embeddableProjectile);
_transform.AttachToGridOrMap(spearUid.Value, spearXform);
diff --git a/Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs b/Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs
deleted file mode 100644
index a406bb34d2..0000000000
--- a/Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using Content.Server.Chemistry.Components;
-using Content.Shared._Goobstation.Weapons.Ranged;
-using Content.Shared.Weapons.Ranged.Events;
-using Content.Shared.Weapons.Ranged.Systems;
-
-namespace Content.Server._Goobstation.Weapons.Ranged;
-
-///
-/// System for handling projectiles and altering their properties when fired from a Syringe Gun.
-///
-public sealed class SyringeGunSystem : EntitySystem
-{
-
- public override void Initialize()
- {
- SubscribeLocalEvent(OnFire);
- SubscribeLocalEvent(OnShootAttempt);
- }
-
- private void OnShootAttempt(Entity ent, ref AttemptShootEvent args)
- {
- args.ThrowItems = true;
- }
-
- private void OnFire(Entity gun, ref AmmoShotEvent args)
- {
- foreach (var projectile in args.FiredProjectiles)
- {
- if (TryComp(projectile, out SolutionInjectWhileEmbeddedComponent? whileEmbedded))
- {
- whileEmbedded.Injections = null; // uncap the injection maximum
- whileEmbedded.PierceArmorOverride = gun.Comp.PierceArmor;
- whileEmbedded.SpeedMultiplier = gun.Comp.InjectionSpeedMultiplier; // store it in the component to reset it
- whileEmbedded.UpdateInterval /= whileEmbedded.SpeedMultiplier;
- }
- if (TryComp(projectile, out SolutionInjectOnEmbedComponent? onEmbed))
- onEmbed.PierceArmorOverride = gun.Comp.PierceArmor;
- }
- }
-}
\ No newline at end of file
diff --git a/Content.Shared/Chemistry/InjectOverTimeEvent.cs b/Content.Shared/Chemistry/InjectOverTimeEvent.cs
new file mode 100644
index 0000000000..ca5ab4213f
--- /dev/null
+++ b/Content.Shared/Chemistry/InjectOverTimeEvent.cs
@@ -0,0 +1,13 @@
+namespace Content.Shared.Chemistry.Events;
+
+///
+/// Raised directed on an entity when it embeds in another entity.
+///
+[ByRefEvent]
+public readonly record struct InjectOverTimeEvent(EntityUid embeddedIntoUid)
+{
+ ///
+ /// Entity that is embedded in.
+ ///
+ public readonly EntityUid EmbeddedIntoUid = embeddedIntoUid;
+}
diff --git a/Content.Shared/Projectiles/EmbeddableProjectileComponent.cs b/Content.Shared/Projectiles/EmbeddableProjectileComponent.cs
index 048e1ab337..d25feb7a83 100644
--- a/Content.Shared/Projectiles/EmbeddableProjectileComponent.cs
+++ b/Content.Shared/Projectiles/EmbeddableProjectileComponent.cs
@@ -16,64 +16,64 @@ public sealed partial class EmbeddableProjectileComponent : Component
///
/// Minimum speed of the projectile to embed.
///
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
+ [DataField, AutoNetworkedField]
public float MinimumSpeed = 5f;
///
/// Delete the entity on embedded removal?
/// Does nothing if there's no RemovalTime.
///
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
+ [DataField, AutoNetworkedField]
public bool DeleteOnRemove;
///
/// How long it takes to remove the embedded object.
///
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
+ [DataField, AutoNetworkedField]
public float? RemovalTime = 5f;
///
/// Whether this entity will embed when thrown, or only when shot as a projectile.
///
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
+ [DataField, AutoNetworkedField]
public bool EmbedOnThrow = true;
///
/// How far into the entity should we offset (0 is wherever we collided).
///
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
+ [DataField, AutoNetworkedField]
public Vector2 Offset = Vector2.Zero;
///
/// Sound to play after embedding into a hit target.
///
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
+ [DataField, AutoNetworkedField]
public SoundSpecifier? Sound;
///
- /// The entity this embeddable is attached to.
+ /// Uid of the entity the projectile is embed into.
///
- [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
- public EntityUid? Target = null;
-
- ///
- /// The body part of the target this embeddable is attached to.
- ///
- [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
- public TargetBodyPart? TargetBodyPart = null;
+ [DataField, AutoNetworkedField]
+ public EntityUid? EmbeddedIntoUid;
///
/// How much time before this entity automatically falls off? (0 is never)
///
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
+ [DataField, AutoNetworkedField]
public float AutoRemoveDuration = 40f;
///
/// The time when this entity automatically falls off after being attached.
///
- [ViewVariables(VVAccess.ReadWrite), DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField]
+ [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField]
public TimeSpan? AutoRemoveTime = null;
+ ///
+ /// The body part of the target this embeddable is attached to.
+ ///
+ [ViewVariables, AutoNetworkedField]
+ public TargetBodyPart? TargetBodyPart = null;
+
// WD EDIT START
[DataField]
public DamageSpecifier Damage = new();
diff --git a/Content.Shared/Projectiles/SharedProjectileSystem.cs b/Content.Shared/Projectiles/SharedProjectileSystem.cs
index 8aea690f65..bf6e810731 100644
--- a/Content.Shared/Projectiles/SharedProjectileSystem.cs
+++ b/Content.Shared/Projectiles/SharedProjectileSystem.cs
@@ -74,7 +74,7 @@ public abstract partial class SharedProjectileSystem : EntitySystem
if (comp.AutoRemoveTime == null || comp.AutoRemoveTime > curTime)
continue;
- if (comp.Target is { } targetUid)
+ if (comp.EmbeddedIntoUid is { } targetUid)
_popup.PopupClient(Loc.GetString("throwing-embed-falloff", ("item", uid)), targetUid, targetUid);
RemoveEmbed(uid, comp);
@@ -92,7 +92,7 @@ public abstract partial class SharedProjectileSystem : EntitySystem
args.Handled = true;
- if (component.Target is {} targetUid)
+ if (component.EmbeddedIntoUid is {} targetUid)
_popup.PopupClient(Loc.GetString("throwing-embed-remove-alert-owner", ("item", uid), ("other", args.User)),
args.User, targetUid);
@@ -116,7 +116,7 @@ public abstract partial class SharedProjectileSystem : EntitySystem
public void RemoveEmbed(EntityUid uid, EmbeddableProjectileComponent component, EntityUid? remover = null)
{
component.AutoRemoveTime = null;
- component.Target = null;
+ component.EmbeddedIntoUid = null;
component.TargetBodyPart = null;
RemCompDeferred(uid);
@@ -225,14 +225,13 @@ public abstract partial class SharedProjectileSystem : EntitySystem
_audio.PlayPredicted(component.Sound, uid, null);
component.TargetBodyPart = targetPart;
+ component.EmbeddedIntoUid = target;
var ev = new EmbedEvent(user, target, targetPart);
RaiseLocalEvent(uid, ref ev);
if (component.AutoRemoveDuration != 0)
component.AutoRemoveTime = _timing.CurTime + TimeSpan.FromSeconds(component.AutoRemoveDuration);
- component.Target = target;
-
Dirty(uid, component);
return true;
}
@@ -254,7 +253,7 @@ public abstract partial class SharedProjectileSystem : EntitySystem
private void OnExamined(EntityUid uid, EmbeddableProjectileComponent component, ExaminedEvent args)
{
- if (!(component.Target is { } target))
+ if (!(component.EmbeddedIntoUid is { } target))
return;
var targetIdentity = Identity.Entity(target, EntityManager);
diff --git a/Content.Shared/WhiteDream/BloodCult/Items/CultItemSystem.cs b/Content.Shared/WhiteDream/BloodCult/Items/CultItemSystem.cs
index 10348cda82..b4cf76f49a 100644
--- a/Content.Shared/WhiteDream/BloodCult/Items/CultItemSystem.cs
+++ b/Content.Shared/WhiteDream/BloodCult/Items/CultItemSystem.cs
@@ -42,7 +42,7 @@ public sealed class CultItemSystem : EntitySystem
{
if (CanUse(args.User, item) ||
// Allow non-cultists to remove embedded cultist weapons and getting knocked down afterwards on pickup
- (TryComp(item.Owner, out var embeddable) && embeddable.Target != null))
+ (TryComp(item.Owner, out var embeddable) && embeddable.EmbeddedIntoUid != null))
return;
args.Handled = true;
diff --git a/Content.Shared/_Goobstation/Weapons/Ranged/SyringeGunComponent.cs b/Content.Shared/_Goobstation/Weapons/Ranged/SyringeGunComponent.cs
deleted file mode 100644
index b7c4596957..0000000000
--- a/Content.Shared/_Goobstation/Weapons/Ranged/SyringeGunComponent.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-namespace Content.Shared._Goobstation.Weapons.Ranged;
-
-///
-/// Component that allows syringe-firing guns to uncap their injection limit on firing.
-///
-[RegisterComponent]
-public sealed partial class SyringeGunComponent : Component
-{
- ///
- /// Force fired projectiles to (not) pierce armor.
- /// Doesn't apply if null.
- ///
- [DataField]
- public bool? PierceArmor;
-
- ///
- /// Multiplies injection speed for fired syringes with SolutionInjectWhileEmbeddedComponent.
- ///
- [DataField]
- public float InjectionSpeedMultiplier = 1f;
-}
\ No newline at end of file
diff --git a/Resources/Locale/en-US/_white/prototypes/catalog/uplink/job_specific.ftl b/Resources/Locale/en-US/_white/prototypes/catalog/uplink/job_specific.ftl
index b7094f4c66..04d31458d3 100644
--- a/Resources/Locale/en-US/_white/prototypes/catalog/uplink/job_specific.ftl
+++ b/Resources/Locale/en-US/_white/prototypes/catalog/uplink/job_specific.ftl
@@ -1,8 +1,5 @@
uplink-greytide-name = tider's toolbox
uplink-greytide-desc = A classic blue toolbox. Inside are some basic tools, insulated gloves and a gas mask.
-uplink-dart-syringe-gun-name = dart syringe gun
-uplink-dart-syringe-gun-desc = An illegally modified version of the syringe gun that allows projectiles to pierce through armor. Also pierces skin better, resulting in faster injection.
-
uplink-plasma-flood-law-board-name = law board (Plasma Flood)
uplink-plasma-flood-law-board-desc = A dangerous set of laws, that makes the station AI replace the station atmosphere with plasma.
diff --git a/Resources/Locale/en-US/ss14-ru/prototypes/_goobstation/entities/objects/weapons/guns/pneumatic_cannon.ftl b/Resources/Locale/en-US/ss14-ru/prototypes/_goobstation/entities/objects/weapons/guns/pneumatic_cannon.ftl
deleted file mode 100644
index 917513ecea..0000000000
--- a/Resources/Locale/en-US/ss14-ru/prototypes/_goobstation/entities/objects/weapons/guns/pneumatic_cannon.ftl
+++ /dev/null
@@ -1,6 +0,0 @@
-ent-SyringeGun = syringe gun
-ent-SyringeGun-desc = A gun that allows you to fire syringes to slowly inject their contents on a target.
-ent-RapidSyringeGun = rapid syringe gun
-ent-RapidSyringeGun-desc = A finely-tuned syringe gun featuring a faster fire rate and more room for ammo, made for the most experienced medical officers.
-ent-DartSyringeGun = dart syringe gun
-ent-DartSyringeGun-desc = An illegally modified version of the syringe gun that allows projectiles to pierce through armor. Also pierces skin better, resulting in faster injection.
\ No newline at end of file
diff --git a/Resources/Locale/en-US/ss14-ru/prototypes/entities/objects/weapons/guns/pneumatic_cannon.ftl b/Resources/Locale/en-US/ss14-ru/prototypes/entities/objects/weapons/guns/pneumatic_cannon.ftl
deleted file mode 100644
index 69d6a43c8d..0000000000
--- a/Resources/Locale/en-US/ss14-ru/prototypes/entities/objects/weapons/guns/pneumatic_cannon.ftl
+++ /dev/null
@@ -1,2 +0,0 @@
-ent-LauncherSyringe = syringe gun
-ent-LauncherSyringe-desc = Load full of poisoned syringes for optimal fun.
\ No newline at end of file
diff --git a/Resources/Locale/ru-RU/_white/prototypes/catalog/uplink/job_specific.ftl b/Resources/Locale/ru-RU/_white/prototypes/catalog/uplink/job_specific.ftl
index 233bb1f91a..b48d2dfba6 100644
--- a/Resources/Locale/ru-RU/_white/prototypes/catalog/uplink/job_specific.ftl
+++ b/Resources/Locale/ru-RU/_white/prototypes/catalog/uplink/job_specific.ftl
@@ -1,8 +1,5 @@
uplink-greytide-name = Набор грейтайда
uplink-greytide-desc = Старый добрый синий тулбокс. Внутри лежат набор инструментов, изолированные перчатки и противогаз.
-uplink-dart-syringe-gun-name = шприцемёт дартс
-uplink-dart-syringe-gun-desc = Нелегально модифицированная версия шприцемёта, снаряды которого пробивают броню. Также лучше проникает в кожу, что обеспечивает более быструю инъекцию.
-
uplink-plasmaflood-lawboard-name = Набор законов ИИ (Плазмафлуд)
uplink-plasmaflood-lawboard-desc = Опасный набор законов, настраивающий ИИ станции на замену всей атмосферы на плазму.
diff --git a/Resources/Locale/ru-RU/_white/prototypes/entities/objects/specific/chemistry/syringes.ftl b/Resources/Locale/ru-RU/_white/prototypes/entities/objects/specific/chemistry/syringes.ftl
deleted file mode 100644
index a7ac5201d3..0000000000
--- a/Resources/Locale/ru-RU/_white/prototypes/entities/objects/specific/chemistry/syringes.ftl
+++ /dev/null
@@ -1,2 +0,0 @@
-ent-MiniSyringe = мини-шприц
-ent-MiniSyringe-desc = Обычный шприц, переделанный для использования в шприцемёте.
diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_goobstation/entities/objects/weapons/guns/pneumatic_cannon.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_goobstation/entities/objects/weapons/guns/pneumatic_cannon.ftl
deleted file mode 100644
index d1c8e19c0a..0000000000
--- a/Resources/Locale/ru-RU/ss14-ru/prototypes/_goobstation/entities/objects/weapons/guns/pneumatic_cannon.ftl
+++ /dev/null
@@ -1,6 +0,0 @@
-ent-SyringeGun = шприцемёт
-ent-SyringeGun-desc = Пистолет, который позволяет стрелять шприцами для медленного введения их содержимого в цель.
-ent-RapidSyringeGun = ускоренный шприцемёт
-ent-RapidSyringeGun-desc = Точно настроенный шприцемёт с более высокой скорострельностью и большим пространством для боеприпасов, созданный для самых опытных медицинских офицеров.
-ent-DartSyringeGun = шприцемёт синдиката
-ent-DartSyringeGun-desc = Незаконно модифицированная версия шприцемёта, которая позволяет снарядам пробивать броню. Также лучше проникает в кожу, что приводит к более быстрой инъекции.
diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/weapons/guns/pneumatic_cannon.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/weapons/guns/pneumatic_cannon.ftl
deleted file mode 100644
index da23fc2ac1..0000000000
--- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/weapons/guns/pneumatic_cannon.ftl
+++ /dev/null
@@ -1,2 +0,0 @@
-ent-LauncherSyringe = шприцемёт
-ent-LauncherSyringe-desc = Заряжается ядовитыми шприцами для оптимального веселья.
diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml
index 9218ea4b42..d54fddb97c 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml
@@ -435,6 +435,65 @@
tags:
- Syringe
- Trash
+
+- type: entity
+ name: mini syringe
+ parent: Syringe
+ description: A regular syringe, reshaped to fit inside of a gun.
+ id: MiniSyringe
+ components:
+ - type: Sprite
+ sprite: Objects/Specific/Chemistry/syringe.rsi
+ layers:
+ - state: minisyringe1
+ map: ["enum.SolutionContainerLayers.Fill"]
+ visible: false
+ - state: syringeproj
+ - type: SolutionContainerVisuals
+ maxFillLevels: 3
+ fillBaseName: minisyringe
+ inHandsMaxFillLevels: 3
+ inHandsFillBaseName: -fill-
+ - type: EmbeddableProjectile
+ offset: "-0.1,0"
+ minimumSpeed: 3
+ removalTime: 0.25
+ embedOnThrow: false
+ - type: SolutionInjectWhileEmbedded
+ transferAmount: 1
+ solution: injector
+ updateInterval: 2
+ - type: SolutionInjectOnEmbed
+ transferAmount: 2
+ solution: injector
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape: !type:PhysShapeCircle
+ radius: 0.2
+ density: 5
+ mask:
+ - ItemMask
+ restitution: 0.3
+ friction: 0.2
+ projectile:
+ shape:
+ !type:PhysShapeAabb
+ bounds: "-0.1,-0.3,0.1,0.3"
+ hard: false
+ mask:
+ - Impassable
+ - BulletImpassable
+ - type: Projectile
+ deleteOnCollide: false
+ onlyCollideWhenShot: true
+ damage:
+ types:
+ Piercing: 5
+ - type: Tag
+ tags:
+ - Syringe
+ - Trash
- SyringeGunAmmo
- type: entity
@@ -474,7 +533,6 @@
tags:
- Syringe
- Trash
- - SyringeGunAmmo
- type: ReverseEngineering # Delta
difficulty: 4
recipes:
@@ -510,7 +568,6 @@
tags:
- Syringe
- Trash
- - SyringeGunAmmo
- type: ReverseEngineering # Delta
difficulty: 3
recipes:
@@ -588,65 +645,3 @@
storageRemoveSound: /Audio/Effects/pill_remove.ogg
- type: Dumpable
-- type: entity
- name: mini syringe
- parent: Syringe
- description: A regular syringe, reshaped to fit inside of a gun.
- id: MiniSyringe
- components:
- - type: Sprite
- sprite: Objects/Specific/Chemistry/syringe.rsi
- layers:
- - state: minisyringe1
- map: ["enum.SolutionContainerLayers.Fill"]
- visible: false
- - state: syringeproj
- - type: SolutionContainerVisuals
- maxFillLevels: 3
- fillBaseName: minisyringe
- inHandsMaxFillLevels: 3
- inHandsFillBaseName: -fill-
- - type: EmbeddableProjectile
- offset: "-0.1,0"
- minimumSpeed: 3
- removalTime: 0.25
- embedOnThrow: true
- - type: SolutionInjectWhileEmbedded
- transferAmount: 0.5
- solution: injector
- updateInterval: 2
- injections: 10
- pierceArmor: false
- - type: SolutionInjectOnEmbed
- transferAmount: 2
- solution: injector
- pierceArmor: false
- - type: Fixtures
- fixtures:
- fix1:
- shape: !type:PhysShapeCircle
- radius: 0.2
- density: 5
- mask:
- - ItemMask
- restitution: 0.3
- friction: 0.2
- projectile:
- shape:
- !type:PhysShapeAabb
- bounds: "-0.1,-0.3,0.1,0.3"
- hard: false
- mask:
- - Impassable
- - BulletImpassable
- - type: Projectile
- deleteOnCollide: false
- onlyCollideWhenShot: true
- damage:
- types:
- Piercing: 5
- - type: Tag
- tags:
- - Syringe
- - Trash
- - SyringeGunAmmo
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml
index 65237663de..d1664ff2a9 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml
@@ -116,7 +116,7 @@
containers:
storagebase: !type:Container
ents: []
- # - type: Execution # WWDP
+ # - type: Execution - WD EDIT
- type: entity
name: syringe gun
diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
index fb7cb10dd0..688a44febc 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
@@ -458,8 +458,6 @@
- AdvancedRetractor
- VehicleWheelchairFolded # Goobstation
# WD EDIT START
- - MiniSyringe
- - SyringeGun
- Intellicard
# WD EDIT END
- type: EmagLatheRecipes
diff --git a/Resources/Prototypes/Recipes/Lathes/chemistry.yml b/Resources/Prototypes/Recipes/Lathes/chemistry.yml
index 63bacef2ab..c17e42e346 100644
--- a/Resources/Prototypes/Recipes/Lathes/chemistry.yml
+++ b/Resources/Prototypes/Recipes/Lathes/chemistry.yml
@@ -44,14 +44,6 @@
Plastic: 100
Steel: 25
-- type: latheRecipe
- id: MiniSyringe
- result: MiniSyringe
- completetime: 2
- materials:
- Plastic: 75
- Steel: 20
-
- type: latheRecipe
id: DisposableSyringe
result: DisposableSyringe
diff --git a/Resources/Prototypes/Recipes/Lathes/medical.yml b/Resources/Prototypes/Recipes/Lathes/medical.yml
index dc8cdfaf09..27443dce99 100644
--- a/Resources/Prototypes/Recipes/Lathes/medical.yml
+++ b/Resources/Prototypes/Recipes/Lathes/medical.yml
@@ -278,14 +278,3 @@
completetime: 2
materials:
Plastic: 100
-
-- type: latheRecipe
- id: SyringeGun
- result: SyringeGun
- completetime: 5
- materials:
- Steel: 500
- Glass: 500
- Plastic: 500
- Gold: 100
- Plasma: 100
diff --git a/Resources/Prototypes/_Goobstation/Entities/Objects/Weapons/Guns/syringe_gun.yml b/Resources/Prototypes/_Goobstation/Entities/Objects/Weapons/Guns/syringe_gun.yml
deleted file mode 100644
index fc0a2c21cb..0000000000
--- a/Resources/Prototypes/_Goobstation/Entities/Objects/Weapons/Guns/syringe_gun.yml
+++ /dev/null
@@ -1,101 +0,0 @@
-- type: entity
- parent: BaseStorageItem
- id: BaseSyringeGun
- abstract: true
- components:
- - type: Sprite
- sprite: _Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi
- state: icon
- - type: Storage
- maxItemSize: Tiny
- grid:
- - 0,0,0,0
- whitelist:
- tags:
- - SyringeGunAmmo
- - type: Gun
- fireRate: 1
- soundGunshot:
- path: /Audio/Weapons/Guns/Gunshots/syringe_gun.ogg
- soundEmpty:
- path: /Audio/Weapons/Guns/Empty/empty.ogg
- clumsyProof: true
- - type: ContainerAmmoProvider
- container: storagebase
- - type: Item
- size: Normal
- shape:
- - 0,0,3,0
- - type: ContainerContainer
- containers:
- storagebase: !type:Container
- ents: []
- - type: SyringeGun
-
-- type: entity
- parent: [ BaseSyringeGun, BaseGrandTheftContraband ]
- id: SyringeGun
- name: syringe gun
- description: A gun that allows you to fire syringes to slowly inject their contents on a target.
- components:
- - type: Sprite
- sprite: _Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi
- state: icon
- - type: Item
- sprite: _Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi
- - type: Tag
- tags:
- - SyringeGunAmmo
-
-- type: entity
- name: rapid syringe gun
- parent: [ BaseSyringeGun, BaseGrandTheftContraband ]
- id: RapidSyringeGun
- description: A finely-tuned syringe gun featuring a faster fire rate and more room for ammo, made for the most experienced medical officers.
- components:
- - type: Sprite
- sprite: _Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi
- - type: Clothing
- sprite: _Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi
- slots:
- - back
- - suitStorage
- quickEquip: false
- - type: Storage
- grid:
- - 0,0,2,1
- - type: Gun
- fireRate: 2
- - type: SyringeGun
- injectionSpeedMultiplier: 1.5
- - type: Item
- size: Large
- shape:
- - 0,0,3,1
- - type: StealTarget
- stealGroup: RapidSyringeGun
- - type: Tag
- tags:
- - HighRiskItem
-
-- type: entity
- parent: [ BaseSyringeGun, BaseSyndicateContraband ]
- id: DartSyringeGun
- name: dart syringe gun
- description: An illegally modified version of the syringe gun that allows projectiles to pierce through armor. Also pierces skin better, resulting in faster injection.
- components:
- - type: Sprite
- sprite: _Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi
- state: icon-dart
- - type: Item
- sprite: _Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi
- - type: Storage
- grid:
- - 0,0,3,0
- - type: SyringeGun
- pierceArmor: true
- - type: Tag
- tags:
- - SyringeGunAmmo
-
-# TODO: Add the proper dart gun that regenerates every 25s, and draws from a 100u reservoir
diff --git a/Resources/Prototypes/_White/Catalog/Uplink/job_specific.yml b/Resources/Prototypes/_White/Catalog/Uplink/job_specific.yml
index a0dbdd2ce9..7365fe85d0 100644
--- a/Resources/Prototypes/_White/Catalog/Uplink/job_specific.yml
+++ b/Resources/Prototypes/_White/Catalog/Uplink/job_specific.yml
@@ -12,24 +12,6 @@
whitelist:
- Passenger
-- type: listing
- id: UplinkDartSyringeGun
- name: uplink-dart-syringe-gun-name
- description: uplink-dart-syringe-gun-desc
- icon: { sprite: /Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi, state: icon-dart }
- productEntity: DartSyringeGun
- discountCategory: usualDiscounts
- discountDownTo:
- Telecrystal: 1
- cost:
- Telecrystal: 4
- categories:
- - UplinkJob
- conditions:
- - !type:BuyerDepartmentCondition
- whitelist:
- - Medical
-
- type: listing
id: UplinkPlasmaFloodCircuitBoard
name: uplink-plasma-flood-law-board-name
diff --git a/Resources/Prototypes/_White/tags.yml b/Resources/Prototypes/_White/tags.yml
index 7c8f93acb6..d829709c5f 100644
--- a/Resources/Prototypes/_White/tags.yml
+++ b/Resources/Prototypes/_White/tags.yml
@@ -31,9 +31,6 @@
- type: Tag
id: RCDLight
-- type: Tag
- id: SyringeGunAmmo
-
- type: Tag
id: XenomorphItem
diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml
index 17a98d5dda..369697f8d7 100644
--- a/Resources/Prototypes/tags.yml
+++ b/Resources/Prototypes/tags.yml
@@ -1337,6 +1337,9 @@
- type: Tag
id: Syringe
+- type: Tag
+ id: SyringeGunAmmo
+
- type: Tag
id: Spellbook
diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/syringeproj.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/syringeproj.png
index 7819a48c6615c15c509e9d02952b74d9f8439bd8..5faf746ae3aaad62de818aab2cd36a9c0716641c 100644
GIT binary patch
literal 5589
zcmeHKX;f3!77kKo0a0*zC?U`y+ROq)|E6QitJ_yE+TC0_l9A_;V{^d2
zvHInwx12w%s&~&TZqIwPbkc^%N_bw&g3HH>$PaoKcJs2I`=nQXG`iGwOm5uSJHId6
zPRS5Ou4=Pf`&hSA7`9&D+Tw6gIpN5(&U$X<89Uc!n+rx1jBmMy(R(Yi{hWE@{rBG<
zRrSlGEBtNEa~^&{N);8XYGekj-tOh$6#U2TVUw(_gdw#-E5;zz6Zbs2Yd7TA+4+Z@
z=VV9E+Ut`3)gn);lga5Bt-Q_8@^;)4Pj+5-MfBnXc7Id5PkQ0mI_cWpZ=3h+YZfF&
zOQ(iDI$UyU))SYJeoF+MxhShXjMjY2jpcCqhSQl-&EGCCBX<3~S-LU*pgiD3=~T(Y
ztx=cD<16AD>JF65-UnA`mvh~Bx9zO|#J8d*-U_R4a&wrkx(-j5#Hz1-yfNNS9Lqa(r$x(FGw$tL9=TO{rcqjSj`2%SX<6l^ybYTuap>ihYAAMG>b_PwFRudec1RzHKq+)L^4KQSvd-xE#kc6wPRr`dm(^27MA1U*QW|RKUP!n7use6#j)tzz8crr_T1jzqS*sy?=~1=>
zEnRf9;bmQQL)Ss8hi5Evl3PN;3(oCM_YJKzHw2c#6!xBF^P76M*>kcx#>5-!
z&sR?R>9OxcN%=8?i~G7+(d8?om%7fyepzq0=Y2gQo;pQ!F)=+zZrHQwg=4W++Pz~+
zr)aTFb=z4_(Xl&I=0ke5@VsAH!y3Wa=ht@>PHWgYv}<{t
zZU*P$R>#&YlIeGozX-PtgA^y&GN#Cx0Er@Bth@pN)wOq{Uu0|zLU9Wlc@
zKA`oM2liqC*3dRFYaL>N7O!;=c%qz4#Jt@hF^fiW2_KwI@CMRX>Cg
z{$Of%vwPde(w>V`D@wB0WPGQ(*?Od;A?%@L?u!@8j!DPP!d~BlE>19+g
z7_h*80D#J%(YRz9gUsMj&F#UeL^5El*7d6h^rRXgEtO88QB|rz7CL=M@@s!@w9rL@
z%ZnO;>NH6hf`%lcYQ2}aQ*C0B&fI5`4#lTTaVN^;R1lQOv$@SQu_S!J2A5HxRB25X
zINBU3Lk4i#BrMT{ks(wx5mkXebby&Y2(MSlUmwt*{opHq3Iw22slRrboz64kIikjSREdEHX>Zz@HF0nF~H_gp1JRGCwmav0A5x
z)Ch`G0dk5G@W3(}#AC|YWH}E)$t)SfB|~gEgUn%anSLmn#X(@68ATYT1eE|Knn#6G
z$p94#VF9>|L+0?Hkm7DAaaNYg5|JGRQNgY1H;8a5`#i}JrkY?>E#+s
z1aN)#Kc)2qDsFE}&%{v7=)b8}dqwMe5)
z0aYBY4>PFW>i!MDK86`e1Xb%aZwuWV(kF}AMFe8*n*$ddxG$*#7iNE!;Dz)ze)_ZT
zZ}b4D-#d9Hec#LVUaogi;GMwlv+KQF@1(#xf!}A>|4lCY*RR~D8vNg9058;^IiYjF
z%eXZ>eOfU1JwiC(+CF>?c(T)m&ejnKPPO>g;*_RX1}1IvVo8Wihuv@|&wrdN3ZR0i
zCF0<~$e7v(8~yF;XhW^q%fI}@dhtpL6rQ@RrszpXUV_Xa>YBf|h0Cvd7Qq*7fJ?8fk8QeIQ2M)Jc4(9^IAe=))w<2RJ(dOw3tK_-@y6nw
zPWed1PqB|Ky5xl3cWTRDV6}h9?)5R5v6JTT36w`Rw?w0VOItDj3W$dw4w)IeH)vkg
FzX9(%I#2)r
delta 211
zcmV;^04)F2D}e%#BO3q#b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1(OjK7=M;YL_t(o
zNA1)x3dA4~1<=`THl);jVwDW&^f!V@z~!z`%=c<-g*>=vj7gb<|RR0Cp+(u^@EqAv*{8uaeH$_oGh
N002ovPDHLkV1h*+Sk?dl
diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/equipped-BACKPACK.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/equipped-BACKPACK.png
deleted file mode 100644
index 1cb200e678133a7ae98b8029ce8ad63df6ed1b80..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 886
zcmV-+1Bv{JP)Px&FiAu~RCt{2n%_%PVHn51i%Mwt1H#;#yYa?dG^m7iVJi>^ia5NQ6G6S|V%VJ$
zf`m1}LjM9ms2~!%DD=WG7|a;xQqdN)YZp5%8JJKo4W2ISj5FKL&e@JgGT9um`Y&XAX|g%U-rkd8
zOk;iLid3(?y$5nh$eI8Eh()#l02@1NikxPOTq#*vGQxjq~o#Bmsi
zqprRYw{P6dE3CH0h#yBk^S0B1+8Sfl_b#75otRi;3x@~sytcBAfc
zGsqbk92nMpipcrg*jaWiSI>0`USx1!m>SGx?EJcteisQW
zD+*dl&P6aEV(yIY!^J6~bnVHk#C7=~dOhG7^cD=wd(q;*0$6dj7%oV{do_Ll!~Q~@YD5mHiR
ztyDBW5-SJt-3gFVaBc7`UQfSnQ$&fc=*M@8&JYzPU_Tl*)YUiU{4Un&^|~P<^;s-M
zj{s?vSdZ$A)Q8k}p%j$>sQ|q$N1XMQEeTe8D>U5(O*RL~?F6N$63h9VPX;lc3~J}B
zy3I+|ZO(r(T8g_tN;GT|(I%00+HxhJT-odEAn82p`XIWf+EG7^XD*0aD#+DSu%D@c;k-
M07*qoM6N<$f*tUTH2?qr
diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/equipped-SUITSTORAGE.png
deleted file mode 100644
index 1cb200e678133a7ae98b8029ce8ad63df6ed1b80..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 886
zcmV-+1Bv{JP)Px&FiAu~RCt{2n%_%PVHn51i%Mwt1H#;#yYa?dG^m7iVJi>^ia5NQ6G6S|V%VJ$
zf`m1}LjM9ms2~!%DD=WG7|a;xQqdN)YZp5%8JJKo4W2ISj5FKL&e@JgGT9um`Y&XAX|g%U-rkd8
zOk;iLid3(?y$5nh$eI8Eh()#l02@1NikxPOTq#*vGQxjq~o#Bmsi
zqprRYw{P6dE3CH0h#yBk^S0B1+8Sfl_b#75otRi;3x@~sytcBAfc
zGsqbk92nMpipcrg*jaWiSI>0`USx1!m>SGx?EJcteisQW
zD+*dl&P6aEV(yIY!^J6~bnVHk#C7=~dOhG7^cD=wd(q;*0$6dj7%oV{do_Ll!~Q~@YD5mHiR
ztyDBW5-SJt-3gFVaBc7`UQfSnQ$&fc=*M@8&JYzPU_Tl*)YUiU{4Un&^|~P<^;s-M
zj{s?vSdZ$A)Q8k}p%j$>sQ|q$N1XMQEeTe8D>U5(O*RL~?F6N$63h9VPX;lc3~J}B
zy3I+|ZO(r(T8g_tN;GT|(I%00+HxhJT-odEAn82p`XIWf+EG7^XD*0aD#+DSu%D@c;k-
M07*qoM6N<$f*tUTH2?qr
diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/icon.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/icon.png
deleted file mode 100644
index 3da5fb737976407f18262df7e6da7c846c891526..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 324
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|JOX?|Tn`*L
zz{@N6pTWh@$i^=$-pbrAE;>P3Nu!{)=HtsdN6#G<6p&iFX_e*9y}Z`8I`bFHq@-Os
zazH}E>`}POgGhG`+W^JsHV-+#WBR9_ieu;
z-(dwF7RyN*0V&5%|F4g_Eg}`Pa=FLO6an^Y$p(rxcNl8R9_(+@o28sSCqUig6U$l-
z$JlGk7n2%AZ@DhI)WUg{B{N-c^Mlp?PJ4IXO>piqZrSCQix@mz{an^LB{Ts5$PS5v
diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/inhand-left.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/inhand-left.png
deleted file mode 100644
index 96a8016af5fc2f90e963065bfe6e5b8f6131458d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 804
zcmV+<1Ka$GP)Px%-bqA3RCt{2nlWe-VHC&zS40=1rqV(PU0P{_WN9NQ*v6qWjv13~=^!0KhJr&K
znh^@b;@A2zV|WCde)ChQKy
zK0@Ir6)Qywg`;G5EVePwCM5O>6pW?G){@PBq~uvPegfMN5phB6@?wUZE|-yAT2Z
zl53??i(U4`a|rbp_~ETlO&;q(UKzgw(=SPP<@r{_}Tn^7IAX7{}!DI!ZQHq
zPPj^|)s*u4St<+<C10?{iZ;1jo|wCU+6`+7ROwGTE#+te+!g}NXg^?pe^2;OyTG4Ylefg2!xr=unJ{msnoserKNv@TkzD}zq*n*uG7njFRYCY(5
zw=kXQnR&AN)}|U@xp-i}udLm$npnTQ;u(fv7=~dOhG7_nVfq<8zZcp*BP0s%LI~ZM
zFt7%6+math1N6)z3>+f*hq|z8!0D`g^!5vc904VhLzzgJ3EGbIN%XepOgBLEfRlF3
zIJx1N3mDqN^bwi-aUF;(V@EnRd+9c#OF_iRjr?&P-ed|Q+wnc&^7w`H5VdQnXWeK9
z2*Yd>P7~kvm}SC+6tBgI2?NuS)(V-PneQm3A7&9uM~@(@#9J~etfEeXk56@;937t;
i!`9}m`acZAh~Y1Hs-AvjB+1$U0000Px%+et)0RCt{2nm=e7aTLeDmO{zk)FO!3K`2^~LNjQ=N+EcwV{}V~;vjAvbZAAa
zLkk^ChmxgRn$b>TX$T^S34%qaC6K`qgpe+=P&&O1^=D5#lRNe9*R$_4Dfj31-uu1Z
z_jh;i0Sv=148t)0DGu2N$UsS#XzlzMKED^&WE&%cwew?Sb19sB{U+NK>xpk}QN2~C
z_~sVLw#9OEIqwdHNJ*FI*-mX`BGgO7sF#RoIzJ|Y?m&ow8*u=@gY`!Mfai~+wie1G
zA_4$cQbC41DDS-+^Jhu~JDYJyw(S+be9F2Ab
zgBi{P8X6$zcbg8asM%?EXtXN`<_mB}qBCvQ{Uq3ES4O|Zwz8morZcG59GzkTgL=()
z2B`UQ^9F+X0vhegXm>c|b_1@*EtD%`r4fQY2fg<@hGuB2jUFf$O&H(CeSdG*Bb^|~@(l76@8I0Ptj
z?=G^r6yoHe$tNtUn4EFTcPZI#SK{5p9SDuBeZ9<;0cwUbPuW}w0O;qfJC@GEa7oG+
zW7(N7FAHaYKxBf??_Jg{8HQmPhG7_nVHk#Cr>VR&v3J+FQip?6wP^09mE(^0O#YaSRwp%sj-V1e#IwMiakZ1JYj2W72
zbXqoZ7e<_sC=z3_VjHg=r%N3-*cYAr==`A
z2)1%wu&f~1(s?zD1i`LV<|)*U++Tlqr87#pWQvYR#fU?)oL^dhfEGr227G=mUcPuc
f)y>T?jH&zvof?pSapoyH00000NkvXXu0mjfcL{4J
diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/meta.json b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/meta.json
deleted file mode 100644
index 5cda9a7297..0000000000
--- a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/rapid_syringe_gun.rsi/meta.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "version": 1,
- "license": "CC-BY-SA-3.0",
- "copyright": "Taken from /tg/station at https://github.com/tgstation/tgstation/commit/67d7577947b5079408dce1b7646fdd6c3df13bb5, slightly modified by Mocho, backpack and suitstorage states by @ShootsTheMoon, further modified by LuciferMkshelter",
- "size": {
- "x": 32,
- "y": 32
- },
- "states": [
- {
- "name": "icon"
- },
- {
- "name": "inhand-right",
- "directions": 4
- },
- {
- "name": "inhand-left",
- "directions": 4
- },
- {
- "name": "equipped-BACKPACK",
- "directions": 4
- },
- {
- "name": "equipped-SUITSTORAGE",
- "directions": 4
- }
- ]
- }
diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/equipped-BACKPACK.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/equipped-BACKPACK.png
deleted file mode 100644
index 64b30219b44f80d02d2e005c638330004fc92be8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 975
zcmV;=12FuFP)Px&h)G02RCr$PT1{vZK@@%q{sc;t6oMq$OO<%(#irmP?Xg%9il?9m>PfF2lqysy
zD)sl^RZmtBrN=;N@n8>O(
zY&Jbz;3)uYjwnPnn+iXXci|!dh;$HcTo))n&@p-A`YpD#xd|vhr>X>f
zKg{RoHWc7cCIe5NKCp;5_BuZ3T0h&j=j=)VB#*&R0CzRQ5EJPI*HCNA)RK)Ro7)Ym7PhE7ll1
z9^P@tkKCDq^}BOmmp=$`5?YK&vHysCR6XBbIjnr1tvUai92|81o|>G3rHyZJ=I{~W
zeMm?EI)gE3ug`n0HX-XT6-QuoxdgV|dduT^Kj^vz!X}Z?^B7~gc!|y2yaJCNzSu>c
z;v+uM!U#D)7LhP<+R2v|7o_2q7KlidKbBcxv>+|+iP3R3bnGZlt;&+gstI{vlWv+T>~uOPefBt+K$!}POG-!TH{R1Fnaj004tu2W9q
z0G+C#0*i5g3e|PWX&j(aHB?|R4p5=GPC1PObgG65EdQkgXgbU@(dH6BB%q2ax^s%)
zT*ATNJT1u4)+7x
z`%h#7=x{#($-Bq%k!^w`fQtJ8NZczw4N$K_@bx~fV=!5mXk9yV&EB#1Roo9~w|plI
zbbnyXvI6-9F2H170_b%1w_}m-fMn}MXuL3?>|Ow`*f=6TyRzXdm)8P)Ccy0cjB|&8
zXP(H_0yy&K4ai%mUak|tYXsn_govU%@p`>R1TU8Za7K@yWz73~O&;Tm;N=n^3ec)@
x7y(o%uS;Iz09`7f3WsrkD&=*_8+!-*0iToNP;U}$V*mgE07*qoM6N<$f&jL6!cYJJ
diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/equipped-SUITSTORAGE.png
deleted file mode 100644
index 64b30219b44f80d02d2e005c638330004fc92be8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 975
zcmV;=12FuFP)Px&h)G02RCr$PT1{vZK@@%q{sc;t6oMq$OO<%(#irmP?Xg%9il?9m>PfF2lqysy
zD)sl^RZmtBrN=;N@n8>O(
zY&Jbz;3)uYjwnPnn+iXXci|!dh;$HcTo))n&@p-A`YpD#xd|vhr>X>f
zKg{RoHWc7cCIe5NKCp;5_BuZ3T0h&j=j=)VB#*&R0CzRQ5EJPI*HCNA)RK)Ro7)Ym7PhE7ll1
z9^P@tkKCDq^}BOmmp=$`5?YK&vHysCR6XBbIjnr1tvUai92|81o|>G3rHyZJ=I{~W
zeMm?EI)gE3ug`n0HX-XT6-QuoxdgV|dduT^Kj^vz!X}Z?^B7~gc!|y2yaJCNzSu>c
z;v+uM!U#D)7LhP<+R2v|7o_2q7KlidKbBcxv>+|+iP3R3bnGZlt;&+gstI{vlWv+T>~uOPefBt+K$!}POG-!TH{R1Fnaj004tu2W9q
z0G+C#0*i5g3e|PWX&j(aHB?|R4p5=GPC1PObgG65EdQkgXgbU@(dH6BB%q2ax^s%)
zT*ATNJT1u4)+7x
z`%h#7=x{#($-Bq%k!^w`fQtJ8NZczw4N$K_@bx~fV=!5mXk9yV&EB#1Roo9~w|plI
zbbnyXvI6-9F2H170_b%1w_}m-fMn}MXuL3?>|Ow`*f=6TyRzXdm)8P)Ccy0cjB|&8
zXP(H_0yy&K4ai%mUak|tYXsn_govU%@p`>R1TU8Za7K@yWz73~O&;Tm;N=n^3ec)@
x7y(o%uS;Iz09`7f3WsrkD&=*_8+!-*0iToNP;U}$V*mgE07*qoM6N<$f&jL6!cYJJ
diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/icon-dart.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/icon-dart.png
deleted file mode 100644
index 4ba496709508ec781dd4a821f789569444d46521..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 287
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|3<7*YTn`*L
z@Snkjmsilx$i^=$-pbrAE;>P3Nu!{)=HtsdN6#Hyx@py3OY6ltdbYfLX)J=yn@(X78j|vV1bUOp(8a-VcLo9mVPH^NqtiZ!^^475>ickLUe=Eew6m&KEs`oR7
zLvoSXP8C1oPhZz#x*&h4Yihu2fw?)Y>tU=vuv
V-0iKmN&@H@22WQ%mvv4FO#qP*cU%Af
diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/icon.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/icon.png
deleted file mode 100644
index 5ac09c0077c87bd0edb3adca86f817ceaf5e1ff5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 288
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|%mREuTn`*L
z@Snkjmsilx$i^=$-pbrAE;>P3Nu!{)=HtsdN6#G<6p&iFX_e*9y*l$3^IF@=q@-Os
zazJ&P*F>NRLM1_d!3_V=LEOPMJD_Zpr;B5VMep1Gi+rsLJkA?ad7l3Ne?9lk>Wm(L
zwS5&GiCa?7OtHI{va57r!&?XOro5ZSYYwPrwzX(3TJzZ`AU4dNy_Q+z
T;4({4STK0H`njxgN@xNAqcD3a
diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/inhand-left.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/inhand-left.png
deleted file mode 100644
index 3c23139337785203b81b838148213b1e2c394c21..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 769
zcmV+c1OEJpP)Px%yGcYrRCt{2n!Rh=P!z?FO1AQbXHbiVEN)RCXh{_4kYwys$mop8)Hz!_B*tV)
z`yZrR){cRY(Ls*}ipiPM5n8Gk5Ddj+M%7lHyw2#<|5i_O(#PL5NzV8D7Wm$G-u{->H-~pgF
z0AgyP1<;b`87+)fieR4SH$Df^JU+xxEh@g79tp-r0B|k*>gsC5eKW6ld`Ksi3ih(9
z;mj-;kmoss5J-|_C&{APlp*nc=6u;9RdV!CbAK&pm
z!pn%|Rmx9Kru!+-BBGdD08ogJ>J9YgqajBQrz}1Q0#dh^P9}19A8{f6b)^E}`rb8h
z<$@p}Aq0dF#c%C)d*T=qkASwfgx&Q`^!q4=yoq6}3hCwLW$`|7SIx0T`Q2TJ!LPVF
zky26^hQ($p?hRZ{T%?qw>cOzNg?1JeSIG6OO-e~>vmV^Fc;{^GY(HM{48t%C!!QiP
zFbu;m)66*k7dr0|GKKH^7{!DKYrrVI2!N&j0NbQ#>N*8?I9n`H*lKXPFV48@1x9K>
zOf9sCjG0hgk-p8iOY+(cFx}u(KIc&_f>>UiD28?enin1Hu5Y64E$KdWfm)GnUUU%E
z8xxzL9Vw-eHN^5c)xAD-;uX40xJ&%hBZM9kT=gPoV-gb{%!+hb$im{vP%+cci=drx
z1lbaAbuOT~!K-t#L-(!D&Emt}Cv^Px%)k#D_RCt{2nlVq?P!Pxet~x}jJiNhF9`ULNg
z!!QiPFfSBCw*fj>D^;nuyoAM-B3|h>MhC^^CG6~Oqy76_w<)t{y}n7!(m+igdoeZ005?G0sws9&vl|~5fK3RMj6L-7e}8D
zNA!#(K`G_Pcb;kBE{c!qE>6B2jh*xQ{tx|rAN_tGg+gH%1$o9d%Gecc3@*UlVPf
zxDX10!02>3V}H!k?9jC>xO@9BE47I>$GV$B2pX)qSm^Zd)>^>kkADDw_n7|~!mQLt
zHoqm0fG~qq7w+CZy0&%mOabtyHJoDR3CD5Bw(X%^4~Yj7Y=)F4g%AV)U$3tL++?Hn!j!<>c0;j1n)U#O38BfSaj2b4*jvJZvl+
z$07Am(K%CeJ3;MTY}=m70Tb5&ak*Vv)6VWT0MPlLzxa9jeP%h~cJZb^8S9ROX?b!4
zC{!dYt`yT6l3^HzVHk#C7=~dOMjz_En{GR@;L+FO;kw{+BvxG@?^WW5i1kiT^$fgt
zo@*Y6O;q7QH6Ueu?X0eos8KT9K@ukGN^y&bJZfb!_LDkA%}R}q>+bM4i#v3`(J5`F
zc7R!_k-N8#lZ$rdm15s0<6vV8Cl~F^t}zv=^+bqlD#hV3wN!qSkhT+YC0>zM&p>z#
z)69wZFi&wpUaQPwgoUh?s*j3UD^=&B<0Ms*2+}1!wf=x8lJpELt`za{!>6%sZiZnp
Z