Exemplo n.º 1
0
        /// <summary>
        /// Will have two behaviors, either "uses" the used entity at range on the target entity if it is capable of accepting that action
        /// Or it will use the used entity itself on the position clicked, regardless of what was there
        /// </summary>
        public override void InteractUsingRanged(
            EntityUid user,
            EntityUid used,
            EntityUid?target,
            EntityCoordinates clickLocation,
            bool inRangeUnobstructed)
        {
            // TODO PREDICTION move server-side interaction logic into the shared system for interaction prediction.
            if (RangedInteractDoBefore(user, used, target, clickLocation, inRangeUnobstructed))
            {
                return;
            }

            if (target != null)
            {
                var rangedMsg = new RangedInteractEvent(user, used, target.Value, clickLocation);
                RaiseLocalEvent(target.Value, rangedMsg);

                if (rangedMsg.Handled)
                {
                    return;
                }
            }

            InteractDoAfter(user, used, target, clickLocation, inRangeUnobstructed);
        }
        /// <summary>
        /// Will have two behaviors, either "uses" the used entity at range on the target entity if it is capable of accepting that action
        /// Or it will use the used entity itself on the position clicked, regardless of what was there
        /// </summary>
        public override async Task <bool> InteractUsingRanged(EntityUid user, EntityUid used, EntityUid?target, EntityCoordinates clickLocation, bool inRangeUnobstructed)
        {
            // TODO PREDICTION move server-side interaction logic into the shared system for interaction prediction.
            if (InteractDoBefore(user, used, inRangeUnobstructed ? target : null, clickLocation, false))
            {
                return(true);
            }

            if (target != null)
            {
                var rangedMsg = new RangedInteractEvent(user, used, target.Value, clickLocation);
                RaiseLocalEvent(target.Value, rangedMsg);
                if (rangedMsg.Handled)
                {
                    return(true);
                }

                var rangedInteractions         = AllComps <IRangedInteract>(target.Value).ToList();
                var rangedInteractionEventArgs = new RangedInteractEventArgs(user, used, clickLocation);

                // See if we have a ranged interaction
                foreach (var t in rangedInteractions)
                {
                    // If an InteractUsingRanged returns a status completion we finish our interaction
#pragma warning disable 618
                    if (t.RangedInteract(rangedInteractionEventArgs))
#pragma warning restore 618
                    {
                        return(true);
                    }
                }
            }

            return(await InteractDoAfter(user, used, inRangeUnobstructed?target : null, clickLocation, false));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Will have two behaviors, either "uses" the used entity at range on the target entity if it is capable of accepting that action
        /// Or it will use the used entity itself on the position clicked, regardless of what was there
        /// </summary>
        public async Task <bool> InteractUsingRanged(EntityUid user, EntityUid used, EntityUid target, EntityCoordinates clickLocation, bool inRangeUnobstructed)
        {
            if (InteractDoBefore(user, used, inRangeUnobstructed ? target : null, clickLocation, false))
            {
                return(true);
            }

            if (target != default)
            {
                var rangedMsg = new RangedInteractEvent(user, used, target, clickLocation);
                RaiseLocalEvent(target, rangedMsg);
                if (rangedMsg.Handled)
                {
                    return(true);
                }

                var rangedInteractions         = EntityManager.GetComponents <IRangedInteract>(target).ToList();
                var rangedInteractionEventArgs = new RangedInteractEventArgs(user, used, clickLocation);

                // See if we have a ranged interaction
                foreach (var t in rangedInteractions)
                {
                    // If an InteractUsingRanged returns a status completion we finish our interaction
#pragma warning disable 618
                    if (t.RangedInteract(rangedInteractionEventArgs))
#pragma warning restore 618
                    {
                        return(true);
                    }
                }
            }

            return(await InteractDoAfter(user, used, inRangeUnobstructed?target : null, clickLocation, false));
        }
        /// <summary>
        /// Will have two behaviors, either "uses" the used entity at range on the target entity if it is capable of accepting that action
        /// Or it will use the used entity itself on the position clicked, regardless of what was there
        /// </summary>
        public async Task <bool> InteractUsingRanged(IEntity user, IEntity used, IEntity?target, EntityCoordinates clickLocation, bool inRangeUnobstructed)
        {
            if (target != null)
            {
                var rangedMsg = new RangedInteractEvent(user, used, target, clickLocation);
                RaiseLocalEvent(target.Uid, rangedMsg);
                if (rangedMsg.Handled)
                {
                    return(true);
                }

                var rangedInteractions         = target.GetAllComponents <IRangedInteract>().ToList();
                var rangedInteractionEventArgs = new RangedInteractEventArgs(user, used, clickLocation);

                // See if we have a ranged interaction
                foreach (var t in rangedInteractions)
                {
                    // If an InteractUsingRanged returns a status completion we finish our interaction
                    if (t.RangedInteract(rangedInteractionEventArgs))
                    {
                        return(true);
                    }
                }
            }

            if (inRangeUnobstructed)
            {
                return(await InteractDoAfter(user, used, target, clickLocation, false));
            }
            else
            {
                return(await InteractDoAfter(user, used, null, clickLocation, false));
            }
        }