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()"); }
/// <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; } }