private void CubeBlock_AppendingCustomInfo(IMyTerminalBlock block, System.Text.StringBuilder customInfo) { switch (_initial) { case InitialTargetStatus.NotReady: customInfo.AppendLine("Launcher not ready"); return; case InitialTargetStatus.Golis: customInfo.Append(AmmoName()); customInfo.Append(" fired at position: "); customInfo.AppendLine(_initialTarget.GetPosition().ToPretty()); return; case InitialTargetStatus.FromWeapon: customInfo.Append(AmmoName()); customInfo.Append(" fired at "); LastSeenTarget lst = _initialTarget as LastSeenTarget; if (lst != null) { if (lst.Block != null) { customInfo.Append(lst.Block.DefinitionDisplayNameText); customInfo.Append(" on "); } customInfo.AppendLine(lst.LastSeen.HostileName()); } else { customInfo.AppendLine(_initialTarget.Entity.GetNameForDisplay(CubeBlock.OwnerId)); } return; case InitialTargetStatus.NoStorage: customInfo.AppendLine("Cannot fire: Not connected to an antenna or radar"); return; case InitialTargetStatus.NotFoundId: customInfo.Append("Cannot fire: No entity found with ID: "); customInfo.AppendLine(m_weaponTarget.Options.TargetEntityId.ToString()); return; case InitialTargetStatus.NotFoundAny: customInfo.AppendLine("Cannot fire: No targets"); return; default: Logger.AlwaysLog("Not implemented: " + _initial, Logger.severity.ERROR); return; } }
/// <remarks> /// Runs on separate thread. /// </remarks> private void TargetLastSeen() { if (myAntenna == null || myAntenna.lastSeenCount == 0) { if (myTargetSeen != null && myTarget.TType == TargetType.None) { myLogger.debugLog("Retargeting last", "TargetLastSeen()"); myTarget = new LastSeenTarget(myTargetSeen); SetFiringDirection(); } return; } if (DateTime.UtcNow - failed_lastSeenTarget < checkLastSeen) return; LastSeen fetched; if (myTargetSeen != null && myAntenna.tryGetLastSeen(myTargetSeen.Entity.EntityId, out fetched) && fetched.isRecent()) { myLogger.debugLog("using previous last seen: " + fetched.Entity.getBestName(), "TargetLastSeen()"); myTarget = new LastSeenTarget(fetched); SetFiringDirection(); return; } if (Options.TargetEntityId.HasValue) { if (myAntenna.tryGetLastSeen(Options.TargetEntityId.Value, out fetched)) { myLogger.debugLog("using last seen from entity id: " + fetched.Entity.getBestName(), "TargetLastSeen()"); myTarget = new LastSeenTarget(fetched); SetFiringDirection(); } else myLogger.debugLog("failed to get last seen from entity id", "TargetLastSeen()"); return; } Vector3D myPos = MyEntity.GetPosition(); LastSeen closest = null; double closestDist = double.MaxValue; myLogger.debugLog("last seen count: " + myAntenna.lastSeenCount, "TargetLastSeen()"); myAntenna.ForEachLastSeen(seen => { myLogger.debugLog("checking: " + seen.Entity.getBestName(), "TargetLastSeen()"); if (seen.isRecent() && CubeBlock.canConsiderHostile(seen.Entity) && Options.CanTargetType(seen.Entity)) { double dist = Vector3D.DistanceSquared(myPos, seen.LastKnownPosition); if (dist < closestDist) { closestDist = dist; closest = seen; } } return false; }); if (closest == null) { myLogger.debugLog("failed to get a target from last seen", "TargetLastSeen()"); failed_lastSeenTarget = DateTime.UtcNow; myTargetSeen = null; } else { myLogger.debugLog("got a target from last seen: " + closest.Entity.getBestName(), "TargetLastSeen()"); myTarget = new LastSeenTarget(closest); SetFiringDirection(); myTargetSeen = closest; } }