Beispiel #1
0
        protected void UpdateEnemyNear()
        {
            Vector3D myPosition = CubeBlock.GetPosition();

            EnemyNear = false;
            foreach (LastSeen seen in myLastSeen.Values)
            {
                IMyCubeGrid seenAsGrid = seen.Entity as IMyCubeGrid;
                if (seenAsGrid != null)
                {
                    //myLogger.debugLog("testing grid: " + seenAsGrid.DisplayName + ", recent = " + seen.isRecent() + ", hostile = " + CubeBlock.canConsiderHostile(seenAsGrid) + ", distance squared = " + (seen.LastKnownPosition - myPosition).LengthSquared(), "UpdateEnemyNear()");
                    if (seen.isRecent() && CubeBlock.canConsiderHostile(seenAsGrid) && (seen.LastKnownPosition - myPosition).LengthSquared() < 9000000)                     // 3km, squared = 9Mm
                    {
                        //myLogger.debugLog("nearby enemy: " + seen.Entity.getBestName(), "UpdateEnemyNear()");
                        EnemyNear = true;
                        return;
                    }
                }
            }
            //myLogger.debugLog("no enemy nearby", "UpdateEnemyNear()");
        }
Beispiel #2
0
        /// <summary>
        /// Updates m_stage if guidance starts or stops.
        /// </summary>
        private void CheckGuidance()
        {
            switch (m_stage)
            {
            case Stage.Rail:
                double minDist = (MyEntity.WorldAABB.Max - MyEntity.WorldAABB.Min).AbsMax();
                minDist *= 2;

                if (CubeBlock.WorldAABB.DistanceSquared(MyEntity.GetPosition()) >= minDist * minDist)
                {
                    myGuidanceEnds = Globals.ElapsedTime.Add(TimeSpan.FromSeconds(myDescr.GuidanceSeconds));
                    m_rail         = null;
                    if (myDescr.SemiActiveLaser)
                    {
                        Log.DebugLog("past arming range, semi-active.", Logger.severity.INFO);
                        m_stage = Stage.SemiActive;
                        return;
                    }

                    if (CurrentTarget is GolisTarget)
                    {
                        Log.DebugLog("past arming range, golis active", Logger.severity.INFO);
                        m_stage = Stage.Golis;
                        return;
                    }

                    if (myAmmo.Description.BoostDistance > 1f)
                    {
                        Log.DebugLog("past arming range, starting boost stage", Logger.severity.INFO);
                        StartGravity();
                        m_stage = Stage.Boost;
                        if (m_gravData == null)
                        {
                            Log.DebugLog("no gravity, terminating", Logger.severity.WARNING);
                            m_stage = Stage.Terminated;
                        }
                    }
                    else
                    {
                        Log.DebugLog("past arming range, starting guidance.", Logger.severity.INFO);
                        m_stage = Stage.Guided;
                    }
                }
                return;

            case Stage.Boost:
                if (Vector3D.DistanceSquared(CubeBlock.GetPosition(), MyEntity.GetPosition()) >= myAmmo.Description.BoostDistance * myAmmo.Description.BoostDistance)
                {
                    Log.DebugLog("completed boost stage, starting mid course stage", Logger.severity.INFO);
                    m_stage = Stage.MidCourse;
                }
                return;

            case Stage.MidCourse:
                Target t = CurrentTarget;
                if (t.Entity == null)
                {
                    return;
                }

                double toTarget = Vector3D.Distance(MyEntity.GetPosition(), t.GetPosition());
                double toLaunch = Vector3D.Distance(MyEntity.GetPosition(), CubeBlock.GetPosition());

                if (toTarget < toLaunch)
                {
                    Log.DebugLog("closer to target(" + toTarget + ") than to launch(" + toLaunch + "), starting guidance", Logger.severity.INFO);
                    m_stage        = Stage.Guided;
                    myGuidanceEnds = Globals.ElapsedTime.Add(TimeSpan.FromSeconds(myDescr.GuidanceSeconds));
                    m_gravData     = null;
                }
                return;

            case Stage.SemiActive:
            case Stage.Golis:
            case Stage.Guided:
                if (Globals.ElapsedTime >= myGuidanceEnds)
                {
                    Log.DebugLog("finished guidance", Logger.severity.INFO);
                    m_stage = Stage.Ballistic;
                }
                return;
            }
        }