示例#1
0
            public override Activity Tick(Actor self)
            {
                if (IsCanceled || !target.IsValidFor(self))
                {
                    return(NextActivity);
                }

                if (self.IsDisabled())
                {
                    return(this);
                }

                var weapon = attack.ChooseArmamentsForTarget(target, forceAttack).FirstOrDefault();

                if (weapon != null)
                {
                    var targetIsMobile = (target.Type == TargetType.Actor && target.Actor.Info.HasTraitInfo <IMoveInfo>()) ||
                                         (target.Type == TargetType.FrozenActor && target.FrozenActor.Info.HasTraitInfo <IMoveInfo>());

                    // Try and sit at least one cell closer than the max range to give some leeway if the target starts moving.
                    var modifiedRange = weapon.MaxRange();
                    var maxRange      = targetIsMobile ? new WDist(Math.Max(weapon.Weapon.MinRange.Length, modifiedRange.Length - 1024))
                                                : modifiedRange;

                    attack.Target = target;

                    if (move != null)
                    {
                        return(Util.SequenceActivities(move.MoveFollow(self, target, weapon.Weapon.MinRange, maxRange), this));
                    }
                }

                return(NextActivity);
            }
示例#2
0
            public override Activity Tick(Actor self)
            {
                if (IsCanceled || !target.IsValidFor(self))
                {
                    return(NextActivity);
                }

                if (self.IsDisabled())
                {
                    return(this);
                }

                var weapon = attack.ChooseArmamentsForTarget(target, forceAttack).FirstOrDefault();

                if (weapon != null)
                {
                    var targetIsMobile = (target.Type == TargetType.Actor && target.Actor.Info.HasTraitInfo <IMoveInfo>()) ||
                                         (target.Type == TargetType.FrozenActor && target.FrozenActor.Info.HasTraitInfo <IMoveInfo>());

                    // Try and sit at least one cell closer than the max range to give some leeway if the target starts moving.
                    var modifiedRange = weapon.MaxRange();
                    var maxRange      = targetIsMobile ? new WDist(Math.Max(weapon.Weapon.MinRange.Length, modifiedRange.Length - 1024))
                                                : modifiedRange;

                    // Check that AttackFollow hasn't cancelled the target by modifying attack.Target
                    // Having both this and AttackFollow modify that field is a horrible hack.
                    if (hasTicked && attack.Target.Type == TargetType.Invalid)
                    {
                        return(NextActivity);
                    }

                    attack.Target = target;
                    hasTicked     = true;

                    if (move != null)
                    {
                        return(ActivityUtils.SequenceActivities(move.MoveFollow(self, target, weapon.Weapon.MinRange, maxRange), this));
                    }
                    if (!onRailsHack &&
                        target.IsInRange(self.CenterPosition, weapon.MaxRange()) &&
                        !target.IsInRange(self.CenterPosition, weapon.Weapon.MinRange))
                    {
                        return(this);
                    }
                }

                if (!onRailsHack)
                {
                    attack.Target = Target.Invalid;
                }

                return(NextActivity);
            }