using Content.Shared.Chemistry.Components; using Content.Shared.Friends.Components; using Content.Shared.Interaction.Events; using Content.Shared.NPC.Components; using Content.Shared.NPC.Systems; using Content.Shared.Popups; using Content.Shared.Timing; namespace Content.Shared.Friends.Systems; public sealed class PettableFriendSystem : EntitySystem { [Dependency] private readonly NpcFactionSystem _factionException = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; private EntityQuery _exceptionQuery; private EntityQuery _useDelayQuery; public override void Initialize() { base.Initialize(); _exceptionQuery = GetEntityQuery(); _useDelayQuery = GetEntityQuery(); SubscribeLocalEvent(OnUseInHand); SubscribeLocalEvent(OnRehydrated); } private void OnUseInHand(Entity ent, ref UseInHandEvent args) { var (uid, comp) = ent; var user = args.User; if (args.Handled || !_exceptionQuery.TryGetComponent(uid, out var exceptionComp)) return; if (_useDelayQuery.TryGetComponent(uid, out var useDelay) && !_useDelay.TryResetDelay((uid, useDelay), true)) return; var exception = (uid, exceptionComp); if (_factionException.IsIgnored(exception, user)) { _popup.PopupClient(Loc.GetString(comp.FailureString, ("target", uid)), user, user); return; } // you have made a new friend :) _popup.PopupClient(Loc.GetString(comp.SuccessString, ("target", uid)), user, user); _factionException.IgnoreEntity(exception, user); args.Handled = true; } private void OnRehydrated(Entity ent, ref GotRehydratedEvent args) { // can only pet before hydrating, after that the fish cannot be negotiated with if (!TryComp(ent, out var comp)) return; _factionException.IgnoreEntities(args.Target, comp.Ignored); } }