From: Fahasor <70820551+Fahasor@users.noreply.github.com> Date: Fri, 12 Jan 2024 08:05:28 +0000 (+0300) Subject: Whistle for security (second try) (#23945) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=fa3da1ab825c2140c8119e723028f292a7b772c3;p=space-station-14.git Whistle for security (second try) (#23945) * Move Exclamation entity * Add Whistle Component and Whistle System * Add BaseWhistle prototype * Add sound to BaseWhistle * Add SecurityWhistle prototype * Add Sprite and Icon to SecurityWhistle * Add whistleExclamation prototype * Fix SecurityWhistle prototype Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> * Add whistles to sec vendingMachine * Revert "Add sound to BaseWhistle" This reverts commit 0c2eeab1286fb778ed7a845e59c642f667582a4a. * Add sounds for BaseWhistle * Make atributions compact * Remove unnecessary spaces * Make WhistleSystem class sealed * Remove possibility to exclamate one person from WhistleComponent * Remove delay from WhistleSystem Increase delay * Remove unnecessary HashSet * Try replace Resolve * Refactor sound emmiting * Rework spawn of exclamation * Move WhistleComponent from Server to Shared * Edit WhistleComponent because of moving * Move WhistleSystem from Server to Client * Edit WhistleSystem because of moving * Add new event * Add server part of WhistleSystem * Modify system for prediction * Add documentation to WhistleComponent * Revert "Modify system for prediction" This reverts commit 89abb290571ff47deb5491b0f720f6bde079110b. * Revert "Add server part of WhistleSystem" This reverts commit ca52ca081f30fb164f401c1818d08531f02af284. * Revert "Add new event" This reverts commit 5ca9694757c94c03ca72d5b2f56f5f23503a3263. * Move system from client to shared * Modify whistle system because of moving * Separate checks and action * Organize file folders according to conventions * Make component Networked * Change trigger component for WhistleSystem * Put indents betwen methods * Rework WhistleExclamation prototype * Change variable name * Add serializer to WhistleComponent * Rename one variable * add predict possibility to Shared * add Client part of prediction * Add Server part of prediction * Increase whistle distance * Prevent spawn for invisible entities * WhistleComponent now use file-scoped namespace * Delete unnecessary part from MakeLoudWhistle * Add Resolve check * Delete Server and Client part for prediction * Make system prediction properly * Change prediction behaviour * Fix unexpected error occured * Avoid using obsolete methods * Add comments * Update DataField to make it shorter * Update size for new size system * Prevent ping for invisible entities for real now * Avoid triggering unnecessary debug asserts --------- Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> --- diff --git a/Content.Shared/Whistle/WhistleComponent.cs b/Content.Shared/Whistle/WhistleComponent.cs new file mode 100644 index 0000000000..5004711514 --- /dev/null +++ b/Content.Shared/Whistle/WhistleComponent.cs @@ -0,0 +1,25 @@ +using Robust.Shared.GameStates; +using Content.Shared.Humanoid; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Whistle; + +/// +/// Spawn attached entity for entities in range with . +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class WhistleComponent : Component +{ + /// + /// Entity prototype to spawn + /// + [DataField] + public EntProtoId Effect = "WhistleExclamation"; + + /// + /// Range value. + /// + [DataField] + public float Distance = 0; +} diff --git a/Content.Shared/Whistle/WhistleSystem.cs b/Content.Shared/Whistle/WhistleSystem.cs new file mode 100644 index 0000000000..9db7ffa0bf --- /dev/null +++ b/Content.Shared/Whistle/WhistleSystem.cs @@ -0,0 +1,64 @@ +using Content.Shared.Coordinates; +using Content.Shared.Humanoid; +using Content.Shared.Interaction.Events; +using Content.Shared.Stealth.Components; +using JetBrains.Annotations; +using Robust.Shared.Timing; + +namespace Content.Shared.Whistle; + +public sealed class WhistleSystem : EntitySystem +{ + [Dependency] private readonly EntityLookupSystem _entityLookup = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUseInHand); + } + + private void ExclamateTarget(EntityUid target, WhistleComponent component) + { + SpawnAttachedTo(component.Effect, target.ToCoordinates()); + } + + public void OnUseInHand(EntityUid uid, WhistleComponent component, UseInHandEvent args) + { + if (!_timing.IsFirstTimePredicted) + return; + + TryMakeLoudWhistle(uid, args.User, component); + args.Handled = true; + } + + public bool TryMakeLoudWhistle(EntityUid uid, EntityUid owner, WhistleComponent? component = null) + { + if (!Resolve(uid, ref component, false) || component.Distance <= 0) + return false; + + MakeLoudWhistle(uid, owner, component); + return true; + } + + private void MakeLoudWhistle(EntityUid uid, EntityUid owner, WhistleComponent component) + { + StealthComponent? stealth = null; + + foreach (var iterator in + _entityLookup.GetEntitiesInRange(_transform.GetMapCoordinates(uid), component.Distance)) + { + //Avoid pinging invisible entities + if (TryComp(iterator, out stealth) && stealth.Enabled) + continue; + + //We don't want to ping user of whistle + if (iterator.Owner == owner) + continue; + + ExclamateTarget(iterator, component); + } + } +} diff --git a/Resources/Audio/Items/Whistle/attributions.yml b/Resources/Audio/Items/Whistle/attributions.yml new file mode 100644 index 0000000000..25a3da9174 --- /dev/null +++ b/Resources/Audio/Items/Whistle/attributions.yml @@ -0,0 +1,11 @@ +- files: + - "whistle_1.ogg" + - "whistle_2.ogg" + - "whistle_3.ogg" + - "whistle_4.ogg" + - "whistle_5.ogg" + - "whistle_6.ogg" + - "whistle_7.ogg" + license: "CC0-1.0" + copyright: "User strongbot on freesound.org. Modified by Fahasor on github" + source: "https://freesound.org/people/strongbot/sounds/568995/" \ No newline at end of file diff --git a/Resources/Audio/Items/Whistle/whistle_1.ogg b/Resources/Audio/Items/Whistle/whistle_1.ogg new file mode 100644 index 0000000000..5951dc89cb Binary files /dev/null and b/Resources/Audio/Items/Whistle/whistle_1.ogg differ diff --git a/Resources/Audio/Items/Whistle/whistle_2.ogg b/Resources/Audio/Items/Whistle/whistle_2.ogg new file mode 100644 index 0000000000..8af0d9ef54 Binary files /dev/null and b/Resources/Audio/Items/Whistle/whistle_2.ogg differ diff --git a/Resources/Audio/Items/Whistle/whistle_3.ogg b/Resources/Audio/Items/Whistle/whistle_3.ogg new file mode 100644 index 0000000000..f8b53be200 Binary files /dev/null and b/Resources/Audio/Items/Whistle/whistle_3.ogg differ diff --git a/Resources/Audio/Items/Whistle/whistle_4.ogg b/Resources/Audio/Items/Whistle/whistle_4.ogg new file mode 100644 index 0000000000..cecdbca652 Binary files /dev/null and b/Resources/Audio/Items/Whistle/whistle_4.ogg differ diff --git a/Resources/Audio/Items/Whistle/whistle_5.ogg b/Resources/Audio/Items/Whistle/whistle_5.ogg new file mode 100644 index 0000000000..feca849a5e Binary files /dev/null and b/Resources/Audio/Items/Whistle/whistle_5.ogg differ diff --git a/Resources/Audio/Items/Whistle/whistle_6.ogg b/Resources/Audio/Items/Whistle/whistle_6.ogg new file mode 100644 index 0000000000..8db768776f Binary files /dev/null and b/Resources/Audio/Items/Whistle/whistle_6.ogg differ diff --git a/Resources/Audio/Items/Whistle/whistle_7.ogg b/Resources/Audio/Items/Whistle/whistle_7.ogg new file mode 100644 index 0000000000..787463fe78 Binary files /dev/null and b/Resources/Audio/Items/Whistle/whistle_7.ogg differ diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml index 75f0cad84b..227d8767e8 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml @@ -1,6 +1,7 @@ - type: vendingMachineInventory id: SecTechInventory startingInventory: + SecurityWhistle: 5 Handcuffs: 8 GrenadeFlashBang: 4 TearGasGrenade: 4 diff --git a/Resources/Prototypes/Entities/Effects/exclamation.yml b/Resources/Prototypes/Entities/Effects/exclamation.yml new file mode 100644 index 0000000000..cfe1cbc7f2 --- /dev/null +++ b/Resources/Prototypes/Entities/Effects/exclamation.yml @@ -0,0 +1,39 @@ +- type: entity + id: Exclamation + name: exclamation + noSpawn: true + save: false + components: + - type: Transform + noRot: true + - type: Sprite + sprite: Structures/Storage/closet.rsi + drawdepth: Effects + noRot: true + layers: + - state: "cardboard_special" + - type: TimedDespawn + lifetime: 1 + - type: Tag + tags: + - HideContextMenu + + +- type: entity + id: WhistleExclamation + name: exclamation + noSpawn: true + components: + - type: Sprite + sprite: Structures/Storage/closet.rsi + state: cardboard_special + drawdepth: Effects + offset: 0, 1 + noRot: true + - type: Transform + noRot: true + - type: TimedDespawn + lifetime: 0.8 + - type: Tag + tags: + - HideContextMenu \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Fun/whistles.yml b/Resources/Prototypes/Entities/Objects/Fun/whistles.yml new file mode 100644 index 0000000000..4281f0c4d4 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Fun/whistles.yml @@ -0,0 +1,30 @@ +- type: entity + abstract: true + parent: BaseItem + id: BaseWhistle + name: whistle + description: Someone forgot to turn off kettle? + components: + - type: Item + size: Tiny + - type: Clothing + quickEquip: false + slots: neck + - type: UseDelay + delay: 3 + - type: EmitSoundOnUse + sound: + collection: BaseWhistle + - type: Whistle + distance: 5 + +- type: entity + parent: BaseWhistle + id: SecurityWhistle + description: Sound of it make you feel fear. + components: + - type: Sprite + sprite: Objects/Fun/whistle.rsi + state: securityWhistle + - type: Item + sprite: Objects/Fun/whistle.rsi \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml index 040aff42b4..ac7f053b63 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml @@ -107,25 +107,4 @@ - type: EntityStorage isCollidableWhenOpen: false openOnMove: false - airtight: false - -#Exclamation effect for box opening -- type: entity - id: Exclamation - name: exclamation - noSpawn: true - save: false - components: - - type: Transform - noRot: true - - type: Sprite - sprite: Structures/Storage/closet.rsi - drawdepth: Effects - noRot: true - layers: - - state: "cardboard_special" - - type: TimedDespawn - lifetime: 1 - - type: Tag - tags: - - HideContextMenu + airtight: false \ No newline at end of file diff --git a/Resources/Prototypes/SoundCollections/whistle.yml b/Resources/Prototypes/SoundCollections/whistle.yml new file mode 100644 index 0000000000..f7d0dc9a1d --- /dev/null +++ b/Resources/Prototypes/SoundCollections/whistle.yml @@ -0,0 +1,10 @@ +- type: soundCollection + id: BaseWhistle + files: + - /Audio/Items/Whistle/whistle_1.ogg + - /Audio/Items/Whistle/whistle_2.ogg + - /Audio/Items/Whistle/whistle_3.ogg + - /Audio/Items/Whistle/whistle_4.ogg + - /Audio/Items/Whistle/whistle_5.ogg + - /Audio/Items/Whistle/whistle_6.ogg + - /Audio/Items/Whistle/whistle_7.ogg diff --git a/Resources/Textures/Objects/Fun/whistle.rsi/meta.json b/Resources/Textures/Objects/Fun/whistle.rsi/meta.json new file mode 100644 index 0000000000..59159ff617 --- /dev/null +++ b/Resources/Textures/Objects/Fun/whistle.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Foleps (discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "securityWhistle" + } + ] +} diff --git a/Resources/Textures/Objects/Fun/whistle.rsi/securityWhistle.png b/Resources/Textures/Objects/Fun/whistle.rsi/securityWhistle.png new file mode 100644 index 0000000000..81e43549b1 Binary files /dev/null and b/Resources/Textures/Objects/Fun/whistle.rsi/securityWhistle.png differ