diff --git a/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs b/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs index d537c2ffdd7e..862570025998 100644 --- a/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs +++ b/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs @@ -15,6 +15,7 @@ using Content.Server.Body.Components; using System.Linq; using Robust.Server.Audio; +using Content.Shared._Goobstation.Chemistry.Hypospray; // Goobstation namespace Content.Server.Chemistry.EntitySystems; @@ -61,6 +62,9 @@ public void OnAfterInteract(Entity entity, ref AfterInteract public void OnAttack(Entity entity, ref MeleeHitEvent args) { + if (args.Handled) // Goobstation + return; + if (!args.HitEntities.Any()) return; @@ -123,7 +127,7 @@ public bool TryDoInject(Entity entity, EntityUid target, Ent if (!_solutionContainers.TryGetSolution(uid, component.SolutionName, out var hypoSpraySoln, out var hypoSpraySolution) || hypoSpraySolution.Volume == 0) { _popup.PopupEntity(Loc.GetString("hypospray-component-empty-message"), target, user); - return true; + return false; // Goobstation edit - why was it true? } if (!_solutionContainers.TryGetInjectableSolution(target, out var targetSoln, out var targetSolution)) @@ -168,6 +172,9 @@ public bool TryDoInject(Entity entity, EntityUid target, Ent var ev = new TransferDnaEvent { Donor = target, Recipient = uid }; RaiseLocalEvent(target, ref ev); + var afterinjectev = new AfterHyposprayInjectsEvent { User = user, Target = target }; // Goobstation + RaiseLocalEvent(uid, ref afterinjectev); // Goobstation + // same LogType as syringes... _adminLogger.Add(LogType.ForceFeed, $"{EntityManager.ToPrettyString(user):user} injected {EntityManager.ToPrettyString(target):target} with a solution {SharedSolutionContainerSystem.ToPrettyString(removedSolution):removedSolution} using a {EntityManager.ToPrettyString(uid):using}"); diff --git a/Content.Server/_Goobstation/Chemistry/HyposprayBlockNonMobInjection/HyposprayBlockNonMobInjectionSystem.cs b/Content.Server/_Goobstation/Chemistry/HyposprayBlockNonMobInjection/HyposprayBlockNonMobInjectionSystem.cs new file mode 100644 index 000000000000..ff1ba4c8fe2c --- /dev/null +++ b/Content.Server/_Goobstation/Chemistry/HyposprayBlockNonMobInjection/HyposprayBlockNonMobInjectionSystem.cs @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2024 Aviu00 <93730715+Aviu00@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 Misandry +// SPDX-FileCopyrightText: 2025 gus +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +using Content.Server.Chemistry.EntitySystems; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Mobs.Components; +using Content.Shared.Weapons.Melee.Events; +using Content.Shared._Goobstation.Chemistry.HyposprayBlockNonMobInjection; + +namespace Content.Server._Goobstation.Chemistry.HyposprayBlockNonMobInjection; + +public sealed class HyposprayBlockNonMobInjectionSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAfterInteract, before: new []{typeof(HypospraySystem)}); + SubscribeLocalEvent(OnAttack, before: new []{typeof(HypospraySystem)}); + SubscribeLocalEvent(OnUseInHand, before: new []{typeof(HypospraySystem)}); + } + + private void OnUseInHand(Entity ent, ref UseInHandEvent args) + { + if (!IsMob(args.User)) + args.Handled = true; + } + + private void OnAttack(Entity ent, ref MeleeHitEvent args) + { + if (args.HitEntities.Count == 0 || !IsMob(args.HitEntities[0])) + args.Handled = true; + } + + private void OnAfterInteract(Entity ent, ref AfterInteractEvent args) + { + if (args.Target == null || !IsMob(args.Target.Value)) + args.Handled = true; + } + + private bool IsMob(EntityUid uid) + { + return HasComp(uid); + } +} diff --git a/Content.Shared/_Goobstation/Chemistry/Hypospray/HyposprayEvents.cs b/Content.Shared/_Goobstation/Chemistry/Hypospray/HyposprayEvents.cs new file mode 100644 index 000000000000..48a3eca299f5 --- /dev/null +++ b/Content.Shared/_Goobstation/Chemistry/Hypospray/HyposprayEvents.cs @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +namespace Content.Shared._Goobstation.Chemistry.Hypospray; + +/// +/// Raised on a hypospray when it successfully injects. +/// +[ByRefEvent] +public record struct AfterHyposprayInjectsEvent() +{ + /// + /// Entity that used the hypospray. + /// + public EntityUid User; + + /// + /// Entity that was injected. + /// + public EntityUid Target; +} diff --git a/Content.Shared/_Goobstation/Chemistry/Hypospray/SolutionCartridgeComponent.cs b/Content.Shared/_Goobstation/Chemistry/Hypospray/SolutionCartridgeComponent.cs new file mode 100644 index 000000000000..4819d4ced948 --- /dev/null +++ b/Content.Shared/_Goobstation/Chemistry/Hypospray/SolutionCartridgeComponent.cs @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: 2024 Aviu00 <93730715+Aviu00@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 Misandry +// SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 gus +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +using Content.Shared.Chemistry.Components; + +namespace Content.Shared._Goobstation.Chemistry.Hypospray; + +[RegisterComponent] +public sealed partial class SolutionCartridgeComponent : Component +{ + [DataField, ViewVariables(VVAccess.ReadWrite)] + public string TargetSolution = "default"; + + [DataField(required: true)] + public Solution Solution; +} diff --git a/Content.Shared/_Goobstation/Chemistry/Hypospray/SolutionCartridgeSystem.cs b/Content.Shared/_Goobstation/Chemistry/Hypospray/SolutionCartridgeSystem.cs new file mode 100644 index 000000000000..b7998635de81 --- /dev/null +++ b/Content.Shared/_Goobstation/Chemistry/Hypospray/SolutionCartridgeSystem.cs @@ -0,0 +1,54 @@ +// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.Chemistry.EntitySystems; +using Robust.Shared.Containers; + +namespace Content.Shared._Goobstation.Chemistry.Hypospray; + +public sealed class SolutionCartridgeSystem : EntitySystem +{ + [Dependency] private readonly SharedSolutionContainerSystem _solution = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnCartridgeInserted); + SubscribeLocalEvent(OnCartridgeRemoved); + SubscribeLocalEvent(OnHyposprayInjected); + } + + private void OnCartridgeInserted(Entity ent, ref EntInsertedIntoContainerMessage args) + { + if (!TryComp(args.Entity, out var cartridge) + || !TryComp(ent, out SolutionContainerManagerComponent? manager) + || !_solution.TryGetSolution((ent, manager), cartridge.TargetSolution, out var solutionEntity)) + return; + + _solution.TryAddSolution(solutionEntity.Value, cartridge.Solution); + } + + private void OnCartridgeRemoved(Entity ent, ref EntRemovedFromContainerMessage args) + { + if (!TryComp(args.Entity, out var cartridge) + || !TryComp(ent, out SolutionContainerManagerComponent? manager) + || !_solution.TryGetSolution((ent, manager), cartridge.TargetSolution, out var solutionEntity)) + return; + + _solution.RemoveAllSolution(solutionEntity.Value); + } + + private void OnHyposprayInjected(Entity ent, ref AfterHyposprayInjectsEvent args) + { + if (!_container.TryGetContainer(ent, "item", out var container)) + return; + + _container.CleanContainer(container); + } +} diff --git a/Content.Shared/_Goobstation/Chemistry/HyposprayBlockNonMobInjection/HyposprayBlockNonMobInjection/HyposprayBlockNonMobInjectionComponent.cs b/Content.Shared/_Goobstation/Chemistry/HyposprayBlockNonMobInjection/HyposprayBlockNonMobInjection/HyposprayBlockNonMobInjectionComponent.cs new file mode 100644 index 000000000000..4b75225df163 --- /dev/null +++ b/Content.Shared/_Goobstation/Chemistry/HyposprayBlockNonMobInjection/HyposprayBlockNonMobInjection/HyposprayBlockNonMobInjectionComponent.cs @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2024 Aviu00 <93730715+Aviu00@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +// SPDX-FileCopyrightText: 2025 Misandry +// SPDX-FileCopyrightText: 2025 gus +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +namespace Content.Shared._Goobstation.Chemistry.HyposprayBlockNonMobInjection; + +/// +/// For some reason if you set HyposprayComponent onlyAffectsMobs to true it would be able to draw from containers +/// even if injectOnly is also true. I don't want to modify HypospraySystem, so I made this component. +/// +[RegisterComponent] +public sealed partial class HyposprayBlockNonMobInjectionComponent : Component +{ +} diff --git a/Resources/Locale/en-US/_DV/prototypes/entities/objects/specific/medical/hypospray.ftl b/Resources/Locale/en-US/_DV/prototypes/entities/objects/specific/medical/hypospray.ftl new file mode 100644 index 000000000000..8f5fc2a1d9d0 --- /dev/null +++ b/Resources/Locale/en-US/_DV/prototypes/entities/objects/specific/medical/hypospray.ftl @@ -0,0 +1,4 @@ +ent-CartridgeSaline = airloss autoinjector cartridge + .desc = Contains 7u of saline and 3u of convermol, used in a cartridge autoinjector. +ent-CartridgeBicaridine = brute autoinjector cartridge + .desc = Contains 7u of bicaridine, 2u of salicylic acid and 1u of tranexamic acid, used in a cartridge autoinjector. diff --git a/Resources/Prototypes/Catalog/Fills/Items/belt.yml b/Resources/Prototypes/Catalog/Fills/Items/belt.yml index 9bd1fb8d33d4..344109293371 100644 --- a/Resources/Prototypes/Catalog/Fills/Items/belt.yml +++ b/Resources/Prototypes/Catalog/Fills/Items/belt.yml @@ -115,8 +115,11 @@ - id: Bloodpack - id: Gauze - id: Portafib # DeltaV - Add PortaFib to EMT belt - - id: EmergencyMedipen #You never know what people are going to latejoin into - amount: 3 + #- id: EmergencyMedipen #You never know what people are going to latejoin into # Goobstation - start + # amount: 3 + - id: ParamedHypo + - id: CartridgeSaline + - id: CartridgeBicaridine # Goobstation - end - type: entity id: ClothingBeltPlantFilled diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml index d28f4c003188..23813433fb0f 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml @@ -11,5 +11,10 @@ Portafib: 1 # DeltaV - Add Portafibs, see Prototypes/_DV/Entities/Objects/Devices/Medical/portafib.yml ClothingEyesHudMedical: 3 # DeltaV - was 2 ClothingEyesEyepatchHudMedical: 2 + Tourniquet: 6 # Goobstation - start + ParamedHypo: 2 + CartridgeSaline: 6 + CartridgeBicaridine: 6 + CartridgeDermaline: 6 # Goobstation - end contrabandInventory: FoodApple: 1 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml index 49e975b1c3ac..592a58926d91 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml @@ -29,6 +29,11 @@ ClothingOuterArmorReflective: 2 # DeltaV - added reflective vest to sectech ClothingHeadHelmetBasic: 2 # DeltaV - added helmets to the SecTech. Another line of defense between the tide and your grey matter. BreachingCharge: 8 # DeltaV - added breaching charges + SecHypo: 4 # Goobstation - start + CartridgeEpinephrine: 4 + CartridgeSaline: 4 + CartridgeBicaridine: 4 + CartridgeDermaline: 4 # Goobstation - end # security officers need to follow a diet regimen! contrabandInventory: WeaponMeleeNeedle: 2 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml index 327c17269afb..5ff1fd56c915 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml @@ -6,5 +6,6 @@ Bloodpack: 3 ChemistryBottleEpinephrine: 3 Syringe: 3 + Tourniquet: 3 #Goobstation - ParamedHypo contrabandInventory: PowerCellSmall: 2 diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index 2ec4ee2eae43..2f10c1f00c21 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -273,6 +273,8 @@ - SurgeryTool - Dropper - Vial # DeltaV - vial gaming + - Tourniquet #Goobstation - ParamedHypo + - AutoinjectorCartridge #Goobstation - Autoinjectors components: - Defibrillator # DeltaV - Add PortaFib to EMT belt - Hypospray diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml index daea1e5c4169..12d35542cbcb 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml @@ -247,6 +247,7 @@ components: - type: Tag tags: + - Tourniquet #Goobstation - ParamedHypo - SecBeltEquip - type: Sprite state: tourniquet diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 432418314fa5..b8d4be4d61ca 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -428,6 +428,7 @@ - PrisonerSoftsuits - EVASuit # End DeltaV Additions + - SecurityHypoStatic # Goobstation dynamicPacks: - SalvageSecurityBoards - SalvageSecurityWeapons @@ -518,6 +519,7 @@ - EVASuit - PowerCellsStatic # End DeltaV Additions + - ParamedHypoStatic # Goobstation - ParamedHypo dynamicPacks: - Chemistry - CyberneticsMedical # Shitmed change diff --git a/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Medical/hypospray.yml b/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Medical/hypospray.yml new file mode 100644 index 000000000000..fe260ccf5510 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Entities/Objects/Specific/Medical/hypospray.yml @@ -0,0 +1,236 @@ +# SPDX-FileCopyrightText: 2024 Aviu00 <93730715+Aviu00@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 BombasterDS <115770678+BombasterDS@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 Piras314 +# SPDX-FileCopyrightText: 2024 a_person <40855173+a-person5660@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aiden +# SPDX-FileCopyrightText: 2025 Aidenkrz +# SPDX-FileCopyrightText: 2025 BramvanZijp <56019239+BramvanZijp@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Killerqu00 <47712032+Killerqu00@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 SX-7 <92227810+SX-7@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Solstice +# SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 pheenty +# +# SPDX-License-Identifier: AGPL-3.0-or-later +# Cartridge Autoinjectors + +- type: entity + parent: BaseItem + id: BaseCartridgeAutoinjector + abstract: true + components: + - type: Item + sprite: _Goobstation/Objects/Specific/Medical/autoinjector.rsi + - type: Sprite + sprite: _Goobstation/Objects/Specific/Medical/autoinjector.rsi + - type: SolutionContainerVisuals + maxFillLevels: 1 + fillBaseName: cartridge + - type: Appearance + - type: SolutionContainerManager + solutions: + hypospray: + maxVol: 10 + - type: ExaminableSolution + solution: hypospray + - type: Hypospray + solutionName: hypospray + transferAmount: 10 + onlyAffectsMobs: false + injectOnly: true + - type: HyposprayBlockNonMobInjection + - type: UseDelay + delay: 30 # up this later if its too low + - type: ContainerContainer + containers: + item: !type:ContainerSlot + - type: ItemSlots + slots: + item: + name: Cartridge + whitelist: + tags: + - AutoinjectorCartridge + +- type: entity + name: security cartridge autoinjector + parent: [ BaseCartridgeAutoinjector , BaseSecurityContraband ] + description: Used for rapid administration of medicine. Uses cartridges printable at the security techfab. + id: SecHypo + components: + - type: Sprite + layers: + - state: security-base + - state: cartridge1 + map: ["enum.SolutionContainerLayers.Fill"] + visible: false + +- type: entity + name: medical cartridge autoinjector + parent: [ BaseCartridgeAutoinjector , BaseMedicalContraband ] + description: Used for rapid administration of medicine. Uses cartridges printable at the medical techfab. + id: ParamedHypo + components: + - type: Sprite + layers: + - state: medical-base + - state: cartridge1 + map: ["enum.SolutionContainerLayers.Fill"] + visible: false + +# Autoinjector Cartridges + +- type: entity + name: autoinjector cartridge + parent: BaseItem + description: Used in a cartridge autoinjector. + id: BaseAutoinjectorCartridge + abstract: true + components: + - type: Item + size: Tiny + - type: Sprite + sprite: _Goobstation/Objects/Specific/Medical/cartridge.rsi + layers: + - state: base + - state: filling + color: "#ffffff" + - type: SolutionCartridge + targetSolution: hypospray + solution: + maxVol: 10 + - type: Tag + tags: + - AutoinjectorCartridge + +- type: entity + name: adrenaline autoinjector cartridge + parent: [ BaseSecurityMedicalContraband , BaseAutoinjectorCartridge ] + description: Contains 7u of epinephrine and 3u of tranexamic acid, used in a cartridge autoinjector. + id: CartridgeEpinephrine + components: + - type: Sprite + layers: + - state: base + - state: filling + color: "#cad8d4" + - type: SolutionCartridge + targetSolution: hypospray + solution: + maxVol: 10 + reagents: + - ReagentId: Epinephrine + Quantity: 7 + - ReagentId: TranexamicAcid + Quantity: 3 # Fully stops bleeding + +- type: entity + name: airloss autoinjector cartridge + parent: [ BaseSecurityMedicalContraband , BaseAutoinjectorCartridge ] + description: Contains 7u of saline and 3u of dexalin plus, used in a cartridge autoinjector. + id: CartridgeSaline + components: + - type: Sprite + layers: + - state: base + - state: filling + color: "#1776c4" + - type: SolutionCartridge + targetSolution: hypospray + solution: + maxVol: 10 + reagents: + - ReagentId: Saline + Quantity: 7 + - ReagentId: Convermol # DeltaV - DexalinPlus to Convermol + Quantity: 3 + +- type: entity + name: brute autoinjector cartridge + parent: [ BaseSecurityMedicalContraband , BaseAutoinjectorCartridge ] + description: Contains 4u of bicaridine, 3u of bozaide, 2u of salicylic acid and 1u of tranexamic acid, used in a cartridge autoinjector. + id: CartridgeBicaridine + components: + - type: Sprite + layers: + - state: base + - state: filling + color: "#c5932d" + - type: SolutionCartridge + targetSolution: hypospray + solution: + maxVol: 10 + reagents: + - ReagentId: Bicaridine # DeltaV - Replace Bozaide with more Bicaridine + Quantity: 7 + - ReagentId: SalicylicAcid + Quantity: 2 + - ReagentId: TranexamicAcid + Quantity: 1 # Stops 30% of maximum bleeding + # Finely tuned mix, heals up to 98 total brute split between 3 types, equivalent of 3.23 brute packs + +- type: entity + name: burn autoinjector cartridge + parent: [ BaseSecurityMedicalContraband , BaseAutoinjectorCartridge ] + description: Contains 4u of kelotane, 3u of dermaline, 2u of oxandrolone and 1u of sigynate, used in a cartridge autoinjector. + id: CartridgeDermaline + components: + - type: Sprite + layers: + - state: base + - state: filling + color: "#956960" + - type: SolutionCartridge + targetSolution: hypospray + solution: + maxVol: 10 + reagents: + - ReagentId: Kelotane + Quantity: 4 + - ReagentId: Dermaline + Quantity: 3 + - ReagentId: Oxandrolone + Quantity: 2 + - ReagentId: Sigynate + Quantity: 1 + # Finely tuned mix, heals up to 114 total burn split between 4 types, twice as good for heat/cold/shock than for caustic, equivalent of 3.25 ointments + +- type: entity + name: piercing autoinjector cartridge + parent: [ BaseSyndicateContraband , BaseAutoinjectorCartridge ] + description: Contains 10u of puncturase, used in a cartridge autoinjector. + id: CartridgePuncturase + components: + - type: Sprite + layers: + - state: base + - state: filling + color: "#b9bf93" + - type: SolutionCartridge + targetSolution: hypospray + solution: + maxVol: 10 + reagents: + - ReagentId: Puncturase + Quantity: 10 + +- type: entity + name: stimulant autoinjector cartridge + parent: [ BaseSyndicateContraband , BaseAutoinjectorCartridge ] + description: Contains 10u of ephedrine, used in a cartridge autoinjector. + id: CartridgeEphedrine + components: + - type: Sprite + layers: + - state: base + - state: filling + color: "#d2fffa" + - type: SolutionCartridge + targetSolution: hypospray + solution: + maxVol: 10 + reagents: + - ReagentId: Ephedrine + Quantity: 10 diff --git a/Resources/Prototypes/_Goobstation/Entities/Objects/base_contraband.yml b/Resources/Prototypes/_Goobstation/Entities/Objects/base_contraband.yml new file mode 100644 index 000000000000..4e102dad6fe9 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Entities/Objects/base_contraband.yml @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +- type: entity + id: BaseSecurityMedicalContraband + parent: BaseRestrictedContraband + abstract: true + components: + - type: Contraband + allowedDepartments: [ Security, Medical ] diff --git a/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/medical.yml b/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/medical.yml new file mode 100644 index 000000000000..0fcbb8c6205b --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/medical.yml @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aidenkrz +# SPDX-FileCopyrightText: 2025 GoobBot +# SPDX-FileCopyrightText: 2025 PunishedJoe +# SPDX-FileCopyrightText: 2025 SX_7 +# SPDX-FileCopyrightText: 2025 Solstice +# SPDX-FileCopyrightText: 2025 SolsticeOfTheWinter +# SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Thom <119594676+ItsMeThom@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 pheenty +# +# SPDX-License-Identifier: AGPL-3.0-or-later +## Static +- type: latheRecipePack + id: ParamedHypoStatic + recipes: + - CartridgeEpinephrine + - CartridgeBicaridine + - CartridgeDermaline + - CartridgeSaline + - ParamedHypo diff --git a/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/misc.yml b/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/misc.yml new file mode 100644 index 000000000000..fd63606d55b3 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/misc.yml @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 GoobBot +# SPDX-FileCopyrightText: 2025 PunishedJoe +# SPDX-FileCopyrightText: 2025 SX_7 +# SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +## Static + +- type: latheRecipePack + id: SyndicateCatridgesStatic + recipes: + - CartridgeEphedrine + - CartridgePuncturase diff --git a/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/security.yml b/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/security.yml new file mode 100644 index 000000000000..d3b35ed9b783 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/security.yml @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aidenkrz +# SPDX-FileCopyrightText: 2025 Creatorbot01 +# SPDX-FileCopyrightText: 2025 SX_7 +# SPDX-FileCopyrightText: 2025 Solstice +# SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 pheenty +# +# SPDX-License-Identifier: AGPL-3.0-or-later +## Static +- type: latheRecipePack + id: SecurityHypoStatic + recipes: + - CartridgeEpinephrine + - CartridgeBicaridine + - CartridgeDermaline + - CartridgeSaline + - SecHypo diff --git a/Resources/Prototypes/_Goobstation/Recipes/Lathes/medical.yml b/Resources/Prototypes/_Goobstation/Recipes/Lathes/medical.yml new file mode 100644 index 000000000000..b22febe3961f --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Recipes/Lathes/medical.yml @@ -0,0 +1,26 @@ +# SPDX-FileCopyrightText: 2024 BombasterDS <115770678+BombasterDS@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 Piras314 +# SPDX-FileCopyrightText: 2024 Scruq445 +# SPDX-FileCopyrightText: 2024 a_person <40855173+a-person5660@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 gluesniffler <159397573+gluesniffler@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aiden +# SPDX-FileCopyrightText: 2025 Aidenkrz +# SPDX-FileCopyrightText: 2025 BombasterDS2 +# SPDX-FileCopyrightText: 2025 GoobBot +# SPDX-FileCopyrightText: 2025 Solstice +# SPDX-FileCopyrightText: 2025 SolsticeOfTheWinter +# SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Thom <119594676+ItsMeThom@users.noreply.github.com> +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +- type: latheRecipe + id: ParamedHypo + result: ParamedHypo + completetime: 3 + materials: + Steel: 1500 + Plastic: 800 + Glass: 1200 + Gold: 500 diff --git a/Resources/Prototypes/_Goobstation/Recipes/Lathes/security.yml b/Resources/Prototypes/_Goobstation/Recipes/Lathes/security.yml new file mode 100644 index 000000000000..d71a2f04f474 --- /dev/null +++ b/Resources/Prototypes/_Goobstation/Recipes/Lathes/security.yml @@ -0,0 +1,85 @@ +# SPDX-FileCopyrightText: 2024 NULL882 +# SPDX-FileCopyrightText: 2024 Remuchi <72476615+Remuchi@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 VMSolidus +# SPDX-FileCopyrightText: 2024 a_person <40855173+a-person5660@users.noreply.github.com> +# SPDX-FileCopyrightText: 2024 gluesniffler <159397573+gluesniffler@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aiden +# SPDX-FileCopyrightText: 2025 Aidenkrz +# SPDX-FileCopyrightText: 2025 Aviu00 <93730715+Aviu00@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 BombasterDS +# SPDX-FileCopyrightText: 2025 BombasterDS2 +# SPDX-FileCopyrightText: 2025 Creatorbot01 +# SPDX-FileCopyrightText: 2025 Fishbait +# SPDX-FileCopyrightText: 2025 GoobBot +# SPDX-FileCopyrightText: 2025 Piras314 +# SPDX-FileCopyrightText: 2025 PunishedJoe +# SPDX-FileCopyrightText: 2025 SX_7 +# SPDX-FileCopyrightText: 2025 Solstice +# SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Theodore Lukin <66275205+pheenty@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 fishbait +# SPDX-FileCopyrightText: 2025 pheenty +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +- type: latheRecipe + id: CartridgeEpinephrine + result: CartridgeEpinephrine + completetime: 1 + materials: + Steel: 100 + Glass: 300 + +- type: latheRecipe + id: CartridgeBicaridine + result: CartridgeBicaridine + completetime: 1 + materials: + Steel: 100 + Glass: 300 + +- type: latheRecipe + id: CartridgeDermaline + result: CartridgeDermaline + completetime: 1 + materials: + Steel: 100 + Glass: 300 + +- type: latheRecipe + id: CartridgeSaline + result: CartridgeSaline + completetime: 1 + materials: + Steel: 100 + Glass: 300 + +- type: latheRecipe + id: CartridgeEphedrine + result: CartridgeEphedrine + completetime: 1 + materials: + Steel: 200 + Glass: 400 + Plasma: 200 + +- type: latheRecipe + id: CartridgePuncturase + result: CartridgePuncturase + completetime: 1 + materials: + Steel: 200 + Glass: 400 + Plasma: 200 + +- type: latheRecipe + id: SecHypo + result: SecHypo + completetime: 3 + materials: + Steel: 1500 + Plastic: 800 + Glass: 1200 + Gold: 500 + Silver: 500 diff --git a/Resources/Prototypes/_Goobstation/tags.yml b/Resources/Prototypes/_Goobstation/tags.yml index 9a4c789d38bf..223bbcb57e5d 100644 --- a/Resources/Prototypes/_Goobstation/tags.yml +++ b/Resources/Prototypes/_Goobstation/tags.yml @@ -21,3 +21,9 @@ - type: Tag id: Tongue + +- type: Tag + id: AutoinjectorCartridge + +- type: Tag + id: Tourniquet diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/cartridge1.png b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/cartridge1.png new file mode 100644 index 000000000000..72093b05f81f Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/cartridge1.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/inhand-left.png b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/inhand-left.png new file mode 100644 index 000000000000..062b4117277d Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/inhand-left.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/inhand-right.png b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/inhand-right.png new file mode 100644 index 000000000000..37eb7e8d4c1a Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/inhand-right.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/medical-base.png b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/medical-base.png new file mode 100644 index 000000000000..e3da8913af79 Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/medical-base.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/meta.json b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/meta.json new file mode 100644 index 000000000000..887a4ae51071 --- /dev/null +++ b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/meta.json @@ -0,0 +1,28 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from YogStation at https://github.com/yogstation13/Yogstation at b38f136e1e3b587de23956df450e6d320046bc2b, modified by a_person5660/ReggieTheRat, split to layers pheenty", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "security-base" + }, + { + "name": "medical-base" + }, + { + "name": "cartridge1" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/security-base.png b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/security-base.png new file mode 100644 index 000000000000..01ceadae5147 Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Medical/autoinjector.rsi/security-base.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Medical/cartridge.rsi/base.png b/Resources/Textures/_Goobstation/Objects/Specific/Medical/cartridge.rsi/base.png new file mode 100644 index 000000000000..6c98ee9fa584 Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Medical/cartridge.rsi/base.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Medical/cartridge.rsi/filling.png b/Resources/Textures/_Goobstation/Objects/Specific/Medical/cartridge.rsi/filling.png new file mode 100644 index 000000000000..9f04a57f915a Binary files /dev/null and b/Resources/Textures/_Goobstation/Objects/Specific/Medical/cartridge.rsi/filling.png differ diff --git a/Resources/Textures/_Goobstation/Objects/Specific/Medical/cartridge.rsi/meta.json b/Resources/Textures/_Goobstation/Objects/Specific/Medical/cartridge.rsi/meta.json new file mode 100644 index 000000000000..80c0f9a77790 --- /dev/null +++ b/Resources/Textures/_Goobstation/Objects/Specific/Medical/cartridge.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Original sprite by ReggieTheRat/a_person5660; reworked to work with layers by pheenty", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "filling" + } + ] +}