diff --git a/Content.Server/White/ShockClothing/ShockClothingComponent.cs b/Content.Server/White/ShockClothing/ShockClothingComponent.cs new file mode 100644 index 0000000000..9659e05457 --- /dev/null +++ b/Content.Server/White/ShockClothing/ShockClothingComponent.cs @@ -0,0 +1,15 @@ +using Content.Shared.DeviceLinking; +using Robust.Shared.Audio; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.White.ShockClothing; + +[RegisterComponent] +public sealed partial class ShockClothingComponent : Component +{ + [DataField("triggerPort", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string TriggerPort = "Trigger"; + + [ViewVariables(VVAccess.ReadWrite), DataField("zapSound")] + public SoundSpecifier? ZapSound = new SoundPathSpecifier("/Audio/Weapons/Guns/Hits/taser_hit.ogg"); +} diff --git a/Content.Server/White/ShockClothing/ShockClothingSystem.cs b/Content.Server/White/ShockClothing/ShockClothingSystem.cs new file mode 100644 index 0000000000..46c6c8d2c0 --- /dev/null +++ b/Content.Server/White/ShockClothing/ShockClothingSystem.cs @@ -0,0 +1,42 @@ +using Content.Server.DeviceLinking.Events; +using Content.Server.DeviceLinking.Systems; +using Content.Server.Electrocution; +using Robust.Server.Containers; +using Robust.Shared.Audio.Systems; + +namespace Content.Server.White.ShockClothing; + +public sealed class ShockClothingSystem : EntitySystem +{ + [Dependency] private readonly DeviceLinkSystem _deviceLink = default!; + [Dependency] private readonly ElectrocutionSystem _electrocution = default!; + [Dependency] private readonly ContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnSignalReceived); + } + + private void OnInit(EntityUid uid, ShockClothingComponent component, ComponentInit args) + { + _deviceLink.EnsureSinkPorts(uid, component.TriggerPort); + } + + private void OnSignalReceived(EntityUid uid, ShockClothingComponent component, ref SignalReceivedEvent args) + { + if (args.Port != component.TriggerPort) + return; + + _audio.PlayPvs(component.ZapSound, uid); + + if (!_containerSystem.TryGetContainingContainer(uid, out var container)) + return; + + _electrocution.TryDoElectrocution(container.Owner, uid, 0, TimeSpan.FromSeconds(5), true, + ignoreInsulation: true); + } +} diff --git a/Resources/Locale/ru-RU/white/collars.ftl b/Resources/Locale/ru-RU/white/collars.ftl new file mode 100644 index 0000000000..9e2c38d051 --- /dev/null +++ b/Resources/Locale/ru-RU/white/collars.ftl @@ -0,0 +1,23 @@ +ent-CollarCyan = голубой ошейник + +ent-CollarYellow = желтый ошейник + +ent-CollarGreen = зеленый ошейник + +ent-CollarRed = красный ошейник + +ent-CollarLatex = латексный ошейник + +ent-CollarOrange = оранжевый ошейник + +ent-CollarWhite = белый ошейник + +ent-CollarPurple = фиолетовый ошейник + +ent-CollarBlack = черный ошейник + +ent-CollarTealblack = черный ошейник + +ent-CollarSpike = шипованный ошейник + +ent-CollarShock = шоковый ошейник diff --git a/Resources/Prototypes/White/Catalog/VendingMachines/Inventories/Kink.yml b/Resources/Prototypes/White/Catalog/VendingMachines/Inventories/Kink.yml index 70427b0df6..439e9898ee 100644 --- a/Resources/Prototypes/White/Catalog/VendingMachines/Inventories/Kink.yml +++ b/Resources/Prototypes/White/Catalog/VendingMachines/Inventories/Kink.yml @@ -10,9 +10,23 @@ ClothingHeadHatCatEars: 6 ClothingHeadHatBunny: 6 DildoHuman: 3 - DildoKnocked: 3 - DildoPlain: 3 - DildoFlared: 3 + DildoAvian: 3 + DildoDragon: 3 + DildoCanine: 3 + DildoEquine: 3 + DildoTentacle: 3 + CollarCyan: 3 + CollarYellow: 3 + CollarGreen: 3 + CollarRed: 3 + CollarLatex: 3 + CollarOrange: 3 + CollarWhite: 3 + CollarPurple: 3 + CollarBlack: 3 + CollarTealblack: 3 + CollarSpike: 3 + CollarShock: 6 Darkholme: 3 Gladiator: 3 Sexyclown: 3 diff --git a/Resources/Prototypes/White/Entities/Clothing/Neck/neck.yml b/Resources/Prototypes/White/Entities/Clothing/Neck/neck.yml index 4e9cc0925b..4f7ee32022 100644 --- a/Resources/Prototypes/White/Entities/Clothing/Neck/neck.yml +++ b/Resources/Prototypes/White/Entities/Clothing/Neck/neck.yml @@ -1,20 +1,172 @@ - type: entity parent: ClothingNeckBase - id: Choker - name: Choker + id: CollarCyan + name: cyan collar components: - type: Sprite - sprite: White/Clothing/Neck/choker.rsi + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_cyan - type: Clothing - sprite: White/Clothing/Neck/choker.rsi + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_cyan-equipped - type: entity parent: ClothingNeckBase - id: Petcollar - name: Petcollar + id: CollarYellow + name: yellow collar components: - type: Sprite - sprite: White/Clothing/Neck/petcollar.rsi + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_yellow - type: Clothing - sprite: White/Clothing/Neck/petcollar.rsi + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_yellow-equipped + +- type: entity + parent: ClothingNeckBase + id: CollarGreen + name: green collar + components: + - type: Sprite + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_green + - type: Clothing + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_green-equipped + +- type: entity + parent: ClothingNeckBase + id: CollarRed + name: red collar + components: + - type: Sprite + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_red + - type: Clothing + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_red-equipped + +- type: entity + parent: ClothingNeckBase + id: CollarLatex + name: latex collar + components: + - type: Sprite + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_latex + - type: Clothing + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_latex-equipped + +- type: entity + parent: ClothingNeckBase + id: CollarOrange + name: orange collar + components: + - type: Sprite + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_orange + - type: Clothing + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_orange-equipped + +- type: entity + parent: ClothingNeckBase + id: CollarWhite + name: white collar + components: + - type: Sprite + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_white + - type: Clothing + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_white-equipped + +- type: entity + parent: ClothingNeckBase + id: CollarPurple + name: purple collar + components: + - type: Sprite + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_purple + - type: Clothing + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_purple-equipped + +- type: entity + parent: ClothingNeckBase + id: CollarBlack + name: black collar + components: + - type: Sprite + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_black + - type: Clothing + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_black-equipped + +- type: entity + parent: ClothingNeckBase + id: CollarTealblack + name: tealblack collar + components: + - type: Sprite + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_tealblack + - type: Clothing + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_tealblack-equipped + +- type: entity + parent: ClothingNeckBase + id: CollarSpike + name: spike collar + components: + - type: Sprite + sprite: White/Clothing/Neck/lewd_neck.rsi + state: collar_spike + - type: Clothing + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: collar_spike-equipped + +- type: entity + parent: ClothingNeckBase + id: CollarShock + name: shock collar + components: + - type: Sprite + sprite: White/Clothing/Neck/lewd_neck.rsi + state: shockcollar + - type: Clothing + sprite: White/Clothing/Neck/lewd_neck.rsi + clothingVisuals: + neck: + - state: shockcollar-equipped + - type: ShockClothing + - type: DeviceLinkSink + ports: + - Trigger