From 6567fa36e468ca0b2091a862609ee82b77f3d277 Mon Sep 17 00:00:00 2001 From: to4no_fix <156101927+chavonadelal@users.noreply.github.com> Date: Thu, 15 Aug 2024 17:30:39 +0300 Subject: [PATCH] Adding shock collar and electropack (#30529) * Adding shock collar with the new ShockOnTrigger * Cleaning and updating the shock collar * Add StripDelay datafield to ClothingComponent * Adding SelfUnremovableClothingComponent * ShockCollar Update * Correction of the shock collar * Correction of the shock collar 2 * Renaming the DamageSpecifier DataField to Damage * Fixing the damage field in ShockCollar * Cleaning the ShockCollar * Renaming ShockCollar to ClothingNeckShockCollar * Adding ClothingNeckShockCollar as a stealTarget to a thief * Fixing a typo of the sprite path in ClothingNeckShockCollar * Cleaning the ShockOnTriggerComponent * Revision of SelfUnremovableClothing * Adding a ClothingBackpackElectropack * Sprite fix * Code review * Shock Collar sprite update * add commit hash --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --- .../Components/ShockOnTriggerComponent.cs | 37 ++++++++++++++++++ .../Explosion/EntitySystems/TriggerSystem.cs | 22 +++++++++++ Content.Server/Strip/StrippableSystem.cs | 8 ++-- .../Clothing/Components/ClothingComponent.cs | 7 ++++ .../SelfUnremovableClothingComponent.cs | 18 +++++++++ .../Clothing/EntitySystems/ClothingSystem.cs | 8 ++++ .../SelfUnremovableClothingSystem.cs | 36 +++++++++++++++++ .../EntitySystems/ToggleableClothingSystem.cs | 2 +- .../Strip/Components/StrippableComponent.cs | 9 +++++ .../Strip/SharedStrippableSystem.cs | 16 +++++--- .../self-unremovable-clothing-component.ftl | 1 + .../Locale/en-US/research/technologies.ftl | 1 + .../Catalog/Fills/Lockers/security.yml | 8 ++++ .../Entities/Clothing/Back/backpacks.yml | 23 +++++++++++ .../Entities/Objects/Devices/shock_collar.yml | 36 +++++++++++++++++ .../Entities/Structures/Machines/lathe.yml | 3 +- .../Prototypes/Objectives/objectiveGroups.yml | 1 + .../Objectives/stealTargetGroups.yml | 7 ++++ Resources/Prototypes/Objectives/thief.yml | 11 ++++++ .../Prototypes/Recipes/Lathes/security.yml | 19 ++++++--- Resources/Prototypes/Research/arsenal.yml | 22 ++++++++--- .../electropack.rsi/equipped-BACKPACK.png | Bin 0 -> 594 bytes .../Back/Backpacks/electropack.rsi/icon.png | Bin 0 -> 457 bytes .../Backpacks/electropack.rsi/inhand-left.png | Bin 0 -> 432 bytes .../electropack.rsi/inhand-right.png | Bin 0 -> 441 bytes .../Back/Backpacks/electropack.rsi/meta.json | 33 ++++++++++++++++ .../Misc/shock_collar.rsi/equipped-NECK.png | Bin 0 -> 465 bytes .../Neck/Misc/shock_collar.rsi/icon.png | Bin 0 -> 800 bytes .../Neck/Misc/shock_collar.rsi/meta.json | 19 +++++++++ 29 files changed, 326 insertions(+), 21 deletions(-) create mode 100644 Content.Server/Explosion/Components/ShockOnTriggerComponent.cs create mode 100644 Content.Shared/Clothing/Components/SelfUnremovableClothingComponent.cs create mode 100644 Content.Shared/Clothing/EntitySystems/SelfUnremovableClothingSystem.cs create mode 100644 Resources/Locale/en-US/clothing/components/self-unremovable-clothing-component.ftl create mode 100644 Resources/Prototypes/Entities/Objects/Devices/shock_collar.yml create mode 100644 Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/equipped-BACKPACK.png create mode 100644 Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Neck/Misc/shock_collar.rsi/equipped-NECK.png create mode 100644 Resources/Textures/Clothing/Neck/Misc/shock_collar.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Neck/Misc/shock_collar.rsi/meta.json diff --git a/Content.Server/Explosion/Components/ShockOnTriggerComponent.cs b/Content.Server/Explosion/Components/ShockOnTriggerComponent.cs new file mode 100644 index 0000000000..a553cc047a --- /dev/null +++ b/Content.Server/Explosion/Components/ShockOnTriggerComponent.cs @@ -0,0 +1,37 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Content.Server.Explosion.EntitySystems; + +namespace Content.Server.Explosion.Components; + +/// +/// A component that electrocutes an entity having this component when a trigger is triggered. +/// +[RegisterComponent, AutoGenerateComponentPause] +[Access(typeof(TriggerSystem))] +public sealed partial class ShockOnTriggerComponent : Component +{ + /// + /// The force of an electric shock when the trigger is triggered. + /// + [DataField] + public int Damage = 5; + + /// + /// Duration of electric shock when the trigger is triggered. + /// + [DataField] + public TimeSpan Duration = TimeSpan.FromSeconds(2); + + /// + /// The minimum delay between repeating triggers. + /// + [DataField] + public TimeSpan Cooldown = TimeSpan.FromSeconds(4); + + /// + /// When can the trigger run again? + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + [AutoPausedField] + public TimeSpan NextTrigger = TimeSpan.Zero; +} diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index 92e065bf4c..1208cd1771 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Body.Systems; using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Explosion.Components; using Content.Server.Flash; +using Content.Server.Electrocution; using Content.Server.Pinpointer; using Content.Shared.Flash.Components; using Content.Server.Radio.EntitySystems; @@ -33,6 +34,7 @@ using Robust.Shared.Random; using Robust.Shared.Player; using Content.Shared.Coordinates; using Robust.Shared.Utility; +using Robust.Shared.Timing; namespace Content.Server.Explosion.EntitySystems { @@ -75,6 +77,7 @@ namespace Content.Server.Explosion.EntitySystems [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly ElectrocutionSystem _electrocution = default!; public override void Initialize() { @@ -104,6 +107,7 @@ namespace Content.Server.Explosion.EntitySystems SubscribeLocalEvent(OnAnchorTrigger); SubscribeLocalEvent(OnSoundTrigger); + SubscribeLocalEvent(HandleShockTrigger); SubscribeLocalEvent(HandleRattleTrigger); } @@ -120,6 +124,24 @@ namespace Content.Server.Explosion.EntitySystems } } + private void HandleShockTrigger(Entity shockOnTrigger, ref TriggerEvent args) + { + if (!_container.TryGetContainingContainer(shockOnTrigger, out var container)) + return; + + var containerEnt = container.Owner; + var curTime = _timing.CurTime; + + if (curTime < shockOnTrigger.Comp.NextTrigger) + { + // The trigger's on cooldown. + return; + } + + _electrocution.TryDoElectrocution(containerEnt, null, shockOnTrigger.Comp.Damage, shockOnTrigger.Comp.Duration, true); + shockOnTrigger.Comp.NextTrigger = curTime + shockOnTrigger.Comp.Cooldown; + } + private void OnAnchorTrigger(EntityUid uid, AnchorOnTriggerComponent component, TriggerEvent args) { var xform = Transform(uid); diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 194df7b3d0..6d728df9d6 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -218,7 +218,7 @@ namespace Content.Server.Strip return; } - var (time, stealth) = GetStripTimeModifiers(user, target, slotDef.StripTime); + var (time, stealth) = GetStripTimeModifiers(user, target, held, slotDef.StripTime); if (!stealth) _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert", ("user", Identity.Entity(user, EntityManager)), ("item", user.Comp.ActiveHandEntity!.Value)), target, target, PopupType.Large); @@ -306,7 +306,7 @@ namespace Content.Server.Strip return; } - var (time, stealth) = GetStripTimeModifiers(user, target, slotDef.StripTime); + var (time, stealth) = GetStripTimeModifiers(user, target, item, slotDef.StripTime); if (!stealth) { @@ -411,7 +411,7 @@ namespace Content.Server.Strip if (!CanStripInsertHand(user, target, held, handName)) return; - var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); + var (time, stealth) = GetStripTimeModifiers(user, target, null, targetStrippable.HandStripDelay); if (!stealth) _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert-hand", ("user", Identity.Entity(user, EntityManager)), ("item", user.Comp.ActiveHandEntity!.Value)), target, target, PopupType.Large); @@ -510,7 +510,7 @@ namespace Content.Server.Strip if (!CanStripRemoveHand(user, target, item, handName)) return; - var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); + var (time, stealth) = GetStripTimeModifiers(user, target, null, targetStrippable.HandStripDelay); if (!stealth) _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target); diff --git a/Content.Shared/Clothing/Components/ClothingComponent.cs b/Content.Shared/Clothing/Components/ClothingComponent.cs index 581125d4fe..4f8058dbf5 100644 --- a/Content.Shared/Clothing/Components/ClothingComponent.cs +++ b/Content.Shared/Clothing/Components/ClothingComponent.cs @@ -69,6 +69,13 @@ public sealed partial class ClothingComponent : Component [DataField, ViewVariables(VVAccess.ReadWrite)] public TimeSpan UnequipDelay = TimeSpan.Zero; + + /// + /// Offset for the strip time for an entity with this component. + /// Only applied when it is being equipped or removed by another player. + /// + [DataField] + public TimeSpan StripDelay = TimeSpan.Zero; } [Serializable, NetSerializable] diff --git a/Content.Shared/Clothing/Components/SelfUnremovableClothingComponent.cs b/Content.Shared/Clothing/Components/SelfUnremovableClothingComponent.cs new file mode 100644 index 0000000000..1d624516ec --- /dev/null +++ b/Content.Shared/Clothing/Components/SelfUnremovableClothingComponent.cs @@ -0,0 +1,18 @@ +using Content.Shared.Clothing.EntitySystems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Clothing.Components; + +/// +/// The component prohibits the player from taking off clothes on them that have this component. +/// +/// +/// See also ClothingComponent.EquipDelay if you want the clothes that the player cannot take off by himself to be put on by the player with a delay. +/// +[NetworkedComponent] +[RegisterComponent] +[Access(typeof(SelfUnremovableClothingSystem))] +public sealed partial class SelfUnremovableClothingComponent : Component +{ + +} diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index 082b040a32..3b26360f10 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Interaction.Events; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Item; +using Content.Shared.Strip.Components; using Robust.Shared.Containers; using Robust.Shared.GameStates; @@ -32,6 +33,8 @@ public abstract class ClothingSystem : EntitySystem SubscribeLocalEvent(OnEquipDoAfter); SubscribeLocalEvent(OnUnequipDoAfter); + + SubscribeLocalEvent(OnItemStripped); } private void OnUseInHand(Entity ent, ref UseInHandEvent args) @@ -192,6 +195,11 @@ public abstract class ClothingSystem : EntitySystem _handsSystem.TryPickup(args.User, ent); } + private void OnItemStripped(Entity ent, ref BeforeItemStrippedEvent args) + { + args.Additive += ent.Comp.StripDelay; + } + private void CheckEquipmentForLayerHide(EntityUid equipment, EntityUid equipee) { if (TryComp(equipment, out HideLayerClothingComponent? clothesComp) && TryComp(equipee, out HumanoidAppearanceComponent? appearanceComp)) diff --git a/Content.Shared/Clothing/EntitySystems/SelfUnremovableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/SelfUnremovableClothingSystem.cs new file mode 100644 index 0000000000..ab0c41c5c7 --- /dev/null +++ b/Content.Shared/Clothing/EntitySystems/SelfUnremovableClothingSystem.cs @@ -0,0 +1,36 @@ +using Content.Shared.Clothing.Components; +using Content.Shared.Examine; +using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; + +namespace Content.Shared.Clothing.EntitySystems; + +/// +/// A system for the operation of a component that prohibits the player from taking off his own clothes that have this component. +/// +public sealed class SelfUnremovableClothingSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUnequip); + SubscribeLocalEvent(OnUnequipMarkup); + } + + private void OnUnequip(Entity selfUnremovableClothing, ref BeingUnequippedAttemptEvent args) + { + if (TryComp(selfUnremovableClothing, out var clothing) && (clothing.Slots & args.SlotFlags) == SlotFlags.NONE) + return; + + if (args.UnEquipTarget == args.Unequipee) + { + args.Cancel(); + } + } + + private void OnUnequipMarkup(Entity selfUnremovableClothing, ref ExaminedEvent args) + { + args.PushMarkup(Loc.GetString("comp-self-unremovable-clothing")); + } +} diff --git a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs index c828b22481..aa3381c6bf 100644 --- a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs @@ -95,7 +95,7 @@ public sealed class ToggleableClothingSystem : EntitySystem if (component.StripDelay == null) return; - var (time, stealth) = _strippable.GetStripTimeModifiers(user, wearer, component.StripDelay.Value); + var (time, stealth) = _strippable.GetStripTimeModifiers(user, wearer, item, component.StripDelay.Value); var args = new DoAfterArgs(EntityManager, user, time, new ToggleClothingDoAfterEvent(), item, wearer, item) { diff --git a/Content.Shared/Strip/Components/StrippableComponent.cs b/Content.Shared/Strip/Components/StrippableComponent.cs index 4faca4d8f2..5191b3f3f9 100644 --- a/Content.Shared/Strip/Components/StrippableComponent.cs +++ b/Content.Shared/Strip/Components/StrippableComponent.cs @@ -44,6 +44,15 @@ namespace Content.Shared.Strip.Components public SlotFlags TargetSlots { get; } = SlotFlags.GLOVES; } + /// + /// Used to modify strip times. Raised directed at the item being stripped. + /// + /// + /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. + /// + [ByRefEvent] + public sealed class BeforeItemStrippedEvent(TimeSpan initialTime, bool stealth = false) : BaseBeforeStripEvent(initialTime, stealth); + /// /// Used to modify strip times. Raised directed at the user. /// diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index e42f6e3aa7..935dc33540 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -28,13 +28,19 @@ public abstract class SharedStrippableSystem : EntitySystem args.Handled = true; } - public (TimeSpan Time, bool Stealth) GetStripTimeModifiers(EntityUid user, EntityUid target, TimeSpan initialTime) + /// + /// Modify the strip time via events. Raised directed at the item being stripped, the player stripping someone and the player being stripped. + /// + public (TimeSpan Time, bool Stealth) GetStripTimeModifiers(EntityUid user, EntityUid targetPlayer, EntityUid? targetItem, TimeSpan initialTime) { - var userEv = new BeforeStripEvent(initialTime); + var itemEv = new BeforeItemStrippedEvent(initialTime, false); + if (targetItem != null) + RaiseLocalEvent(targetItem.Value, ref itemEv); + var userEv = new BeforeStripEvent(itemEv.Time, itemEv.Stealth); RaiseLocalEvent(user, ref userEv); - var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ref ev); - return (ev.Time, ev.Stealth); + var targetEv = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); + RaiseLocalEvent(targetPlayer, ref targetEv); + return (targetEv.Time, targetEv.Stealth); } private void OnDragDrop(EntityUid uid, StrippableComponent component, ref DragDropDraggedEvent args) diff --git a/Resources/Locale/en-US/clothing/components/self-unremovable-clothing-component.ftl b/Resources/Locale/en-US/clothing/components/self-unremovable-clothing-component.ftl new file mode 100644 index 0000000000..bb7ff0206f --- /dev/null +++ b/Resources/Locale/en-US/clothing/components/self-unremovable-clothing-component.ftl @@ -0,0 +1 @@ +comp-self-unremovable-clothing = This cannot be removed without outside help. diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index 4fbb0e1bd3..0b0970ec08 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -26,6 +26,7 @@ research-technology-salvage-weapons = Salvage Weapons research-technology-draconic-munitions = Draconic Munitions research-technology-uranium-munitions = Uranium Munitions research-technology-explosive-technology = Explosive Technology +research-technology-special-means = Special Means research-technology-weaponized-laser-manipulation = Weaponized Laser Manipulation research-technology-nonlethal-ammunition = Nonlethal Ammunition research-technology-practice-ammunition = Practice Ammunition diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml index 2d012128e6..b72fce1107 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml @@ -20,6 +20,10 @@ - id: ClothingOuterHardsuitWarden - id: HoloprojectorSecurity - id: BookSpaceLaw + - id: ClothingNeckShockCollar + amount: 2 + - id: RemoteSignaller + amount: 2 - type: entity id: LockerWardenFilled @@ -42,6 +46,10 @@ - id: DoorRemoteArmory - id: HoloprojectorSecurity - id: BookSpaceLaw + - id: ClothingNeckShockCollar + amount: 2 + - id: RemoteSignaller + amount: 2 - type: entity id: LockerSecurityFilled diff --git a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml index 2d5bf42466..f94b773886 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml @@ -314,6 +314,29 @@ - type: Unremoveable deleteOnDrop: false +- type: entity + parent: ClothingBackpack + id: ClothingBackpackElectropack + name: electropack + suffix: SelfUnremovable + description: Shocks on the signal. It is used to keep a particularly dangerous criminal under control. + components: + - type: Sprite + sprite: Clothing/Back/Backpacks/electropack.rsi + state: icon + - type: Clothing + stripDelay: 10 + equipDelay: 5 # to avoid accidentally falling into the trap associated with SelfUnremovableClothing + - type: SelfUnremovableClothing + - type: ShockOnTrigger + damage: 5 + duration: 3 + cooldown: 4 + - type: TriggerOnSignal + - type: DeviceLinkSink + ports: + - Trigger + # Debug - type: entity parent: ClothingBackpack diff --git a/Resources/Prototypes/Entities/Objects/Devices/shock_collar.yml b/Resources/Prototypes/Entities/Objects/Devices/shock_collar.yml new file mode 100644 index 0000000000..22f2d097fc --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/shock_collar.yml @@ -0,0 +1,36 @@ +- type: entity + parent: Clothing + id: ClothingNeckShockCollar + name: shock collar + suffix: SelfUnremovable + description: An electric collar that shocks on the signal. + components: + - type: Item + size: Small + - type: Sprite + sprite: Clothing/Neck/Misc/shock_collar.rsi + state: icon + - type: Clothing + sprite: Clothing/Neck/Misc/shock_collar.rsi + stripDelay: 10 + equipDelay: 5 # to avoid accidentally falling into the trap associated with SelfUnremovableClothing + quickEquip: true + slots: + - neck + - type: SelfUnremovableClothing + - type: ShockOnTrigger + damage: 5 + duration: 3 + cooldown: 4 + - type: TriggerOnSignal + - type: DeviceLinkSink + ports: + - Trigger + - type: GuideHelp + guides: + - Security + - type: StealTarget + stealGroup: ClothingNeckShockCollar + - type: Tag + tags: + - WhitelistChameleon diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 98d5440e3e..e795a5836e 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -16,7 +16,7 @@ mask: - MachineMask layer: - - MachineLayer + - MachineLayer - type: Lathe - type: MaterialStorage - type: Destructible @@ -808,6 +808,7 @@ - WeaponLaserCannon - WeaponLaserCarbine - WeaponXrayCannon + - ClothingBackpackElectropack - type: MaterialStorage whitelist: tags: diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index e62aa9fdf6..c692c85dff 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -73,6 +73,7 @@ ForensicScannerStealObjective: 1 #sec FlippoEngravedLighterStealObjective: 0.5 ClothingHeadHatWardenStealObjective: 1 + ClothingNeckShockCollarStealObjective: 1 ClothingOuterHardsuitVoidParamedStealObjective: 1 #med MedicalTechFabCircuitboardStealObjective: 1 ClothingHeadsetAltMedicalStealObjective: 1 diff --git a/Resources/Prototypes/Objectives/stealTargetGroups.yml b/Resources/Prototypes/Objectives/stealTargetGroups.yml index 1a9b4223cb..e818442b4c 100644 --- a/Resources/Prototypes/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/Objectives/stealTargetGroups.yml @@ -272,6 +272,13 @@ sprite: Clothing/Neck/Medals/clownmedal.rsi state: icon +- type: stealTargetGroup + id: ClothingNeckShockCollar + name: shock collar + sprite: + sprite: Clothing/Neck/Misc/shock_collar.rsi + state: icon + #Thief structures - type: stealTargetGroup diff --git a/Resources/Prototypes/Objectives/thief.yml b/Resources/Prototypes/Objectives/thief.yml index 672f9b2ba7..092a724da2 100644 --- a/Resources/Prototypes/Objectives/thief.yml +++ b/Resources/Prototypes/Objectives/thief.yml @@ -316,6 +316,17 @@ - type: Objective difficulty: 1 +- type: entity + parent: BaseThiefStealObjective + id: ClothingNeckShockCollarStealObjective + components: + - type: NotJobRequirement + job: Warden + - type: StealCondition + stealGroup: ClothingNeckShockCollar + - type: Objective + difficulty: 1 + # Structures - type: entity diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index 1e6b70f943..a54d5b6235 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -38,7 +38,7 @@ materials: Steel: 250 Plastic: 100 - + - type: latheRecipe id: WeaponLaserCarbine result: WeaponLaserCarbine @@ -89,6 +89,15 @@ Plastic: 250 Gold: 100 +- type: latheRecipe + id: ClothingBackpackElectropack + result: ClothingBackpackElectropack + completetime: 4 + materials: + Steel: 500 + Plastic: 250 + Cloth: 500 + - type: latheRecipe id: ForensicPad result: ForensicPad @@ -655,7 +664,7 @@ Steel: 1000 Glass: 500 Plastic: 500 - + - type: latheRecipe id: MagazineGrenadeEmpty result: MagazineGrenadeEmpty @@ -663,7 +672,7 @@ materials: Steel: 150 Plastic: 50 - + - type: latheRecipe id: GrenadeEMP result: GrenadeEMP @@ -672,7 +681,7 @@ Steel: 150 Plastic: 100 Glass: 20 - + - type: latheRecipe id: GrenadeBlast result: GrenadeBlast @@ -681,7 +690,7 @@ Steel: 450 Plastic: 300 Gold: 150 - + - type: latheRecipe id: GrenadeFlash result: GrenadeFlash diff --git a/Resources/Prototypes/Research/arsenal.yml b/Resources/Prototypes/Research/arsenal.yml index 1cfa1fec80..553258fdb3 100644 --- a/Resources/Prototypes/Research/arsenal.yml +++ b/Resources/Prototypes/Research/arsenal.yml @@ -58,8 +58,8 @@ cost: 5000 recipeUnlocks: - MagazineShotgunBeanbag - - BoxShellTranquilizer - - BoxBeanbag + - BoxShellTranquilizer + - BoxBeanbag - WeaponDisabler - type: technology @@ -115,6 +115,18 @@ - ExplosivePayload - ChemicalPayload +- type: technology + id: SpecialMeans + name: research-technology-special-means + icon: + sprite: Clothing/Back/Backpacks/electropack.rsi + state: icon + discipline: Arsenal + tier: 1 + cost: 5000 + recipeUnlocks: + - ClothingBackpackElectropack + # Tier 2 - type: technology @@ -144,7 +156,7 @@ - type: technology id: BasicShuttleArmament name: research-technology-basic-shuttle-armament - icon: + icon: sprite: Structures/Power/cage_recharger.rsi state: full discipline: Arsenal @@ -189,11 +201,11 @@ cost: 15000 recipeUnlocks: - WeaponLaserSvalinn - + - type: technology id: AdvancedShuttleWeapon name: research-technology-advanced-shuttle-weapon - icon: + icon: sprite: Objects/Weapons/Guns/Ammunition/Magazine/Grenade/grenade_cartridge.rsi state: icon discipline: Arsenal diff --git a/Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/equipped-BACKPACK.png b/Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/equipped-BACKPACK.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea6cdc4b05c396229eb4d75f858c4747ac93525 GIT binary patch literal 594 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0#1o(uwCM6|hWMr6`nc3Od$;im$w_w@9fIB{Zlc(}8(vzC^Y zzrX+V>C;V3)n?8pb#TzHu8MA%oui_nvTN5aFE6i(iV8nJzo@7v6%{FzjtmPI}P7M|h_-a5foPGHl3=T%mYvlE{k_8vg>s zU$1A(_{kSFm)-B)9*O!>OdQvu9AvXkzTr6XJAB?J_YKeMHvE(|S<++vO7g<~Z(^Sr z)_>P|!r-*}{4J%UQInW9*>M=@IH$BHZkWPaQ~dJYF7G_%Kkf?qT&nu7&XC-o&Z^+%K(?wqq<139DE3;I@oly48C>m*L0tIg=+E zGx~8en6KQlvvUK}ht;-BLAIVOZxlkAjwruj&)L)L8_D?2p7mX!Rjkt4`G22#&Qedv z=L%?;P|siSpV6Rq-j072Qi8xx=1Yz6O!M_+&;qhKfEWZW1y2T1p00i_>zopr0MD@O AUH||9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/icon.png b/Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b755e0082d7d553160ab8724fc32aefea508b8 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^2|%pC!3-pC$@QiIDaPU;cPEB*=VV?2Ic5PqA+Ba- zX12Dr6%`e&t*x%EuF=uaE0vWOF)^8%s;Q_*&74tMT@~%%pucL@tbk?sjx=&p~iu?XPed^+;7Anq3*n*)4W*aj>`(Q4Ii@_3L3qq_1NF4lCGCf zU}o%`(^IqN;;HE7pvKdpFF1YnNHG+wJJ4z0FzLXF-?AGrs)80ahBrToQJJd2*|W#A zA;^*Mvha+G{mlAYM!P0+@$Q+oFUGOQaA{1VH2>5fBl~A#0=&?Rk11!ob4>u@o}F@AM8D-6RQxt zWHSp}9Pf;8{ZBflvbgQ5=XRNk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1E1o(uw#>K_i+1cgf*p+6*>Rw~(KSghd%>YEF%Fw_F7+oioDvZ*SbO`=Gv0`AcR88z10tW*v3=cR zyP~y4o?9zl`ugexM)qPaew6NJn#Q+4!HFwq!4d^lFRnU)8@!2)zU(SHJUf}E^JQGy zcCf*pUExFNN7g0G0yoSg7+x~4Y~y8fuwrP;ZDyRn_k-s{`;PiWwN?xEC)`S404lnZ z7an89;Mg<0>6%?f^vc`TB^m#K-sMY;@J#ddWdH>i2M~k6rQpdR%G1@)Wt~$(69D&y Bn{xmF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/inhand-right.png b/Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..26901ce4c9aa65f2f2b4376e79e529f822edfb4a GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1E1o(uw#>K_i+1V{(V#>+MnK*HxkEf@psakba^voHh4i5TST3SGbiRXD% z0x6!7Aiv=M2*4n8|J*sCIA?)JWHAE+-(e7DJf6QI1t|E&)5S3)!u{>E(?ZP#9IlE9 zYft|FpTAT{_1Z~i^Vov0>y2|d^Y%=Td&DHpp;yrOA-sw4`cX}f4k_z~YUQ$SpirYexCX3?7e zzqd{*Fx6o-uh8&#$$ZXe<*OH~qyvEd=1Yz6O!M_+0EHU|5QD&_;K?A$)78&qol`;+ E0L)3E*8l(j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/meta.json b/Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/meta.json new file mode 100644 index 0000000000..4e7738117e --- /dev/null +++ b/Resources/Textures/Clothing/Back/Backpacks/electropack.rsi/meta.json @@ -0,0 +1,33 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/2d26ce62c273d025bed77a0e6c4bdc770b789bb0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon", + "delays": [ + [ + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Neck/Misc/shock_collar.rsi/equipped-NECK.png b/Resources/Textures/Clothing/Neck/Misc/shock_collar.rsi/equipped-NECK.png new file mode 100644 index 0000000000000000000000000000000000000000..ffca3249f13d35ed449938c85fc67b5c0e740977 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z3q4&NLn`LH zy=9o!Y#_q+z&=!8U}f>7IE~{c9L(|#xQUx7RlYeSI6=TYA>q`4mg@^R+WKVgEHvDD zY1Jdig*yM$T{$Fw+Ugkn+B?BCg0+=pp`3Mb4eyNykE#G-Cus!bxue(n@Yoc z4I3WjWdGlvw}nl!G@HG)#Czi5e;wPubJ#ZUr)xZVC|E1wer&E}gqH-H+b?@{VAz1c uqKo2e_qlSq7pxNo#spt#glC$sFM}44%>l$9a4C2)i1Kvxb6Mw<&;$VGYr@(9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Neck/Misc/shock_collar.rsi/icon.png b/Resources/Textures/Clothing/Neck/Misc/shock_collar.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e0a9cb8e4fab549dd7fe5de64098076d68774a GIT binary patch literal 800 zcmV+*1K<3KP)Px%z)3_wR9J=Wls{u6bN2Al~8x^Rx*@e4^4vUpo=M?7D666cDN4F2`Tzxr=ifn-y+?+cklb& zy>}1hm}8E=fUehM()yp1ce}?@k=|V27WZZ$^#2!&TL@tWe1tG57PmsacNU-sb-gAf zNJR#a$*iI4HJQn*;kQeW{&Uj=+@D6S0-w30lZoy5q*BY?dTHq)J4TC_dd(A5EN%fv z!)PtU@k}iNz>d-4%e#G#Ow-mwU$v)hWL889(Dj-ejV=+w^aA@c7sAA{#(}TGWMX?a zC4|Y2(Ml{uNPw=_WTmp}1=F;3J~rQwt2eN$F_txEI6MOgd~@{%2k!N&bCZe96;P?{ z#)^pT0e`lB3Z5DwQU@5akzyB48o_7Ad zMIU*mbC}q`v2#F)c;>Djr&k#c&(wSmA)Q{O+x>{9t@GWreQ?R+I1&XY5jnR99{2`Q zyS~W%#HwsLSFjc^-XkUxbiy*P$J^?Zc9GL9RCIW0O(JZ+iLn{RsaA14rN$LW=%~1 eDgXcg2mk;800000(o>TF0000