private void SelectLastSeen(RelayStorage store, List <long> entityIds) { Vector3D myPos = m_block.GetPosition(); foreach (long id in entityIds) { LastSeen seen; if (store.TryGetLastSeen(id, out seen)) { ExtensionsRelations.Relations relations = m_block.getRelationsTo(seen.Entity, ExtensionsRelations.Relations.Enemy).highestPriority(); m_sortableList.Add(new sortableLastSeen(myPos, seen, relations, m_options)); //Log.DebugLog("item: " + seen.Entity.getBestName() + ", relations: " + relations, "Display_FromProgram()"); } } }
/// <summary> /// Targets a LastSeen chosen from the given storage, will overrride current target. /// </summary> /// <param name="storage">NetworkStorage to get LastSeen from.</param> protected void GetLastSeenTarget(RelayStorage storage, double range) { if (Globals.UpdateCount < m_nextLastSeenSearch) return; m_nextLastSeenSearch = Globals.UpdateCount + 100ul; if (storage == null) { //myLogger.debugLog("no storage", "GetLastSeenTarget()", Logger.severity.INFO); return; } if (storage.LastSeenCount == 0) { //myLogger.debugLog("no last seen in storage", "GetLastSeenTarget()", Logger.severity.DEBUG); return; } LastSeen processing; IMyCubeBlock targetBlock; if (CurrentTarget.Entity != null && storage.TryGetLastSeen(CurrentTarget.Entity.EntityId, out processing) && processing.isRecent()) { LastSeenTarget lst = myTarget as LastSeenTarget; if (lst != null && lst.Block != null && !lst.Block.Closed) { lst.Update(processing); CurrentTarget = myTarget; return; } if (ChooseBlock(processing, out targetBlock)) { myTarget = new LastSeenTarget(processing, targetBlock); CurrentTarget = myTarget; return; } } if (Options.TargetEntityId.HasValue) { if (storage.TryGetLastSeen(Options.TargetEntityId.Value, out processing)) { ChooseBlock(processing, out targetBlock); myTarget = new LastSeenTarget(processing, targetBlock); CurrentTarget = myTarget; } //else // myLogger.debugLog("failed to get last seen from entity id", "GetLastSeenTarget()"); return; } processing = null; targetBlock = null; if (SEAD) { float highestPowerLevel = 0f; storage.ForEachLastSeen((LastSeen seen) => { if (seen.isRecent() && CubeBlock.canConsiderHostile(seen.Entity) && Options.CanTargetType(seen.Entity)) { IMyCubeBlock block; float powerLevel; if (RadarEquipment.GetRadarEquipment(seen, out block, out powerLevel) && powerLevel > highestPowerLevel) { highestPowerLevel = powerLevel; processing = seen; targetBlock = block; } } }); } else { // choose closest grid Vector3D myPos = ProjectilePosition(); double closestDist = range * range; storage.ForEachLastSeen(seen => { if (seen.isRecent() && CubeBlock.canConsiderHostile(seen.Entity) && Options.CanTargetType(seen.Entity)) { IMyCubeBlock block; if (!ChooseBlock(seen, out block)) return; // always prefer a grid with a block if (targetBlock != null && block == null) return; double dist = Vector3D.DistanceSquared(myPos, seen.LastKnownPosition); if (dist < closestDist) { closestDist = dist; processing = seen; targetBlock = block; } } }); } if (processing == null) { //myLogger.debugLog("failed to get a target from last seen", "GetLastSeenTarget()"); myTarget = NoTarget.Instance; CurrentTarget = myTarget; } else { myTarget = new LastSeenTarget(processing, targetBlock); CurrentTarget = myTarget; } }