using System.Linq; using Content.Shared.Chemistry.Components; using Content.Shared.Interaction; using Robust.Shared.Containers; using Content.Shared.Popups; using Content.Shared.Timing; using Content.Shared.Whitelist; using Robust.Shared.Audio.Systems; using Robust.Shared.Timing; namespace Content.Shared._Sunrise.Reagents.Convert; /// /// Конвертирует реагенты внутри сущности по клику на нее /// public sealed class ByClickReagentConvertSystem : EntitySystem { [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; [Dependency] private readonly IGameTiming _timing = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnBibleInteract); } private void OnBibleInteract(Entity ent, ref AfterInteractEvent args) { if (!_timing.IsFirstTimePredicted) return; if (!IsPossible(ent, args.Target, args.User)) return; if (!TryComp(args.Target, out var container)) return; var solutions = container.Containers .Where(kvp => kvp.Key.StartsWith("solution@")) .Select(kvp => kvp.Key) .ToList(); foreach (var solutionKey in solutions) { if (!container.Containers.TryGetValue(solutionKey, out var liquidContainer)) continue; if (!TryComp(liquidContainer.ContainedEntities[0], out var solution)) continue; foreach (var (reagentTypeObj, amount) in solution.Solution.Contents) { if (reagentTypeObj.Prototype != ent.Comp.Target) continue; solution.Solution.RemoveReagent(reagentTypeObj.Prototype, amount); solution.Solution.AddReagent(ent.Comp.Result, amount); _popup.PopupClient(ent.Comp.PopupMessage, args.Target.Value, args.User); _audio.PlayPvs(ent.Comp.Sound, args.Target.Value); return; } } } /// /// Проверяет, возможна ли конвертация? /// /// Да/Нет private bool IsPossible(Entity ent, EntityUid? target, EntityUid user) { if (!target.HasValue) return false; if (!_whitelist.CheckBoth(user, ent.Comp.BlacklistUser, ent.Comp.WhitelistUser)) return false; if (!_whitelist.CheckBoth(target, ent.Comp.BlacklistTarget, ent.Comp.WhitelistTarget)) return false; if (_useDelay.IsDelayed(ent.Owner)) return false; return true; } }