From 14157faef075e602f9e8d80dfb1216cb53abc06d Mon Sep 17 00:00:00 2001 From: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Date: Mon, 25 Nov 2024 21:56:11 -0400 Subject: [PATCH 1/3] Syringe Ops real syringe ops real (#967) * ebin syringeops * its fucking real * 1984 * Update BaseSolutionInjectOnEventComponent.cs minor spelling mistake webeditops --- .../BaseSolutionInjectOnEventComponent.cs | 6 ++ .../SolutionInjectOnEventSystem.cs | 19 +++- .../SolutionInjectWhileEmbeddedSystem.cs | 1 - .../Weapons/Ranged/Systems/GunSystem.cs | 2 +- .../Weapons/Ranged/SyringeGunSystem.cs | 27 ++++++ .../Weapons/Ranged/SyringeGunComponent.cs | 13 +++ .../Locale/en-US/store/uplink-catalog.ftl | 3 + .../ru-RU/backmen/research/technologies.ftl | 1 + .../Catalog/Fills/Lockers/heads.yml | 2 + .../Entities/Objects/Specific/chemistry.yml | 40 ++++++++- .../Objects/Weapons/Guns/pneumatic_cannon.yml | 2 +- .../Entities/Structures/Machines/lathe.yml | 7 +- .../Prototypes/Research/civilianservices.yml | 13 +++ .../Jobs/Medical/chief_medical_officer.yml | 2 +- .../_Backmen/Catalog/uplink_catalog.yml | 19 ++++ .../Objects/Weapons/Guns/pneumatic_cannon.yml | 84 ++++++++++++++++++ .../_Backmen/Recipes/Lathes/medical.yml | 21 +++++ .../_Goobstation/Catalog/Fills/Belt/belts.yml | 18 ++++ .../Catalog/Fills/Boxes/medical.yml | 14 +++ .../Entities/Clothing/Belt/belts.yml | 16 ++++ .../Objects/Specific/Medical/healing.yml | 15 ++++ .../Belt/cmowebbing.rsi/equipped-BELT.png | Bin 0 -> 1600 bytes .../Clothing/Belt/cmowebbing.rsi/icon.png | Bin 0 -> 1062 bytes .../Belt/cmowebbing.rsi/inhand-left.png | Bin 0 -> 1085 bytes .../Belt/cmowebbing.rsi/inhand-right.png | Bin 0 -> 1018 bytes .../Clothing/Belt/cmowebbing.rsi/meta.json | 26 ++++++ .../syringe_gun.rsi/dart-syringe-gun.png | Bin 0 -> 287 bytes .../Cannons/syringe_gun.rsi/inhand-left.png | Bin 0 -> 769 bytes .../Cannons/syringe_gun.rsi/inhand-right.png | Bin 0 -> 795 bytes .../Guns/Cannons/syringe_gun.rsi/meta.json | 28 ++++++ .../syringe_gun.rsi/rapid-syringe-gun.png | Bin 0 -> 306 bytes .../Cannons/syringe_gun.rsi/syringe-gun.png | Bin 0 -> 288 bytes 32 files changed, 370 insertions(+), 9 deletions(-) create mode 100644 Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs create mode 100644 Content.Shared/_Goobstation/Weapons/Ranged/SyringeGunComponent.cs create mode 100644 Resources/Prototypes/_Backmen/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml create mode 100644 Resources/Prototypes/_Backmen/Recipes/Lathes/medical.yml create mode 100644 Resources/Prototypes/_Goobstation/Catalog/Fills/Belt/belts.yml create mode 100644 Resources/Prototypes/_Goobstation/Catalog/Fills/Boxes/medical.yml create mode 100644 Resources/Prototypes/_Goobstation/Entities/Clothing/Belt/belts.yml create mode 100644 Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Medical/healing.yml create mode 100644 Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/equipped-BELT.png create mode 100644 Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/icon.png create mode 100644 Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/inhand-left.png create mode 100644 Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/inhand-right.png create mode 100644 Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/meta.json create mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/dart-syringe-gun.png create mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/inhand-left.png create mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/inhand-right.png create mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/meta.json create mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/rapid-syringe-gun.png create mode 100644 Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/syringe-gun.png diff --git a/Content.Server/Chemistry/Components/BaseSolutionInjectOnEventComponent.cs b/Content.Server/Chemistry/Components/BaseSolutionInjectOnEventComponent.cs index 708c1ef0052..877477a5692 100644 --- a/Content.Server/Chemistry/Components/BaseSolutionInjectOnEventComponent.cs +++ b/Content.Server/Chemistry/Components/BaseSolutionInjectOnEventComponent.cs @@ -57,4 +57,10 @@ public abstract partial class BaseSolutionInjectOnEventComponent : Component /// [DataField] public SlotFlags BlockSlots = SlotFlags.NONE; + + /// + /// GoobStation: If this injection transfers EVERYTHING as soon as it is embedded after a gunshot. + /// + [DataField] + public bool Shot = false; } diff --git a/Content.Server/Chemistry/EntitySystems/SolutionInjectOnEventSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionInjectOnEventSystem.cs index f15edcf0672..f79609cac89 100644 --- a/Content.Server/Chemistry/EntitySystems/SolutionInjectOnEventSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/SolutionInjectOnEventSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Body.Components; using Content.Server.Body.Systems; using Content.Server.Chemistry.Components; +using Content.Shared.Chemistry.Components; // GoobStation using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Chemistry.Events; using Content.Shared.Inventory; @@ -40,6 +41,11 @@ private void HandleProjectileHit(Entity private void HandleEmbed(Entity entity, ref EmbedEvent args) { + // GoobStation Change Start + if (_tag.HasTag(entity, "Syringe") && !entity.Comp.Shot) + entity.Comp.PierceArmor = false; // This way syringes that are thrown still inject but do not pierce armor. + // GoobStation Change End + DoInjection((entity.Owner, entity.Comp), args.Embedded, args.Shooter); } @@ -95,6 +101,7 @@ private bool TryInjectTargets(Entity injecto // TODO blocking injection with a hardsuit should probably done with a cancellable event or something if (!injector.Comp.PierceArmor && _inventory.TryGetSlotEntity(target, "outerClothing", out var suit) && _tag.HasTag(suit.Value, "Hardsuit")) { + injector.Comp.Shot = false; // Only show popup to attacker if (source != null) _popup.PopupEntity(Loc.GetString(injector.Comp.BlockedByHardsuitPopupMessage, ("weapon", injector.Owner), ("target", target)), target, source.Value, PopupType.SmallCaution); @@ -132,8 +139,16 @@ private bool TryInjectTargets(Entity injecto if (targetBloodstreams.Count == 0) return false; - // Extract total needed solution from the injector - var removedSolution = _solutionContainer.SplitSolution(injectorSolution.Value, injector.Comp.TransferAmount * targetBloodstreams.Count); + // GoobStation Change Start + Solution removedSolution; + if (injector.Comp.Shot) + { + removedSolution = _solutionContainer.SplitSolution(injectorSolution.Value, injectorSolution.Value.Comp.Solution.Volume); + injector.Comp.Shot = false; // Prevent them from abusing this. + } + else + removedSolution = _solutionContainer.SplitSolution(injectorSolution.Value, injector.Comp.TransferAmount * targetBloodstreams.Count); + // GoobStation Change End // Adjust solution amount based on transfer efficiency var solutionToInject = removedSolution.SplitSolution(removedSolution.Volume * injector.Comp.TransferEfficiency); // Calculate how much of the adjusted solution each target will get diff --git a/Content.Server/Chemistry/EntitySystems/SolutionInjectWhileEmbeddedSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionInjectWhileEmbeddedSystem.cs index 2baeba9da15..9c0c91b37cc 100644 --- a/Content.Server/Chemistry/EntitySystems/SolutionInjectWhileEmbeddedSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/SolutionInjectWhileEmbeddedSystem.cs @@ -28,7 +28,6 @@ public sealed class SolutionInjectWhileEmbeddedSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnMapInit); } diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index 4a09c1a539a..c57967aea8d 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -116,7 +116,7 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? RaiseLocalEvent(ent!.Value, new AmmoShotEvent() { - FiredProjectiles = shotProjectiles, + FiredProjectiles = shotProjectiles }); SetCartridgeSpent(ent.Value, cartridge, true); diff --git a/Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs b/Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs new file mode 100644 index 00000000000..78b5cf481a5 --- /dev/null +++ b/Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs @@ -0,0 +1,27 @@ +using Content.Server.Chemistry.Components; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared._Goobstation.Weapons.Ranged; +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); + } + + private void OnFire(Entity gun, ref AmmoShotEvent args) + { + foreach (var projectile in args.FiredProjectiles) + if (TryComp(projectile, out SolutionInjectOnEmbedComponent? inject)) + { + inject.Shot = true; + inject.PierceArmor = gun.Comp.PierceArmor; + } + } + +} diff --git a/Content.Shared/_Goobstation/Weapons/Ranged/SyringeGunComponent.cs b/Content.Shared/_Goobstation/Weapons/Ranged/SyringeGunComponent.cs new file mode 100644 index 00000000000..fd0cef1a826 --- /dev/null +++ b/Content.Shared/_Goobstation/Weapons/Ranged/SyringeGunComponent.cs @@ -0,0 +1,13 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._Goobstation.Weapons.Ranged; + +/// +/// Component that allows guns to instantly inject all the contents of any syringe on a target. +/// +[RegisterComponent] +public sealed partial class SyringeGunComponent : Component +{ + [DataField] + public bool PierceArmor; +} diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 82c80dab1f4..acba66d74bb 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -213,6 +213,9 @@ uplink-decoy-kit-desc = State-of-the-art distraction technology straight from RN uplink-chemistry-kit-name = Chemical Synthesis Kit uplink-chemistry-kit-desc = A starter kit for the aspiring chemist, includes toxin and vestine for all your criminal needs! +uplink-dart-syringe-gun-name = Dart Syringe Gun +uplink-dart-syringe-gun-desc = A gun that takes in syringes as ammunition, and injects their contents on its victims. Can pierce through armor. + uplink-knives-kit-name = Throwing Knives Kit uplink-knives-kit-desc = A set of 4 syndicate branded throwing knives, perfect for embedding into the body of your victims. diff --git a/Resources/Locale/ru-RU/backmen/research/technologies.ftl b/Resources/Locale/ru-RU/backmen/research/technologies.ftl index 0bed66c01d8..6b7d798291a 100644 --- a/Resources/Locale/ru-RU/backmen/research/technologies.ftl +++ b/Resources/Locale/ru-RU/backmen/research/technologies.ftl @@ -3,3 +3,4 @@ research-technology-metempsychosis = Метемпсихоз research-technology-navigation = Навигация research-technology-psionic-countermeasures = Псионические контрмеры research-technology-teleportation = Телепортация +research-technology-medical-defense = Экстремальные методы контроля diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml index fbf4e69f91f..e87e6a9d19f 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml @@ -244,6 +244,8 @@ - id: FlatpackMetempsychoticMachine # backmen - id: MedicalBiofabMachineBoard # backmen - id: MedTekCartridge + - id: RapidSyringeGun # backmen + - id: BoxSyringePax # backmen # Hardsuit table, used for suit storage as well - type: entityTable diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index edaa8288145..5230e009181 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -359,6 +359,40 @@ maxVol: 15 - type: Injector injectOnly: false + # GoobStation Start - Added embeddable properties for syringe gun + - type: EmbeddableProjectile + offset: "-0.1,0" + minimumSpeed: 3 + removalTime: 0.25 + embedOnThrow: true + - 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 + # GoobStation End - type: ExaminableSolution solution: injector - type: Spillable @@ -374,6 +408,7 @@ - type: Tag tags: - Syringe + - SyringeGunAmmo # GoobStation - type: entity parent: BaseSyringe @@ -386,6 +421,7 @@ tags: - Syringe - Trash + - SyringeGunAmmo # GoobStation - type: entity name: mini syringe @@ -409,7 +445,7 @@ offset: "-0.1,0" minimumSpeed: 3 removalTime: 0.25 - embedOnThrow: false + embedOnThrow: true - type: SolutionInjectWhileEmbedded transferAmount: 1 solution: injector @@ -589,7 +625,7 @@ areaInsertRadius: 1 storageInsertSound: /Audio/Effects/pill_insert.ogg storageRemoveSound: /Audio/Effects/pill_remove.ogg - whitelist: + whitelist: tags: - Pill - type: Dumpable diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml index 63a7acd2576..273c428ff38 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml @@ -103,7 +103,7 @@ containers: storagebase: !type:Container ents: [] - + - type: entity name: syringe gun parent: BaseStorageItem diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index f6c3ec65ad5..28fdf346fce 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -786,6 +786,7 @@ - WeaponFlareGunSecurity - WeaponLaserCarbinePractice - Zipties + - SyringeGun #Goobstation dynamicRecipes: - BoxBeanbag - BoxShotgunIncendiary @@ -842,6 +843,7 @@ - ClothingHeadHelmetInsulated - ShellSoulbreaker - WeaponXrayCannon + - RapidSyringeGun # Goobstation - SecurityCyberneticEyes # Shitmed Change - MedicalCyberneticEyes # Shitmed Change - type: MaterialStorage @@ -963,6 +965,7 @@ - Hemostat - ClothingEyesGlassesChemical - WhiteCane + - SyringeGun # backmen dynamicRecipes: - ChemicalPayload - CryostasisBeaker @@ -970,12 +973,14 @@ - SyringeBluespace - SyringeCryostasis - BluespacePillCanister # backmen - # Shitmed Change + - RapidSyringeGun # backmen + # Shitmed Change start - EnergyScalpel - EnergyCautery - AdvancedRetractor - OmnimedTool - MedicalCyberneticEyes + # Shitmed Change end - type: Machine board: MedicalTechFabCircuitboard - type: StealTarget diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index df194c27e7d..c93af79b1fd 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -188,6 +188,19 @@ recipeUnlocks: - CargoTelepadMachineCircuitboard +# GoobStation - Why civilian? Because fuck you. +- type: technology + id: MedicalDefense + name: research-technology-medical-defense + icon: + sprite: _Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi + state: rapid-syringe-gun + discipline: CivilianServices + tier: 2 + cost: 10000 + recipeUnlocks: + - RapidSyringeGun + # Tier 3 - type: technology diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml index 46847fde32f..bfa2be1d0d7 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml @@ -60,7 +60,7 @@ equipment: id: CMOPDA ears: ClothingHeadsetCMO - belt: ClothingBeltMedicalFilled + belt: ClothingBeltMilitaryWebbingCMOFilled # Goobstation storage: back: - Flash diff --git a/Resources/Prototypes/_Backmen/Catalog/uplink_catalog.yml b/Resources/Prototypes/_Backmen/Catalog/uplink_catalog.yml index ebc087b4b7d..4db1d6f8d6b 100644 --- a/Resources/Prototypes/_Backmen/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/_Backmen/Catalog/uplink_catalog.yml @@ -162,3 +162,22 @@ Telecrystal: 10 categories: - UplinkDeception + +- 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: dart-syringe-gun } + productEntity: DartSyringeGun + cost: + Telecrystal: 30 # goob + categories: + - UplinkChemicals + conditions: + - !type:BuyerJobCondition + whitelist: + - MedicalDoctor + - MedicalIntern + - Psychologist + - Chemist + - Paramedic diff --git a/Resources/Prototypes/_Backmen/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml b/Resources/Prototypes/_Backmen/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml new file mode 100644 index 00000000000..55faf16a199 --- /dev/null +++ b/Resources/Prototypes/_Backmen/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml @@ -0,0 +1,84 @@ +- type: entity + name: syringe gun + parent: [ BaseStorageItem, BaseMedicalContraband ] + id: SyringeGun + description: A gun that allows you to fire syringes and instantly inject their contents on a target. + components: + - type: Sprite + sprite: _Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi + layers: + - state: syringe-gun + - 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: Large + shape: + - 0,0,4,0 + - type: ContainerContainer + containers: + storagebase: !type:Container + ents: [] + - type: SyringeGun + + +- type: entity + name: rapid syringe gun + parent: SyringeGun + id: RapidSyringeGun + description: An upgraded version of the syringe gun featuring a faster fire rate and a bigger magazine. + components: + - type: Sprite + sprite: _Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi + layers: + - state: rapid-syringe-gun + - type: Storage + maxItemSize: Tiny + grid: + - 0,0,2,1 + whitelist: + tags: + - SyringeGunAmmo + - type: Gun + fireRate: 1.5 + +- type: entity + name: dart syringe gun + parent: [ SyringeGun, BaseSyndicateContraband ] + id: DartSyringeGun + description: An illegally modified version of the syringe gun that allows projectiles to pierce through armor. + components: + - type: Sprite + sprite: _Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi + layers: + - state: dart-syringe-gun + - type: Storage + maxItemSize: Tiny + grid: + - 0,0,0,0 + whitelist: + tags: + - SyringeGunAmmo + - type: Gun + fireRate: 1 + - type: Item + size: Small + shape: + - 0,0,1,0 + - type: SyringeGun + pierceArmor: true + +# TODO: Add the proper dart gun that regenerates every 25s, and draws from a 100u reservoir diff --git a/Resources/Prototypes/_Backmen/Recipes/Lathes/medical.yml b/Resources/Prototypes/_Backmen/Recipes/Lathes/medical.yml new file mode 100644 index 00000000000..ca3b606cd57 --- /dev/null +++ b/Resources/Prototypes/_Backmen/Recipes/Lathes/medical.yml @@ -0,0 +1,21 @@ +- type: latheRecipe + id: SyringeGun + result: SyringeGun + completetime: 5 + materials: + Steel: 500 + Glass: 500 + Plastic: 500 + Gold: 100 + Plasma: 100 + +- type: latheRecipe + id: RapidSyringeGun + result: RapidSyringeGun + completetime: 5 + materials: + Steel: 1000 + Glass: 1000 + Plastic: 1000 + Gold: 200 + Plasma: 200 diff --git a/Resources/Prototypes/_Goobstation/Catalog/Fills/Belt/belts.yml b/Resources/Prototypes/_Goobstation/Catalog/Fills/Belt/belts.yml new file mode 100644 index 00000000000..d1ee38ff8d1 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Catalog/Fills/Belt/belts.yml @@ -0,0 +1,18 @@ +- type: entity + parent: ClothingBeltMilitaryWebbingCMO + id: ClothingBeltMilitaryWebbingCMOFilled + name: chief medical officer's chest rig + description: "A medical chest rig with deep pockets, for use by paramedics and health professionals." + components: + - type: StorageFill + contents: + - id: EnergyCautery + - id: EnergyScalpel + - id: AdvancedRetractor + - id: BoneGel + - id: Brutepack + - id: Ointment + - id: Bloodpack + - id: Gauze + - id: EmergencyMedipen + amount: 3 diff --git a/Resources/Prototypes/_Goobstation/Catalog/Fills/Boxes/medical.yml b/Resources/Prototypes/_Goobstation/Catalog/Fills/Boxes/medical.yml new file mode 100644 index 00000000000..0b61ac4811e --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Catalog/Fills/Boxes/medical.yml @@ -0,0 +1,14 @@ +- type: entity + name: pax syringe box + parent: BoxCardboard + id: BoxSyringePax + description: A box full of tranquilizer syringes. + components: + - type: StorageFill + contents: + - id: SyringePax + amount: 6 + - type: Sprite + layers: + - state: box + - state: syringe diff --git a/Resources/Prototypes/_Goobstation/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/_Goobstation/Entities/Clothing/Belt/belts.yml new file mode 100644 index 00000000000..40aa058dd3e --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Entities/Clothing/Belt/belts.yml @@ -0,0 +1,16 @@ +- type: entity + parent: ClothingBeltStorageBase + id: ClothingBeltMilitaryWebbingCMO + name: chief medical officer's chest rig + description: A medical chest rig with deep pockets, for use by paramedics and health professionals. + components: + - type: Sprite + sprite: _Goobstation/Clothing/Belt/cmowebbing.rsi + - type: Clothing + sprite: _Goobstation/Clothing/Belt/cmowebbing.rsi + - type: Item + size: Large + - type: Storage + maxItemSize: Normal + grid: + - 0,0,6,2 diff --git a/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Medical/healing.yml b/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Medical/healing.yml new file mode 100644 index 00000000000..1e7254228b1 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Medical/healing.yml @@ -0,0 +1,15 @@ +# I am making a grave mistake aren't I? +- type: entity + suffix: pax + parent: PrefilledSyringe + id: SyringePax + components: + - type: Label + currentLabel: reagent-name-pax + - type: SolutionContainerManager + solutions: + injector: + maxVol: 15 + reagents: + - ReagentId: Pax + Quantity: 15 diff --git a/Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/equipped-BELT.png b/Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/equipped-BELT.png new file mode 100644 index 0000000000000000000000000000000000000000..c4c86299461116f8e28c480fc8a81e5a6a10f489 GIT binary patch literal 1600 zcmV-G2EX}i?bsb|cl{Qqc^$E|YnqCr~6OL?^G>i9yht*s% zC43_6*X4l1x0bFn_|4*MgTE}+T^w0*;`NJKmab{Z8PU`7<*8V6 z|36P7GdcW`(F6H@P4{{wP#XUPQQ zFMR+2010qNS#tmY3labT3lag+-G2N400ekRL_t(|0qt5%XcIvcp7f7mTclu#u1FyV ziNscFs?vk_Qx!q*@8ngl9>tRs1o5UvPl6u2^d<_uD8&{JqNEn8hu|S4)HcQlQQK;< z*mb^5UKl4ook=#q;2YS!&d%HSz4_+NY}ogN;KmFv1Iz$3zzi@0%m6cB&cN=&7hKZr z>gp2cLzcQouUc8kriur2;?~MTuJshuI)CkA^@w8@JEB}9~ctJce4U#0QwmByXjj1I1e%} z#Ff5df64Jwk7#j!Tf-~-ReqLE+Dn(Od6V^|oV?nH1*}qKOVy8pV37Uj_;oJ=@1MR| zkhq`ylD0N(bZS!QgZ;@J%VJcrT~1Oo*oNX}p6fp75dfd6!8VEjFpqr)3E*;a`SXGp z8OrI=`+KvAZ8lDJfQd%f@P{IRdD1LF^w3ro-WTlZdpM_I z{#Shqbnn{h!Zsa-WCf9lh=Y&m`0D~TjaQP!$}mn7Zjs0DhI;(w5op{`0xCJ*@G&(C z2%JI`660!LT|LroS{aQ-Tbsdo>1T(HpT?6)rBa16zy_cZx^mKiNF>rJu{s^cY3=Rp zZIk}4n_wIL5CVWSDiVnVu78e*nVA{*w1x?XLLuXG&4i$))A{cSXu1_+hnWFpfEi#0 zm;q*h8DIvO0cL<1Ujf$$ME%SQ5H3mN2aq5ce|VQ}3HWHUC{_eu^2p3k@?l)&$B~Yb4N-xQl53U7fMTr; zlLiJQM=*Ix!{M{Mxp0FzI-% zWJdRubaZJDp?Z&+rtOl0k2vl zCgvS%g_u_;rFx=IKpivrzf^W<-Z?L(WLeJOsH{wp+mE)Si9KD%C_Ah_M12$_U`5m# z0qjj0_gliYidBBUo4ZgG0g)3I3v&zzS+61+_GUv`4$iArD#kN^GuK1_fN=)Anwb_~ zGoSJ@RqT&XcL>Xqv(whK05!WoWiqNEym#^XA?bH^ShuHQ0aNt_|CjPn*HQb%u_A$? zyP+RAa0oSeSQWJ{fI#YT2%=DeFiZKP-y>gG`ptmM8u$2Zv(fgd`W+xAjvPEveURc4rPGXu;3Gr$Zm1I$2q2L1rfYaq}T*$6NI00001ljwEP)i?bsb|cl{Qqc^$E|YnqCr~6OL?^G>i9yht*s% zC43_6*X4l1x0bFn_|4*MgTE}+T^w0*;`NJKmab{Z8PU`7<*8V6 z|36P7GdcW`(F6H@P4{{wP#XUPQQ zFMR+2010qNS#tmY3labT3lag+-G2N400Le~L_t(o3GGxnXcSQtJ=qNw64ws|$&w}5 zXh5?NRI*J_Rt<q_ zVW0QB$sHG*eZB!3Wgg7TojYgFJ@35tE|8AYfz*N2fq&6~?ZYQcobGn{IIQM6HSm41 zNMCUe;lGK{{HNDXI(+#O3m|b&ui;v0TU4VrpU0No0*;P9#K!J?l=lg|l`7fR{vpF6 zjioP|0!e6x<`+M{_2y0FfEMo?*p2zQsD2c13Fd=$@;+pIMR+S^6|VoOGZ*mY{VSRB z+7_@3N@GwO+>gnL>+szNnMl58K=RVyK5<~yUXTUgta)j1Pbv%ZUILvxXHF4xf}?FL z9{ISS-dVD^TkF}L&aWUN0?G?H%=9c0a3c|GbqE8`lOmh{F9Bw!TSXL=M_Tn-ok+Vncu+a}N-}ky$H4LXx|V6;F=h!oUC0oh~GyN{Uay gonli5{x1i90y4_+$k2LV2mk;807*qoM6N<$g7S*y3jhEB literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/inhand-left.png b/Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..44d6249e402f3a58c25a97d687cb5bfd3d2bb664 GIT binary patch literal 1085 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d*Ob`Ho)PG(@xm{>Y-ueVd8 zNW1*j4g5zJwso+vceAl-b{sP}aa8Jx!s?^df4Q#ceb-W4>*(ElL160_(=YN@q_&8$ zI10LK+4_BJ%bjzfj-0mBzt3yGUtQP!-B$mGa^=>9FDwfKbY5O8II(+D#8<2Pg$ax0 z&Ce~#%IMzMY7zVRd0>{R98=i(ccrq)22;&KHhkqgzhYLL&^+P3oT(<=-&@+R#u%yA zD80GGe|vvrW814Q-f=m;U!7Uk*IX>06?*xPt?AiYk`{3fcHQ`te`-$Je%JNeOzs<2 zls)*gY^f%D!B%eN^HD+m*Hqhes@0g~#UJ<`xM0h(#x(8fo#%fzAKm`sQeIHOA{_KS z@;`G?N%~2aC;GL(2;eO6h%9Dc;1&X5#!GkW{xC2wm3q23hEy=Vo#p5)9Vl=-eY2d6 z>Fb3@#4;CoOjh#EnLKH-oKjqC4WGUH!AraAcpR(5HZFJY*D?vy*rM8cr8!f7?-iT- zZ;TSAZ_g|Ho@)D}ULfuBy?y`B{P|Q?JVWsi1ET;=)X45~VB_4^pSP}Cbv9Oh)4QKj zZ(IJ~G5?l(>E6|=;ud`U+JD>9+H1Y&)aO1|oTmNU=Vx=e?&fNdiMqNMd2X*{SaBtK zN%Hc1_4$YX3DwRo6`dM(???5fELTgvS{vV{nm@jul-;c~{z zq)9uQVp6tF`jfQSwfcO_qX*?%pDJcg{$-$gzBuU^u_WgNTZ70Xm$;R#|a_gG;wu~>@5wlH9u6>fT zSG_o;*7fk5HA}aK-Dmu)f2-^Mori{Rz6<@#N%AJM7;DVtVfMEz}T|?lxtZeLKHY^z=o6 zxaW03J2ZBGFw$6hJWXcTK`Dldp&>K8B%{CNM^`@CQRyV5k@D_aZFy`ovw~yC-qS04 zx6XPepCtRv?O`3u{b|j0EmFVdQ&MBb@09Xz35&!@I literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/inhand-right.png b/Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..9f10abb50b92061413e41e7eba7e7622d9001c65 GIT binary patch literal 1018 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d*Ob`Ho)PG(@xm{>Y-ueVd8 zNW1*j4g5zJwso+vceAl-b{sP}aa8Jx!s?^df4Q#ceb-W4>*(ElL160_(=YN@q_&8$ zI10LK+4_BJ%bjzfj-0mBzt3yGUtQP!-B$mGa^=>9FDwfKbY5O8II(+D#8<2Pg$ax0 z&Ce~#%IMzMY7zVRd0>{R98=i(ccrq)22;&KHhkqgzhYLL&^+P3oT(<=-&@+R#u%yA zD80GGe|vvrW814Q-f=m;U!7Uk*IX>06?*xPt?AiYk`{3fcHQ`te`-$Je%JNeOzs<2 zls)*gY^f%D!B%eN^HD+m*Hqhes@0g~#UJ<`xM0h(#x(8fo#%fzAKm`sQeIHOA{_KS z@;`G?N%~2aC;GL(2;eO6h%9Dc;1&X5#!GkW{xC2w8F{)mhEy=VoweJG*-@nJe46f> z5?z&~#H3`ULtRogy}CQrPI&&olBJfhmggY5z(uWurA?i!6^c$5)^ee%HJXG>1%u>{JTUC8jMtaFKf)xMp6!E^RSsrfqI zoa%dB&UN$qiO(LduRiVEwVpBi+)3WYX&qvm%8&D6COqrW^AP>>D67*?%qMC2@lDT{ za|-^=mG^z5k&}7<+n&7_xA*(8+cG|w#W=O?U5VM5`+I&@R>xk`lGw7l-oW77 zMurv2KUBI^Lq0Z2Ntb=#i3!lzIZ?&++X^P%RcQ^4<#rPnbsK0JF?_qaPIAMwJ+l~Z zewIj2X}=kAYIgNko>#TEelg4~R#obp#i+mc?T+vFQf(a`Y>eqmKHHFIYzU0i3u+(O ZkI5Zo-0+rZJupczc)I$ztaD0e0ss#2#M}S? literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/meta.json b/Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/meta.json new file mode 100644 index 00000000000..ef35db1d751 --- /dev/null +++ b/Resources/Textures/_Goobstation/Clothing/Belt/cmowebbing.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039 and modified by emisse for ss14. Further modified by TJohnson", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-BELT", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/dart-syringe-gun.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/dart-syringe-gun.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba496709508ec781dd4a821f789569444d46521 GIT binary patch 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..3c23139337785203b81b838148213b1e2c394c21 GIT binary patch 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 ZP3Nu!{)=HtsdN6#G<6p&iFX_e*9y}Z`8I`bFHq@-Os za-h#|ia5{&p^_lKV21zbAnstB9Z+4Xo`NR0*oxvThT?^bZCSGQh;m>dhRMZzTRGV3*(mivFgSRr9O_Gzz zK^^L_eUr7(8A5T-G@yGywq5BYUa< literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/syringe-gun.png b/Resources/Textures/_Goobstation/Objects/Weapons/Guns/Cannons/syringe_gun.rsi/syringe-gun.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac09c0077c87bd0edb3adca86f817ceaf5e1ff5 GIT binary patch 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 literal 0 HcmV?d00001 From 34dbf7973c569a372d99f8a4b2387fcfaaa95a0a Mon Sep 17 00:00:00 2001 From: Roudenn Date: Sat, 25 Jan 2025 12:23:37 +0300 Subject: [PATCH 2/3] locale --- Resources/Locale/ru-RU/backmen/entities/syringe_gun.ftl | 6 ++++++ .../entities/objects/specific/medical/healing.ftl | 3 +++ 2 files changed, 9 insertions(+) create mode 100644 Resources/Locale/ru-RU/backmen/entities/syringe_gun.ftl diff --git a/Resources/Locale/ru-RU/backmen/entities/syringe_gun.ftl b/Resources/Locale/ru-RU/backmen/entities/syringe_gun.ftl new file mode 100644 index 00000000000..632524f44b7 --- /dev/null +++ b/Resources/Locale/ru-RU/backmen/entities/syringe_gun.ftl @@ -0,0 +1,6 @@ +ent-DartSyringeGun = дротиковый шприцемёт + .desc = Нелегально модифицированная версия шприцемёта которая позволяет пробивать броню. +ent-SyringeGun = шприцемёт + .desc = Девайс, позволяющий выстреливать шприцами и моментально вводить их содержимое в цель. +ent-RapidSyringeGun = улучшенный шприцемёт + .desc = Улучшенная версия шприцемёта с более быстрой скорострельностью и большой вместимостью шприцов. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/medical/healing.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/medical/healing.ftl index f9fbd6b518b..06644ae1451 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/medical/healing.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/medical/healing.ftl @@ -171,3 +171,6 @@ ent-SyringeRomerol = { ent-PrefilledSyringe } ent-SyringeStimulants = { ent-PrefilledSyringe } .desc = { ent-PrefilledSyringe.desc } .suffix = Стимулятор +ent-SyringePax = { ent-PrefilledSyringe } + .desc = { ent-PrefilledSyringe.desc } + .suffix = Пакс From e60aec8957ce7c273c73892b08d75618ae0bf0f2 Mon Sep 17 00:00:00 2001 From: Kayzel <43700376+KayzelW@users.noreply.github.com> Date: Sat, 25 Jan 2025 17:13:08 +0300 Subject: [PATCH 3/3] Update Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs b/Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs index 78b5cf481a5..e557f1481d5 100644 --- a/Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs +++ b/Content.Server/_Goobstation/Weapons/Ranged/SyringeGunSystem.cs @@ -17,11 +17,13 @@ public override void Initialize() private void OnFire(Entity gun, ref AmmoShotEvent args) { foreach (var projectile in args.FiredProjectiles) + { if (TryComp(projectile, out SolutionInjectOnEmbedComponent? inject)) { inject.Shot = true; inject.PierceArmor = gun.Comp.PierceArmor; } + } } }