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.Components; using Content.Shared.Timing.Systems; namespace Content.Shared.Friends.Systems; public sealed partial class PettableFriendSystem : EntitySystem { [Dependency] private NpcFactionSystem _factionException = default!; [Dependency] private SharedPopupSystem _popup = default!; [Dependency] private UseDelaySystem _useDelay = default!; [Dependency] private EntityQuery _exceptionQuery = default!; [Dependency] private EntityQuery _useDelayQuery = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnUseInHand); SubscribeLocalEvent(OnRehydrated); } private void OnUseInHand(Entity ent, ref UseInHandEvent args) { var (uid, comp) = ent; var user = args.User; if (args.Handled || !_exceptionQuery.TryComp(uid, out var exceptionComp)) return; var exception = (uid, exceptionComp); if (!_factionException.IsIgnored(exception, user)) { // you have made a new friend :) _popup.PopupEntity(Loc.GetString(comp.SuccessString, ("target", uid)), user, user); _factionException.IgnoreEntity(exception, user); args.Handled = true; return; } if (_useDelayQuery.TryComp(uid, out var useDelay) && !_useDelay.TryResetDelay((uid, useDelay), true)) return; _popup.PopupEntity(Loc.GetString(comp.FailureString, ("target", uid)), user, user); } 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); } }