Files
tbd-station-14/Content.Shared/Whistle/WhistleSystem.cs
Fahasor fa3da1ab82 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>
2024-01-12 01:05:28 -07:00

65 lines
2.0 KiB
C#

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<WhistleComponent, UseInHandEvent>(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<HumanoidAppearanceComponent>(_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);
}
}
}