using Content.Shared.Disposal.Components; using Content.Shared.Disposal.Holder; using Content.Shared.Disposal.Tube; using Content.Shared.Disposal.Unit; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using System.Linq; namespace Content.Shared.Disposal.Router; /// /// This system handles the routing of entities in disposals /// based on what tags they possess. /// public sealed partial class DisposalRouterSystem : EntitySystem { [Dependency] private SharedDisposalHolderSystem _disposalHolder = default!; [Dependency] private DisposalTubeSystem _disposalTube = default!; [Dependency] private SharedAudioSystem _audio = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnGetRouterNextDirection, before: new[] { typeof(DisposalTubeSystem) }); Subs.BuiEvents(DisposalRouterUiKey.Key, subs => { subs.Event(OnUiAction); }); } private void OnGetRouterNextDirection(Entity ent, ref GetDisposalsNextDirectionEvent args) { if (args.Handled) return; if (!TryComp(ent, out var disposalTube)) return; var exits = _disposalTube.GetTubeConnectableDirections((ent, disposalTube)); if (exits.Length < 3 || _disposalHolder.TagsOverlap(args.Holder, ent.Comp.Tags)) { _disposalTube.SelectNextDirection((ent, disposalTube), exits, ref args); return; } _disposalTube.SelectNextDirection((ent, disposalTube), exits.Skip(1).ToArray(), ref args); args.Handled = true; } private void OnUiAction(Entity ent, ref DisposalRouterUiActionMessage msg) { if (!Exists(msg.Actor)) return; // Check for correct message and ignore maleformed strings if (SharedDisposalHolderSystem.TagRegex.IsMatch(msg.Tags)) { ent.Comp.Tags.Clear(); foreach (var tag in msg.Tags.Split(',', StringSplitOptions.RemoveEmptyEntries)) { var trimmed = tag.Trim(); if (string.IsNullOrEmpty(trimmed)) continue; ent.Comp.Tags.Add(trimmed); } Dirty(ent); _audio.PlayPredicted(ent.Comp.ClickSound, ent, msg.Actor, AudioParams.Default.WithVolume(-2f)); } } }