Ejemplo n.º 1
0
        private void InteractionActivate(IEntity user, IEntity used)
        {
            if (!_actionBlockerSystem.CanInteract(user) || !_actionBlockerSystem.CanUse(user))
            {
                return;
            }

            // all activates should only fire when in range / unobstructed
            if (!InRangeUnobstructed(user, used, ignoreInsideBlocker: true, popup: true))
            {
                return;
            }

            var activateMsg = new ActivateInWorldEvent(user, used);

            RaiseLocalEvent(used.Uid, activateMsg);
            if (activateMsg.Handled)
            {
                return;
            }

            if (!used.TryGetComponent(out IActivate? activateComp))
            {
                return;
            }

            var activateEventArgs = new ActivateEventArgs(user, used);

            activateComp.Activate(activateEventArgs);
        }
Ejemplo n.º 2
0
        protected void InteractionActivate(EntityUid user, EntityUid used)
        {
            if (EntityManager.TryGetComponent <UseDelayComponent?>(used, out var delayComponent))
            {
                if (delayComponent.ActiveDelay)
                {
                    return;
                }

                delayComponent.BeginDelay();
            }

            if (!_actionBlockerSystem.CanInteract(user) || !_actionBlockerSystem.CanUse(user))
            {
                return;
            }

            // all activates should only fire when in range / unobstructed
            if (!InRangeUnobstructed(user, used, ignoreInsideBlocker: true, popup: true))
            {
                return;
            }

            // Check if interacted entity is in the same container, the direct child, or direct parent of the user.
            // This is bypassed IF the interaction happened through an item slot (e.g., backpack UI)
            if (!user.IsInSameOrParentContainer(used) && !CanAccessViaStorage(user, used))
            {
                return;
            }

            var activateMsg = new ActivateInWorldEvent(user, used);

            RaiseLocalEvent(used, activateMsg);
            if (activateMsg.Handled)
            {
                _adminLogSystem.Add(LogType.InteractActivate, LogImpact.Low, $"{user} activated {used}");
                return;
            }

            if (!EntityManager.TryGetComponent(used, out IActivate? activateComp))
            {
                return;
            }

            var activateEventArgs = new ActivateEventArgs(user, used);

            activateComp.Activate(activateEventArgs);
            _adminLogSystem.Add(LogType.InteractActivate, LogImpact.Low, $"{user} activated {used}"); // No way to check success.
        }
        private void HandleAfterInteract(EntityUid uid, LightReplacerComponent component, AfterInteractMessage eventArgs)
        {
            // standard interaction checks
            if (!ActionBlockerSystem.CanUse(eventArgs.User))
            {
                return;
            }
            if (!eventArgs.CanReach)
            {
                return;
            }

            // behaviour will depends on target type
            if (eventArgs.Attacked != null)
            {
                // replace broken light in fixture?
                if (eventArgs.Attacked.TryGetComponent(out PoweredLightComponent? fixture))
                {
                    component.TryReplaceBulb(fixture, eventArgs.User);
                }
                // add new bulb to light replacer container?
                else if (eventArgs.Attacked.TryGetComponent(out LightBulbComponent? bulb))
                {
                    component.TryInsertBulb(bulb, eventArgs.User, true);
                }
            }
        }
        private void HandleAfterInteract(EntityUid uid, LightReplacerComponent component, AfterInteractEvent eventArgs)
        {
            if (eventArgs.Handled)
            {
                return;
            }

            // standard interaction checks
            if (!_blocker.CanUse(eventArgs.User))
            {
                return;
            }
            if (!eventArgs.CanReach)
            {
                return;
            }

            // behaviour will depends on target type
            if (eventArgs.Target != null)
            {
                var targetUid = (EntityUid)eventArgs.Target;

                // replace broken light in fixture?
                if (EntityManager.TryGetComponent(targetUid, out PoweredLightComponent? fixture))
                {
                    eventArgs.Handled = TryReplaceBulb(uid, targetUid, eventArgs.User, component, fixture);
                }
                // add new bulb to light replacer container?
                else if (EntityManager.TryGetComponent(targetUid, out LightBulbComponent? bulb))
                {
                    eventArgs.Handled = TryInsertBulb(uid, targetUid, eventArgs.User, true, component, bulb);
                }
            }
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Activates the Activate behavior of an object
 /// Verifies that the user is capable of doing the use interaction first
 /// </summary>
 /// <param name="user"></param>
 /// <param name="used"></param>
 public void TryInteractionActivate(IEntity user, IEntity used)
 {
     if (user != null && used != null && ActionBlockerSystem.CanUse(user))
     {
         InteractionActivate(user, used);
     }
 }
 public bool ToggleStatus(IEntity user)
 {
     if (!ActionBlockerSystem.CanUse(user))
     {
         return(false);
     }
     return(Activated ? TurnOff() : TurnOn(user));
 }
Ejemplo n.º 7
0
        /// <summary>
        /// Eat item
        /// </summary>
        private void OnUseFoodInHand(EntityUid uid, FoodComponent foodComponent, UseInHandEvent ev)
        {
            if (ev.Handled)
            {
                return;
            }

            if (!_actionBlockerSystem.CanInteract(ev.User) || !_actionBlockerSystem.CanUse(ev.User))
            {
                return;
            }

            if (!ev.User.InRangeUnobstructed(uid, popup: true))
            {
                ev.Handled = true;
                return;
            }

            ev.Handled = TryUseFood(uid, ev.User);
        }
        async Task <bool> IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs)
        {
            if (_cuffing)
            {
                return(true);
            }

            if (eventArgs.Target == null || !ActionBlockerSystem.CanUse(eventArgs.User) || !eventArgs.Target.TryGetComponent <CuffableComponent>(out var cuffed))
            {
                return(false);
            }

            if (eventArgs.Target == eventArgs.User)
            {
                eventArgs.User.PopupMessage(Loc.GetString("You can't cuff yourself!"));
                return(true);
            }

            if (Broken)
            {
                eventArgs.User.PopupMessage(Loc.GetString("The cuffs are broken!"));
                return(true);
            }

            if (!eventArgs.Target.TryGetComponent <HandsComponent>(out var hands))
            {
                eventArgs.User.PopupMessage(Loc.GetString("{0:theName} has no hands!", eventArgs.Target));
                return(true);
            }

            if (cuffed.CuffedHandCount == hands.Count)
            {
                eventArgs.User.PopupMessage(Loc.GetString("{0:theName} has no free hands to handcuff!", eventArgs.Target));
                return(true);
            }

            if (!eventArgs.InRangeUnobstructed(ignoreInsideBlocker: true))
            {
                eventArgs.User.PopupMessage(Loc.GetString("You are too far away to use the cuffs!"));
                return(true);
            }

            eventArgs.User.PopupMessage(Loc.GetString("You start cuffing {0:theName}.", eventArgs.Target));
            eventArgs.User.PopupMessage(eventArgs.Target, Loc.GetString("{0:theName} starts cuffing you!", eventArgs.User));

            if (StartCuffSound != null)
            {
                EntitySystem.Get <AudioSystem>().PlayFromEntity(StartCuffSound, Owner);
            }

            TryUpdateCuff(eventArgs.User, eventArgs.Target, cuffed);
            return(true);
        }
Ejemplo n.º 9
0
        private void AfterInteract(EntityUid uid, DrinkComponent component, AfterInteractEvent args)
        {
            if (args.Handled || args.Target == null)
            {
                return;
            }

            if (!_actionBlockerSystem.CanInteract(args.User) || !_actionBlockerSystem.CanUse(args.User))
            {
                return;
            }

            if (!args.User.InRangeUnobstructed(uid, popup: true))
            {
                args.Handled = true;
                return;
            }

            if (args.User == args.Target)
            {
                args.Handled = TryUseDrink(uid, args.User);
                return;
            }

            if (!args.User.InRangeUnobstructed(args.Target.Value, popup: true))
            {
                args.Handled = true;
                return;
            }

            if (args.User == args.Target)
            {
                args.Handled = TryUseDrink(uid, args.User, component);
            }
            else
            {
                args.Handled = TryForceDrink(uid, args.User, args.Target.Value, component);
            }
        }
        private bool CheckInteract(ICommonSession session)
        {
            if (session.AttachedEntity is not {
                Valid : true
            } uid ||
                !_actionBlockerSystem.CanInteract(uid) ||
                !_actionBlockerSystem.CanUse(uid))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 11
0
        internal void ToggleInternals()
        {
            if (!ActionBlockerSystem.CanUse(GetInternalsComponent()?.Owner))
            {
                return;
            }
            if (IsConnected)
            {
                DisconnectFromInternals();
                return;
            }

            ConnectToInternals();
        }
        /// <summary>
        /// Checks whether the player entity is able to use the chem dispenser.
        /// </summary>
        /// <param name="playerEntity">The player entity.</param>
        /// <returns>Returns true if the entity can use the dispenser, and false if it cannot.</returns>
        private bool PlayerCanUseDispenser(IEntity playerEntity)
        {
            //Need player entity to check if they are still able to use the dispenser
            if (playerEntity == null)
            {
                return(false);
            }
            //Check if player can interact in their current state
            if (!ActionBlockerSystem.CanInteract(playerEntity) || !ActionBlockerSystem.CanUse(playerEntity))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 13
0
 private void OnUseInHand(EntityUid uid, StunbatonComponent comp, UseInHandEvent args)
 {
     if (!ActionBlockerSystem.CanUse(args.User))
     {
         return;
     }
     if (comp.Activated)
     {
         TurnOff(comp);
     }
     else
     {
         TurnOn(comp, args.User);
     }
 }
Ejemplo n.º 14
0
        void IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs)
        {
            if (eventArgs.Target == null || !ActionBlockerSystem.CanUse(eventArgs.User) || !eventArgs.Target.TryGetComponent <CuffableComponent>(out var cuffed))
            {
                return;
            }

            if (eventArgs.Target == eventArgs.User)
            {
                _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("You can't cuff yourself!"));
                return;
            }

            if (Broken)
            {
                _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("The cuffs are broken!"));
                return;
            }

            if (!eventArgs.Target.TryGetComponent <HandsComponent>(out var hands))
            {
                _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("{0:theName} has no hands!", eventArgs.Target));
                return;
            }

            if (cuffed.CuffedHandCount == hands.Count)
            {
                _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("{0:theName} has no free hands to handcuff!", eventArgs.Target));
                return;
            }

            if (!EntitySystem.Get <SharedInteractionSystem>().InRangeUnobstructed(
                    eventArgs.User.Transform.MapPosition,
                    eventArgs.Target.Transform.MapPosition,
                    _interactRange,
                    ignoredEnt: Owner))
            {
                _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("You are too far away to use the cuffs!"));
                return;
            }

            _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("You start cuffing {0:theName}.", eventArgs.Target));
            _notifyManager.PopupMessage(eventArgs.User, eventArgs.Target, Loc.GetString("{0:theName} starts cuffing you!", eventArgs.User));
            _audioSystem.PlayFromEntity(StartCuffSound, Owner);

            TryUpdateCuff(eventArgs.User, eventArgs.Target, cuffed);
        }
Ejemplo n.º 15
0
        private bool ToggleStatus(IEntity user)
        {
            if (!ActionBlockerSystem.CanUse(user))
            {
                return(false);
            }
            if (Activated)
            {
                TurnOff();
            }
            else
            {
                TurnOn(user);
            }

            return(true);
        }
Ejemplo n.º 16
0
        /// <summary>
        /// Checks whether the player entity is able to use the chem master.
        /// </summary>
        /// <param name="playerEntity">The player entity.</param>
        /// <returns>Returns true if the entity can use the chem master, and false if it cannot.</returns>
        private bool PlayerCanUseChemMaster(IEntity playerEntity, bool needsPower = true)
        {
            //Need player entity to check if they are still able to use the chem master
            if (playerEntity == null)
            {
                return(false);
            }
            //Check if player can interact in their current state
            if (!ActionBlockerSystem.CanInteract(playerEntity) || !ActionBlockerSystem.CanUse(playerEntity))
            {
                return(false);
            }
            //Check if device is powered
            if (needsPower && !Powered)
            {
                return(false);
            }

            return(true);
        }
        /// <summary>
        ///     Raises a number of events in order to get all verbs of the given type(s) defined in local systems. This
        ///     does not request verbs from the server.
        /// </summary>
        public virtual Dictionary <VerbType, SortedSet <Verb> > GetLocalVerbs(EntityUid target, EntityUid user, VerbType verbTypes, bool force = false)
        {
            Dictionary <VerbType, SortedSet <Verb> > verbs = new();

            // accessibility checks
            bool canAccess = false;

            if (force || target == user)
            {
                canAccess = true;
            }
            else if (_interactionSystem.InRangeUnobstructed(user, target, ignoreInsideBlocker: true))
            {
                if (user.IsInSameOrParentContainer(target))
                {
                    canAccess = true;
                }
                else
                {
                    // the item might be in a backpack that the user has open
                    canAccess = _interactionSystem.CanAccessViaStorage(user, target);
                }
            }

            // A large number of verbs need to check action blockers. Instead of repeatedly having each system individually
            // call ActionBlocker checks, just cache it for the verb request.
            var canInteract = force || _actionBlockerSystem.CanInteract(user);

            EntityUid @using = default;

            if (EntityManager.TryGetComponent(user, out SharedHandsComponent? hands) && (force || _actionBlockerSystem.CanUse(user)))
            {
                hands.TryGetActiveHeldEntity(out @using);

                // Check whether the "Held" entity is a virtual pull entity. If yes, set that as the entity being "Used".
                // This allows you to do things like buckle a dragged person onto a surgery table, without click-dragging
                // their sprite.
                if (@using != default && EntityManager.TryGetComponent <HandVirtualItemComponent?>(@using, out var pull))
                {
                    @using = pull.BlockingEntity;
                }
            }

            if ((verbTypes & VerbType.Interaction) == VerbType.Interaction)
            {
                GetInteractionVerbsEvent getVerbEvent = new(user, target, @using, hands, canInteract, canAccess);
                RaiseLocalEvent(target, getVerbEvent);
                verbs.Add(VerbType.Interaction, getVerbEvent.Verbs);
            }

            if ((verbTypes & VerbType.Activation) == VerbType.Activation)
            {
                GetActivationVerbsEvent getVerbEvent = new(user, target, @using, hands, canInteract, canAccess);
                RaiseLocalEvent(target, getVerbEvent);
                verbs.Add(VerbType.Activation, getVerbEvent.Verbs);
            }

            if ((verbTypes & VerbType.Alternative) == VerbType.Alternative)
            {
                GetAlternativeVerbsEvent getVerbEvent = new(user, target, @using, hands, canInteract, canAccess);
                RaiseLocalEvent(target, getVerbEvent);
                verbs.Add(VerbType.Alternative, getVerbEvent.Verbs);
            }

            if ((verbTypes & VerbType.Other) == VerbType.Other)
            {
                GetOtherVerbsEvent getVerbEvent = new(user, target, @using, hands, canInteract, canAccess);
                RaiseLocalEvent(target, getVerbEvent);
                verbs.Add(VerbType.Other, getVerbEvent.Verbs);
            }

            return(verbs);
        }