FlyToward() public static method

public static FlyToward ( Actor self, Aircraft plane, int desiredFacing, WDist desiredAltitude ) : void
self Actor
plane Aircraft
desiredFacing int
desiredAltitude WDist
return void
コード例 #1
0
ファイル: Land.cs プロジェクト: wenzeslaus/OpenRA
        public override Activity Tick(Actor self)
        {
            if (!target.IsValidFor(self))
            {
                Cancel(self);
            }

            if (IsCanceled)
            {
                return(NextActivity);
            }

            var d = target.CenterPosition - self.CenterPosition;

            // The next move would overshoot, so just set the final position
            var move = plane.FlyStep(plane.Facing);

            if (d.HorizontalLengthSquared < move.HorizontalLengthSquared)
            {
                plane.SetPosition(self, target.CenterPosition);
                return(NextActivity);
            }

            var desiredFacing = Util.GetFacing(d, plane.Facing);

            Fly.FlyToward(self, plane, desiredFacing, WRange.Zero);

            return(this);
        }
コード例 #2
0
ファイル: FlyFollow.cs プロジェクト: DoGyAUT/OpenRA
        public override Activity Tick(Actor self)
        {
            // Refuse to take off if it would land immediately again.
            if (plane.ForceLanding)
            {
                Cancel(self);
                return(NextActivity);
            }

            if (IsCanceled || !target.IsValidFor(self))
            {
                return(NextActivity);
            }

            if (target.IsInRange(self.CenterPosition, minRange))
            {
                var directVector = target.CenterPosition - self.CenterPosition;
                Fly.FlyToward(self, plane, (directVector.Yaw + WAngle.FromDegrees(180)).Facing, plane.Info.CruiseAltitude);
                return(this);
            }

            if (target.IsInRange(self.CenterPosition, maxRange))
            {
                Fly.FlyToward(self, plane, plane.Facing, plane.Info.CruiseAltitude);
                return(this);
            }

            return(ActivityUtils.SequenceActivities(new Fly(self, target, minRange, maxRange), this));
        }
コード例 #3
0
        public override Activity Tick(Actor self)
        {
            if (!target.IsValidFor(self))
            {
                Cancel(self);
            }

            if (IsCanceled)
            {
                return(NextActivity);
            }

            var d = target.CenterPosition - self.CenterPosition;

            // The next move would overshoot, so just set the final position
            var move = aircraft.FlyStep(aircraft.Facing);

            if (d.HorizontalLengthSquared < move.HorizontalLengthSquared)
            {
                aircraft.SetPosition(self, target.CenterPosition);
                return(NextActivity);
            }

            var landingAlt = self.World.Map.DistanceAboveTerrain(target.CenterPosition);

            Fly.FlyToward(self, aircraft, d.Yaw.Facing, landingAlt);

            return(this);
        }
コード例 #4
0
ファイル: FlyCircle.cs プロジェクト: jrb0001/OpenRA
        public override Activity Tick(Actor self)
        {
            // Refuse to take off if it would land immediately again.
            if (aircraft.ForceLanding)
            {
                Cancel(self);
                return(NextActivity);
            }

            if (IsCanceled)
            {
                return(NextActivity);
            }

            if (remainingTicks > 0)
            {
                remainingTicks--;
            }
            else if (remainingTicks == 0)
            {
                return(NextActivity);
            }

            // We can't possibly turn this fast
            var desiredFacing = aircraft.Facing + 64;

            Fly.FlyToward(self, aircraft, desiredFacing, cruiseAltitude);

            return(this);
        }
コード例 #5
0
ファイル: Land.cs プロジェクト: RAunplugged/OpenRA
		public override Activity Tick(Actor self)
		{
			if (!target.IsValidFor(self))
				Cancel(self);

			if (IsCanceled)
				return NextActivity;

			if (!soundPlayed && aircraft.Info.LandingSounds.Length > 0 && !self.IsAtGroundLevel())
			{
				Game.Sound.Play(SoundType.World, aircraft.Info.LandingSounds.Random(self.World.SharedRandom), aircraft.CenterPosition);
				soundPlayed = true;
			}

			var d = target.CenterPosition - self.CenterPosition;

			// The next move would overshoot, so just set the final position
			var move = aircraft.FlyStep(aircraft.Facing);
			if (d.HorizontalLengthSquared < move.HorizontalLengthSquared)
			{
				aircraft.SetPosition(self, target.CenterPosition);
				return NextActivity;
			}

			var landingAlt = self.World.Map.DistanceAboveTerrain(target.CenterPosition);
			Fly.FlyToward(self, aircraft, d.Yaw.Facing, landingAlt);

			return this;
		}
コード例 #6
0
        public override Activity Tick(Actor self)
        {
            if (IsCanceled || !self.World.Map.Contains(self.Location))
            {
                return(NextActivity);
            }

            Fly.FlyToward(self, plane, plane.Facing, plane.Info.CruiseAltitude);
            return(this);
        }
コード例 #7
0
ファイル: FlyTimed.cs プロジェクト: Blackbird88/OpenRA
        public override Activity Tick(Actor self)
        {
            if (IsCanceled || remainingTicks-- == 0)
            {
                return(NextActivity);
            }

            Fly.FlyToward(self, plane, plane.Facing, cruiseAltitude);

            return(this);
        }
コード例 #8
0
        public override Activity Tick(Actor self)
        {
            if (IsCanceled)
            {
                return(NextActivity);
            }

            // We can't possibly turn this fast
            var desiredFacing = plane.Facing + 64;

            Fly.FlyToward(self, plane, desiredFacing, cruiseAltitude);

            return(this);
        }
コード例 #9
0
ファイル: FlyFollow.cs プロジェクト: SoftEngGroup/OpenRAGroup
        public override Activity Tick(Actor self)
        {
            if (IsCanceled || !target.IsValidFor(self))
            {
                return(NextActivity);
            }

            if (target.IsInRange(self.CenterPosition, maxRange) && !target.IsInRange(self.CenterPosition, minRange))
            {
                Fly.FlyToward(self, plane, plane.Facing, plane.Info.CruiseAltitude);
                return(this);
            }

            return(ActivityUtils.SequenceActivities(new Fly(self, target, minRange, maxRange), this));
        }
コード例 #10
0
        public override Activity Tick(Actor self)
        {
            // Refuse to take off if it would land immediately again.
            if (aircraft.ForceLanding)
            {
                Cancel(self);
                return(NextActivity);
            }

            if (IsCanceling || !self.World.Map.Contains(self.Location))
            {
                return(NextActivity);
            }

            Fly.FlyToward(self, aircraft, aircraft.Facing, aircraft.Info.CruiseAltitude);
            return(this);
        }
コード例 #11
0
        public override Activity Tick(Actor self)
        {
            // Refuse to take off if it would land immediately again.
            if (plane.ForceLanding)
            {
                Cancel(self);
                return(NextActivity);
            }

            if (IsCanceled || remainingTicks-- == 0)
            {
                return(NextActivity);
            }

            Fly.FlyToward(self, plane, plane.Facing, cruiseAltitude);

            return(this);
        }
コード例 #12
0
		public override Activity Tick(Actor self)
		{
			if (!target.IsValidFor(self))
				Cancel(self);

			if (IsCanceled)
				return NextActivity;

			var d = target.CenterPosition - self.CenterPosition;

			// The next move would overshoot, so just set the final position
			var move = plane.FlyStep(plane.Facing);
			if (d.HorizontalLengthSquared < move.HorizontalLengthSquared)
			{
				plane.SetPosition(self, target.CenterPosition);
				return NextActivity;
			}

			Fly.FlyToward(self, plane, d.Yaw.Facing, new WDist(target.CenterPosition.Z));

			return this;
		}
コード例 #13
0
ファイル: FlyFollow.cs プロジェクト: RAunplugged/OpenRA
        public override Activity Tick(Actor self)
        {
            // Refuse to take off if it would land immediately again.
            if (aircraft.ForceLanding)
            {
                Cancel(self);
                return(NextActivity);
            }

            if (IsCanceled || !target.IsValidFor(self))
            {
                return(NextActivity);
            }

            if (target.IsInRange(self.CenterPosition, maxRange) && !target.IsInRange(self.CenterPosition, minRange))
            {
                Fly.FlyToward(self, aircraft, aircraft.Facing, aircraft.Info.CruiseAltitude);
                return(this);
            }

            return(ActivityUtils.SequenceActivities(new Fly(self, target, minRange, maxRange), this));
        }
コード例 #14
0
        public override Activity Tick(Actor self)
        {
            if (ChildActivity != null)
            {
                ChildActivity = ActivityUtils.RunActivityTick(self, ChildActivity);
                if (ChildActivity != null)
                {
                    return(this);
                }
            }

            // Refuse to take off if it would land immediately again.
            if (aircraft.ForceLanding)
            {
                Cancel(self);
            }

            if (IsCanceling)
            {
                return(NextActivity);
            }

            bool targetIsHiddenActor;

            target = target.Recalculate(self.Owner, out targetIsHiddenActor);
            if (!targetIsHiddenActor && target.Type == TargetType.Actor)
            {
                lastVisibleTarget = Target.FromTargetPositions(target);
            }

            var oldUseLastVisibleTarget = useLastVisibleTarget;

            useLastVisibleTarget = targetIsHiddenActor || !target.IsValidFor(self);

            // If we are ticking again after previously sequencing a MoveWithRange then that move must have completed
            // Either we are in range and can see the target, or we've lost track of it and should give up
            if (wasMovingWithinRange && targetIsHiddenActor)
            {
                return(NextActivity);
            }

            wasMovingWithinRange = false;

            // Update target lines if required
            if (useLastVisibleTarget != oldUseLastVisibleTarget && targetLineColor.HasValue)
            {
                self.SetTargetLine(useLastVisibleTarget ? lastVisibleTarget : target, targetLineColor.Value, false);
            }

            // Target is hidden or dead, and we don't have a fallback position to move towards
            if (useLastVisibleTarget && !lastVisibleTarget.IsValidFor(self))
            {
                return(NextActivity);
            }

            var pos         = self.CenterPosition;
            var checkTarget = useLastVisibleTarget ? lastVisibleTarget : target;

            // We've reached the required range - if the target is visible and valid then we wait
            // otherwise if it is hidden or dead we give up
            if (checkTarget.IsInRange(pos, maxRange) && !checkTarget.IsInRange(pos, minRange))
            {
                Fly.FlyToward(self, aircraft, aircraft.Facing, aircraft.Info.CruiseAltitude);
                return(useLastVisibleTarget ? NextActivity : this);
            }

            wasMovingWithinRange = true;
            QueueChild(self, aircraft.MoveWithinRange(target, minRange, maxRange, checkTarget.CenterPosition, targetLineColor), true);
            return(this);
        }
コード例 #15
0
        public override Activity Tick(Actor self)
        {
            if (ChildActivity != null)
            {
                ChildActivity = ActivityUtils.RunActivityTick(self, ChildActivity);
                if (ChildActivity != null)
                {
                    return(this);
                }
            }

            if (IsCanceling || target.Type == TargetType.Invalid)
            {
                aircraft.RemoveInfluence();
                return(NextActivity);
            }

            if (!landingInitiated)
            {
                var landingCell = !aircraft.Info.VTOL ? self.World.Map.CellContaining(target.CenterPosition + offset) : self.Location;
                if (!aircraft.CanLand(landingCell, target.Actor))
                {
                    // Maintain holding pattern.
                    if (!aircraft.Info.CanHover)
                    {
                        QueueChild(self, new FlyCircle(self, 25), true);
                    }

                    self.NotifyBlocker(landingCell);
                    return(this);
                }

                aircraft.AddInfluence(landingCell);
                aircraft.EnteringCell(self);
                landingInitiated = true;
            }

            var altitude     = self.World.Map.DistanceAboveTerrain(self.CenterPosition);
            var landAltitude = self.World.Map.DistanceAboveTerrain(target.CenterPosition + offset) + aircraft.LandAltitude;

            if (!soundPlayed && aircraft.Info.LandingSounds.Length > 0 && altitude != landAltitude)
            {
                Game.Sound.Play(SoundType.World, aircraft.Info.LandingSounds, self.World, aircraft.CenterPosition);
                soundPlayed = true;
            }

            // For VTOLs we assume we've already arrived at the target location and just need to move downward
            if (aircraft.Info.VTOL)
            {
                if (HeliFly.AdjustAltitude(self, aircraft, landAltitude))
                {
                    return(this);
                }

                return(NextActivity);
            }

            var d = (target.CenterPosition + offset) - self.CenterPosition;

            // The next move would overshoot, so just set the final position
            var move = aircraft.FlyStep(aircraft.Facing);

            if (d.HorizontalLengthSquared < move.HorizontalLengthSquared)
            {
                var landingAltVec = new WVec(WDist.Zero, WDist.Zero, aircraft.LandAltitude);
                aircraft.SetPosition(self, target.CenterPosition + offset + landingAltVec);
                return(NextActivity);
            }

            var landingAlt = self.World.Map.DistanceAboveTerrain(target.CenterPosition + offset) + aircraft.LandAltitude;

            Fly.FlyToward(self, aircraft, d.Yaw.Facing, landingAlt);

            return(this);
        }