From 6db6b423f4e3b6540ec875692f3ef660fc238c31 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 3 Aug 2023 21:53:06 -0400 Subject: [PATCH] official security anti-inflatable armament (#18634) --- .../Melee/Balloon/BalloonPopperComponent.cs | 24 ++++++++ .../Melee/Balloon/BalloonPopperSystem.cs | 54 ++++++++++++++++++ Resources/Audio/Effects/attributions.yml | 5 ++ Resources/Audio/Effects/balloon-pop.ogg | Bin 0 -> 7265 bytes .../Locale/en-US/weapons/melee/melee.ftl | 2 + .../Catalog/Fills/Lockers/security.yml | 2 + .../Prototypes/Entities/Objects/Fun/toys.yml | 10 ++++ .../Entities/Objects/Weapons/Melee/needle.yml | 16 ++++++ Resources/Prototypes/tags.yml | 3 + .../Objects/Weapons/Melee/needle.rsi/icon.png | Bin 0 -> 307 bytes .../Weapons/Melee/needle.rsi/meta.json | 14 +++++ 11 files changed, 130 insertions(+) create mode 100644 Content.Server/Weapons/Melee/Balloon/BalloonPopperComponent.cs create mode 100644 Content.Server/Weapons/Melee/Balloon/BalloonPopperSystem.cs create mode 100644 Resources/Audio/Effects/balloon-pop.ogg create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Melee/needle.yml create mode 100644 Resources/Textures/Objects/Weapons/Melee/needle.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/needle.rsi/meta.json diff --git a/Content.Server/Weapons/Melee/Balloon/BalloonPopperComponent.cs b/Content.Server/Weapons/Melee/Balloon/BalloonPopperComponent.cs new file mode 100644 index 0000000000..1f7ac592fc --- /dev/null +++ b/Content.Server/Weapons/Melee/Balloon/BalloonPopperComponent.cs @@ -0,0 +1,24 @@ +using Content.Shared.Tag; +using Robust.Shared.Audio; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.Weapons.Melee.Balloon; + +/// +/// This is used for weapons that pop balloons on attack. +/// +[RegisterComponent] +public sealed class BalloonPopperComponent : Component +{ + /// + /// The tag that marks something as a balloon. + /// + [DataField("balloonTag", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string BalloonTag = "Balloon"; + + /// + /// The sound played when a balloon is popped. + /// + [DataField("popSound")] + public SoundSpecifier PopSound = new SoundPathSpecifier("/Audio/Effects/balloon-pop.ogg"); +} diff --git a/Content.Server/Weapons/Melee/Balloon/BalloonPopperSystem.cs b/Content.Server/Weapons/Melee/Balloon/BalloonPopperSystem.cs new file mode 100644 index 0000000000..d7864ba16c --- /dev/null +++ b/Content.Server/Weapons/Melee/Balloon/BalloonPopperSystem.cs @@ -0,0 +1,54 @@ +using Content.Server.Hands.Systems; +using Content.Server.Popups; +using Content.Shared.IdentityManagement; +using Content.Shared.Popups; +using Content.Shared.Tag; +using Content.Shared.Weapons.Melee.Events; + +namespace Content.Server.Weapons.Melee.Balloon; + +/// +/// This handles popping ballons when attacked with +/// +public sealed class BalloonPopperSystem : EntitySystem +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly HandsSystem _hands = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly TagSystem _tag = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnMeleeHit); + } + + private void OnMeleeHit(EntityUid uid, BalloonPopperComponent component, MeleeHitEvent args) + { + foreach (var entity in args.HitEntities) + { + foreach (var held in _hands.EnumerateHeld(entity)) + { + if (_tag.HasTag(held, component.BalloonTag)) + PopBallooon(uid, held, component); + } + + if (_tag.HasTag(entity, component.BalloonTag)) + PopBallooon(uid, entity, component); + } + } + + /// + /// Pops a target balloon, making a popup and playing a sound. + /// + public void PopBallooon(EntityUid popper, EntityUid balloon, BalloonPopperComponent? component = null) + { + if (!Resolve(popper, ref component)) + return; + + _audio.PlayPvs(component.PopSound, balloon); + _popup.PopupCoordinates(Loc.GetString("melee-balloon-pop", + ("balloon", Identity.Entity(balloon, EntityManager))), Transform(balloon).Coordinates, PopupType.Large); + QueueDel(balloon); + } +} diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 6624f15ba6..0d5702171a 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -1,3 +1,8 @@ +- files: ["balloon-pop"] + license: "CC-BY-4.0" + copyright: "Taken from Aesterial-Arts on freesound.org and converted to mono by EmoGarbage404 (github)" + source: "https://freesound.org/people/Aesterial-Arts/sounds/633835/" + - files: ["pill_insert.ogg", "pill_remove.ogg"] license: "CC-BY-NC-SA-3.0" copyright: "Amateur foley and audio editing by Bright0." diff --git a/Resources/Audio/Effects/balloon-pop.ogg b/Resources/Audio/Effects/balloon-pop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c3bb51f4e87adc812975b55491c21ef7e3524ef9 GIT binary patch literal 7265 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 FV1oKtfLj0n literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/needle.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/needle.rsi/meta.json new file mode 100644 index 0000000000..d8c80a1fd6 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Melee/needle.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Created by EmoGarbage404 (github) for Space Station 14.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + } + ] +}