diff --git a/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs b/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs index 8345aa3c3dd..1f903767b7d 100644 --- a/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs +++ b/Content.Server/Chemistry/EntitySystems/HypospraySystem.cs @@ -65,6 +65,9 @@ public void OnAfterInteract(Entity entity, ref AfterInteract public void OnAttack(Entity entity, ref MeleeHitEvent args) { + if (args.Handled) // DeltaV + return; + if (!args.HitEntities.Any()) return; diff --git a/Content.Server/_DV/Chemistry/Components/HyposprayBlockNonMobInjectionComponent.cs b/Content.Server/_DV/Chemistry/Components/HyposprayBlockNonMobInjectionComponent.cs new file mode 100644 index 00000000000..3b2cd2b18f7 --- /dev/null +++ b/Content.Server/_DV/Chemistry/Components/HyposprayBlockNonMobInjectionComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Server._DV.Chemistry.Components; + +/// +/// 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. +/// - Original Goob Author Aviu00 +/// +[RegisterComponent] +public sealed partial class HyposprayBlockNonMobInjectionComponent : Component +{ +} diff --git a/Content.Server/_DV/Chemistry/EntitySystems/HyposprayBlockNonMobInjectionSystem.cs b/Content.Server/_DV/Chemistry/EntitySystems/HyposprayBlockNonMobInjectionSystem.cs new file mode 100644 index 00000000000..7e01669fac7 --- /dev/null +++ b/Content.Server/_DV/Chemistry/EntitySystems/HyposprayBlockNonMobInjectionSystem.cs @@ -0,0 +1,43 @@ +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.Server._DV.Chemistry.Components; + +namespace Content.Server._DV.Chemistry.Systems; + +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.Server/_DV/Nutrition/Components/BlockDrinkingComponent.cs b/Content.Server/_DV/Nutrition/Components/BlockDrinkingComponent.cs new file mode 100644 index 00000000000..56b045242c9 --- /dev/null +++ b/Content.Server/_DV/Nutrition/Components/BlockDrinkingComponent.cs @@ -0,0 +1,6 @@ +namespace Content.Server._DV.Chemistry.Components; + +[RegisterComponent] +public sealed partial class BlockDrinkingComponent : Component +{ +} diff --git a/Content.Server/_DV/Nutrition/EntitySystems/BlockDrinkingSystem.cs b/Content.Server/_DV/Nutrition/EntitySystems/BlockDrinkingSystem.cs new file mode 100644 index 00000000000..4df257769a3 --- /dev/null +++ b/Content.Server/_DV/Nutrition/EntitySystems/BlockDrinkingSystem.cs @@ -0,0 +1,28 @@ +using Content.Server._DV.Chemistry.Components; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Nutrition.EntitySystems; + +namespace Content.Server._DV.Nutrition.EntitySystems; + +public sealed class BlockDrinkingSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUse, before: [typeof(SharedDrinkSystem)]); + SubscribeLocalEvent(AfterInteract, + before: [typeof(SharedDrinkSystem)]); + } + + private void OnUse(Entity entity, ref UseInHandEvent args) + { + args.Handled = true; + } + + private void AfterInteract(Entity entity, ref AfterInteractEvent args) + { + args.Handled = true; + } +} diff --git a/Content.Shared/_DV/Chemistry/Components/CartridgeFabricatorComponent.cs b/Content.Shared/_DV/Chemistry/Components/CartridgeFabricatorComponent.cs new file mode 100644 index 00000000000..8dbfe2e7a25 --- /dev/null +++ b/Content.Shared/_DV/Chemistry/Components/CartridgeFabricatorComponent.cs @@ -0,0 +1,28 @@ +using Content.Shared.FixedPoint; +using Robust.Shared.Audio; + +namespace Content.Shared._DV.Chemistry.Components; + +[RegisterComponent] +public sealed partial class CartridgeFabricatorComponent : Component +{ + [DataField] + public List GroupWhitelist = []; + + [DataField] + public List ReagentWhitelist = []; + + [DataField] + public string InputSolution = "drink"; + + [DataField] + public string OutputSolution = "cartridge"; + + public bool Emagged = false; + + [DataField] + public SoundSpecifier SuccessSound = new SoundPathSpecifier("/Audio/Machines/tray_eject.ogg"); + + [DataField] + public SoundSpecifier FailureSound = new SoundPathSpecifier("/Audio/Machines/custom_deny.ogg"); +} diff --git a/Content.Shared/_DV/Chemistry/Components/SolutionCartridgeReceiverComponent.cs b/Content.Shared/_DV/Chemistry/Components/SolutionCartridgeReceiverComponent.cs new file mode 100644 index 00000000000..23a02c8d3b5 --- /dev/null +++ b/Content.Shared/_DV/Chemistry/Components/SolutionCartridgeReceiverComponent.cs @@ -0,0 +1,27 @@ +using Content.Shared.Containers.ItemSlots; +using Content.Shared.FixedPoint; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared._DV.Chemistry.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SolutionCartridgeReceiverComponent : Component +{ + public const string CartridgeSlotId = "cartridge-slot"; + + [DataField("cartridgeSlot")] + public ItemSlot CartridgeSlot = new(); + + [DataField] + public string HypospraySolution = "hypospray"; + + [DataField] + public string CartridgeSolution = "cartridge"; + + [DataField] + public FixedPoint2 MaximumVolume = FixedPoint2.New(30); + + [DataField] + public SoundSpecifier InsertSound = new SoundPathSpecifier("/Audio/Weapons/Guns/MagIn/revolver_magin.ogg"); +} diff --git a/Content.Shared/_DV/Chemistry/Systems/CartridgeFabricatorSystem.cs b/Content.Shared/_DV/Chemistry/Systems/CartridgeFabricatorSystem.cs new file mode 100644 index 00000000000..cb022345046 --- /dev/null +++ b/Content.Shared/_DV/Chemistry/Systems/CartridgeFabricatorSystem.cs @@ -0,0 +1,144 @@ +using System.Linq; +using Content.Shared._DV.Chemistry.Components; +using Content.Shared.Power.EntitySystems; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Emag.Systems; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Interaction; +using Content.Shared.Labels.Components; +using Content.Shared.Popups; +using Content.Shared.Tag; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Prototypes; +using Robust.Shared.Network; +using Content.Shared.Labels.EntitySystems; + +namespace Content.Shared._DV.Chemistry.Systems; + +public sealed class CartridgeFabricatorSystem : EntitySystem +{ + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedSolutionContainerSystem _container = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly TagSystem _tags = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly SharedPowerReceiverSystem _power = default!; + [Dependency] private readonly SharedLabelSystem _labels = default!; + private static readonly ProtoId[] BottleTags = ["Bottle"]; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInteractUsing); + + SubscribeLocalEvent(OnAttemptEmag); + SubscribeLocalEvent(OnEmagged); + } + + private bool ContainsDisallowedReagents(CartridgeFabricatorComponent fab, Solution solution) + { + foreach (ReagentQuantity reagent in solution.Contents) + { + if (!_prototype.TryIndex(reagent.Reagent.Prototype, out var prototype) || + prototype is null) + continue; // TODO: This seems like an error case + + if (!fab.GroupWhitelist.Contains(prototype.Group) && + !fab.ReagentWhitelist.Contains(prototype.ID)) + { + return true; + } + } + + return false; + } + + private void OnInteractUsing(Entity entity, ref InteractUsingEvent args) + { + if (args.Handled || !_power.IsPowered(entity.Owner)) + return; + + if (!TryComp(args.Used, out SolutionContainerManagerComponent? manager)) + return; + + if (!_tags.HasAnyTag(args.Used, BottleTags)) + return; + + if (!_container.TryGetSolution((args.Used, manager), + entity.Comp.InputSolution, + out var _, + out var fromSolution)) + return; + + // This looks to be something we can handle + args.Handled = true; + + if (fromSolution.Volume == 0) + { + _popup.PopupClient(Loc.GetString("cartridge-fabricator-empty-input"), args.User, PopupType.Medium); + _audio.PlayPredicted(entity.Comp.FailureSound, entity.Owner, args.User); + return; + } + + // Emagging allows users to make cartridges out of anything + if (!entity.Comp.Emagged && + ContainsDisallowedReagents(entity.Comp, fromSolution)) + { + _popup.PopupClient(Loc.GetString("cartridge-fabricator-denied"), args.User, PopupType.Medium); + _audio.PlayPredicted(entity.Comp.FailureSound, entity.Owner, args.User); + return; + } + + if (_net.IsServer) + { + var coords = Transform(entity.Owner).Coordinates; + var cartridge = Spawn("BaseEmptyHypoCartridge", coords); + + var cartridgeManager = EnsureComp(cartridge); + if (!_container.TryGetSolution((cartridge, cartridgeManager), + entity.Comp.OutputSolution, + out var cartridgeSolutionEnt, + out var _)) + return; // Something very wrong here? + + if (!_container.TryAddSolution(cartridgeSolutionEnt.Value, fromSolution)) + return; + + if (TryComp(args.Used, out var bottleLabel)) + { + // Propagate the label from the bottle onto the cartridge + _labels.Label(cartridge, bottleLabel.CurrentLabel); + } + + QueueDel(args.Used); // Ensure the bottle is gone + _hands.TryPickupAnyHand(args.User, cartridge); + } + + _popup.PopupClient(Loc.GetString("cartridge-fabricator-success", ("amount", fromSolution.Volume)), + args.User, + PopupType.Medium); + _audio.PlayPredicted(entity.Comp.SuccessSound, entity.Owner, args.User); + } + + private void OnAttemptEmag(Entity entity, ref OnAttemptEmagEvent args) + { + if (entity.Comp.Emagged) + { + // No point in raising more local events when we're already emagged + args.Handled = true; + return; + } + } + + private void OnEmagged(Entity entity, ref GotEmaggedEvent args) + { + entity.Comp.Emagged = true; + args.Handled = true; + } +} diff --git a/Content.Shared/_DV/Chemistry/Systems/SolutionCartridgeReceiverSystem.cs b/Content.Shared/_DV/Chemistry/Systems/SolutionCartridgeReceiverSystem.cs new file mode 100644 index 00000000000..2a7d2c8e527 --- /dev/null +++ b/Content.Shared/_DV/Chemistry/Systems/SolutionCartridgeReceiverSystem.cs @@ -0,0 +1,100 @@ +using Content.Shared._DV.Chemistry.Components; +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.FixedPoint; +using Robust.Shared.Containers; + +namespace Content.Shared._DV.Chemistry.Systems; + +public sealed class SolutionCartridgeReceiverSystem : EntitySystem +{ + [Dependency] private readonly SharedSolutionContainerSystem _container = default!; + + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; // TODO: Use this + + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnComponentRemove); + + SubscribeLocalEvent(OnItemInserted); + SubscribeLocalEvent(OnItemRemoved); + } + + private void OnComponentInit(EntityUid uid, SolutionCartridgeReceiverComponent receiver, ComponentInit args) + { + _itemSlots.AddItemSlot(uid, SolutionCartridgeReceiverComponent.CartridgeSlotId, receiver.CartridgeSlot); + } + + private void OnComponentRemove(EntityUid uid, SolutionCartridgeReceiverComponent receiver, ComponentRemove args) + { + _itemSlots.RemoveItemSlot(uid, receiver.CartridgeSlot); + } + + private bool DrainInto(EntityUid fromEnt, string fromName, EntityUid toEnt, string toName, FixedPoint2 amount) + { + if (!TryComp(fromEnt, out SolutionContainerManagerComponent? fromManager)) + return false; + + if (!_container.TryGetSolution((fromEnt, fromManager), + fromName, + out var _, + out var fromSolution)) + return false; + + if (!TryComp(toEnt, out SolutionContainerManagerComponent? toManager)) + return false; + + if (!_container.TryGetSolution((toEnt, toManager), + toName, + out var toSolutionEnt, + out var _)) + return false; + + if (!_container.TryTransferSolution(toSolutionEnt.Value, fromSolution, amount)) + return false; + + return true; + } + + private void OnItemInserted(Entity entity, + ref EntInsertedIntoContainerMessage args) + { + var (uid, receiver) = entity; + + // Drain the newly inserted cartridge into the hypospray + if (!DrainInto(args.Entity, + receiver.CartridgeSolution, + uid, + receiver.HypospraySolution, + entity.Comp.MaximumVolume)) + { + return; + } + + // TODO: Update appearance + } + + private void OnItemRemoved(Entity entity, + ref EntRemovedFromContainerMessage args) + { + var (uid, receiver) = entity; + + // Drain the hypospray into the cartridge that's been removed + if (!DrainInto(uid, + receiver.HypospraySolution, + args.Entity, + receiver.CartridgeSolution, + entity.Comp.MaximumVolume)) + { + return; + } + + // TODO: Update appearance + } +} diff --git a/Resources/Locale/en-US/_DV/chemistry/cartridge-fabricator-component.ftl b/Resources/Locale/en-US/_DV/chemistry/cartridge-fabricator-component.ftl new file mode 100644 index 00000000000..9af8aef915e --- /dev/null +++ b/Resources/Locale/en-US/_DV/chemistry/cartridge-fabricator-component.ftl @@ -0,0 +1,3 @@ +cartridge-fabricator-success = Created a cartridge with {$amount}u +cartridge-fabricator-denied = Input contains non-medical reagents +cartridge-fabricator-empty-input = Input contains no reagents diff --git a/Resources/Prototypes/_DV/Entities/Objects/Devices/CircuitBoards/Machine/production.yml b/Resources/Prototypes/_DV/Entities/Objects/Devices/CircuitBoards/Machine/production.yml new file mode 100644 index 00000000000..9d00c5342fc --- /dev/null +++ b/Resources/Prototypes/_DV/Entities/Objects/Devices/CircuitBoards/Machine/production.yml @@ -0,0 +1,16 @@ +- type: entity + id: CartridgeFabricatorMachineCircuitboard + parent: BaseMachineCircuitboard + name: cartridge fabricator machine board + description: A machine printed circuit board for a cartridge fabricator + components: + - type: Sprite + state: service + - type: MachineBoard + prototype: CartridgeFabricator + stackRequirements: + Manipulator: 2 + Capacitor: 1 + # replacing the console screen + Glass: 1 + Cable: 2 diff --git a/Resources/Prototypes/_DV/Entities/Objects/Specific/Medical/hypospray.yml b/Resources/Prototypes/_DV/Entities/Objects/Specific/Medical/hypospray.yml new file mode 100644 index 00000000000..079dd70e4d8 --- /dev/null +++ b/Resources/Prototypes/_DV/Entities/Objects/Specific/Medical/hypospray.yml @@ -0,0 +1,105 @@ +- type: entity + id: CombatHypospray + name: combat hypospray + parent: [BaseItem, BaseRestrictedContraband] + description: A small hypospray intended for combat and rapid response teams, uses pre-built cartridges + components: + - type: Sprite + sprite: _DV/Objects/Specific/Medical/combathypo.rsi + state: hypo + - type: Item + sprite: _DV/Objects/Specific/Medical/combathypo.rsi + - type: SolutionContainerManager + solutions: + hypospray: + maxVol: 30 # Keep in sync with BaseEmptyHypoCartridge + reagents: [] + - type: ExaminableSolution + solution: hypospray + - type: Hypospray + solutionName: hypospray + transferAmount: 5 + onlyAffectsMobs: false + injectOnly: true + - type: HyposprayBlockNonMobInjection + - type: UseDelay + delay: 0.5 + - type: SolutionCartridgeReceiver + cartridgeSlot: + whitelist: + tags: + - HyposprayCartridge + - type: ContainerContainer + containers: + cartridge-slot: !type:ContainerSlot {} + +- type: entity + id: BaseEmptyHypoCartridge + name: cartridge + parent: [BaseItem, BaseRestrictedContraband] + # TODO: Make these destructible + components: + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Glass + - type: Destructible + thresholds: + - trigger: !type:DamageTrigger + damage: 5 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: GlassBreak + params: + volume: -4 + - !type:SpillBehavior + solution: cartridge + - !type:SpawnEntitiesBehavior + spawn: + ShardGlass: + min: 1 + max: 1 + transferForensics: true + - !type:DoActsBehavior + acts: ["Destruction"] + - type: DamageOnLand + damage: + types: + Blunt: 10 # glass resistance set reduces damage. Need to land twice (w/o hitting wall) + - type: DamageOtherOnHit + damage: + types: + Blunt: 5 + - type: DamageOnHighSpeedImpact + minimumSpeed: 2 + damage: + types: + Blunt: 5 + - type: SolutionContainerManager + solutions: + cartridge: + maxVol: 30 # Keep in sync with the CombatHypospray + reagents: [] + - type: Tag + tags: + - HyposprayCartridge + - type: Drink # So we can view how much is IN the cartridge + solution: cartridge + - type: BlockDrinking # So we can stop people drinking the cartridge + - type: Sprite + sprite: Objects/Specific/Chemistry/bottle.rsi + layers: + - state: bottle-1 + - state: bottle-1-1 + map: ["enum.SolutionContainerLayers.Fill"] + visible: false + - type: ExaminableSolution + solution: cartridge + - type: SolutionItemStatus + solution: cartridge + - type: SolutionContainerVisuals + maxFillLevels: 6 + fillBaseName: bottle-1- + - type: Item + size: Tiny + sprite: Objects/Specific/Chemistry/bottle.rsi diff --git a/Resources/Prototypes/_DV/Structures/Machines/cartridge_fabricator.yml b/Resources/Prototypes/_DV/Structures/Machines/cartridge_fabricator.yml new file mode 100644 index 00000000000..9414aa3ef21 --- /dev/null +++ b/Resources/Prototypes/_DV/Structures/Machines/cartridge_fabricator.yml @@ -0,0 +1,41 @@ +- type: entity + id: CartridgeFabricator + name: cartridge fabricator + parent: [BaseMachinePowered, ConstructibleMachine] + description: Converts bottles of chemicals into hypospray cartridges + components: + # TODO: Make this not the seed extractor + - type: Sprite + sprite: Structures/Machines/seed_extractor.rsi + snapCardinals: true + layers: + - state: seedextractor-off + - state: seedextractor-unlit + shader: unshaded + map: ["enum.PowerDeviceVisualLayers.Powered"] + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: !type:PhysShapeAabb + bounds: "-0.25,-0.4,0.25,0.4" + density: 190 + mask: + - MachineMask + layer: + - MachineLayer + - type: Appearance + - type: GenericVisualizer + visuals: + enum.PowerDeviceVisuals.Powered: + enum.PowerDeviceVisualLayers.Powered: + True: { visible: true } + False: { visible: false } + - type: CartridgeFabricator + groupWhitelist: + - Medicine + reagentWhitelist: + - Ephedrine + - type: Machine + board: CartridgeFabricatorMachineCircuitboard diff --git a/Resources/Prototypes/_DV/tags.yml b/Resources/Prototypes/_DV/tags.yml index 76b96a7595e..4125ab67097 100644 --- a/Resources/Prototypes/_DV/tags.yml +++ b/Resources/Prototypes/_DV/tags.yml @@ -68,7 +68,7 @@ - type: Tag id: HidesHarpyWings - + - type: Tag id: HudMedicalSecurity #Craftable Corpsman Glasses @@ -107,3 +107,6 @@ - type: Tag id: PermissibleForSurgery # Can be worn on the body during surgery + +- type: Tag + id: HyposprayCartridge diff --git a/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/borghypo.png b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/borghypo.png new file mode 100644 index 00000000000..e0eafad0f57 Binary files /dev/null and b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/borghypo.png differ diff --git a/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/borghypo_s.png b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/borghypo_s.png new file mode 100644 index 00000000000..4adc13c448a Binary files /dev/null and b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/borghypo_s.png differ diff --git a/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/combat_hypo.png b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/combat_hypo.png new file mode 100644 index 00000000000..022d0a1988a Binary files /dev/null and b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/combat_hypo.png differ diff --git a/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/equipped-BELT.png b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/equipped-BELT.png new file mode 100644 index 00000000000..ad53beead53 Binary files /dev/null and b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/equipped-BELT.png differ diff --git a/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/hypo.png b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/hypo.png new file mode 100644 index 00000000000..cab29e5b0af Binary files /dev/null and b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/hypo.png differ diff --git a/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/inhand-left.png b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/inhand-left.png new file mode 100644 index 00000000000..e2007ee06ab Binary files /dev/null and b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/inhand-left.png differ diff --git a/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/inhand-right.png b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/inhand-right.png new file mode 100644 index 00000000000..e2007ee06ab Binary files /dev/null and b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/inhand-right.png differ diff --git a/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/meta.json b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/meta.json new file mode 100644 index 00000000000..0095919b632 --- /dev/null +++ b/Resources/Textures/_DV/Objects/Specific/Medical/combathypo.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "borghypo" + }, + { + "name": "borghypo_s" + }, + { + "name": "combat_hypo" + }, + { + "name": "hypo" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BELT", + "directions": 4 + } + ] +}