private void UpdateLastSeen() { RelayStorage store = m_controlBlock.NetworkStorage; if (store == null) { Log.DebugLog("failed to get storage", Logger.severity.INFO); m_character = null; return; } if (m_character != null) { if (store.TryGetLastSeen(m_character.Entity.EntityId, out m_character)) { Log.DebugLog("got updated last seen"); return; } else { Log.DebugLog("failed to update last seen", Logger.severity.WARNING); m_character = null; m_timeoutAt = Globals.ElapsedTime + timeout; } } store.SearchLastSeen((LastSeen seen) => { Log.DebugLog("seen: " + seen.Entity.getBestName()); if (seen.Entity is IMyCharacter && seen.Entity.DisplayName.LowerRemoveWhitespace().Contains(m_charName)) { Log.DebugLog("found a last seen for character"); m_character = seen; return(true); } return(false); }); Log.DebugLog("failed to find a character from last seen", condition: m_character == null); }
private void GridSearch_Enemy() { RelayStorage store = m_netStore; if (store == null) { Log.DebugLog("no storage", Logger.severity.DEBUG); return; } if (m_targetEntityId != 0L) { LastSeen target; if (store.TryGetLastSeen(m_targetEntityId, out target) && CanTarget(target)) { Grid = target; Log.DebugLog("found target: " + target.Entity.getBestName()); } else { Grid = null; } return; } List <LastSeen> enemies = ResourcePool <List <LastSeen> > .Get(); Vector3D position = m_controlBlock.CubeBlock.GetPosition(); store.SearchLastSeen(seen => { if (!seen.IsValid || !seen.isRecent()) { return(false); } IMyCubeGrid asGrid = seen.Entity as IMyCubeGrid; if (asGrid == null) { return(false); } if (!m_controlBlock.CubeBlock.canConsiderHostile(asGrid)) { return(false); } enemies.Add(seen); Log.DebugLog("enemy: " + asGrid.DisplayName); return(false); }); Log.DebugLog("number of enemies: " + enemies.Count); IOrderedEnumerable <LastSeen> enemiesByDistance = enemies.OrderBy(OrderValue != null ? OrderValue : seen => Vector3D.DistanceSquared(position, seen.GetPosition())); m_reason = ReasonCannotTarget.None; foreach (LastSeen enemy in enemiesByDistance) { if (CanTarget(enemy)) { Grid = enemy; Log.DebugLog("found target: " + enemy.Entity.getBestName()); enemies.Clear(); ResourcePool <List <LastSeen> > .Return(enemies); return; } } Grid = null; Log.DebugLog("nothing found"); enemies.Clear(); ResourcePool <List <LastSeen> > .Return(enemies); }
/// <summary> /// Targets a LastSeen chosen from the given storage, will overrride current target. /// </summary> /// <param name="storage">NetworkStorage to get LastSeen from.</param> public void GetLastSeenTarget(RelayStorage storage, double range) { if (Globals.UpdateCount < m_nextLastSeenSearch) { return; } m_nextLastSeenSearch = Globals.UpdateCount + 100ul; if (storage == null) { //Log.DebugLog("no storage", "GetLastSeenTarget()", Logger.severity.INFO); return; } if (storage.LastSeenCount == 0) { //Log.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) { Log.TraceLog("Updating current last seen target"); lst.Update(processing); CurrentTarget = myTarget; return; } if (ChooseBlock(processing, out targetBlock)) { Log.TraceLog("Updating current last seen, chose a new block"); myTarget = new LastSeenTarget(processing, targetBlock); CurrentTarget = myTarget; return; } } if (Options.TargetEntityId > 0L) { if (storage.TryGetLastSeen(Options.TargetEntityId, out processing)) { Log.TraceLog("Got last seen for entity id"); ChooseBlock(processing, out targetBlock); myTarget = new LastSeenTarget(processing, targetBlock); CurrentTarget = myTarget; } //else // Log.DebugLog("failed to get last seen from entity id", "GetLastSeenTarget()"); return; } processing = null; targetBlock = null; if (SEAD) { throw new NotImplementedException(); //float highestPowerLevel = 0f; //storage.ForEachLastSeen((LastSeen seen) => { // if (seen.isRecent() && Options.CanTargetType(seen.Entity) && CanConsiderHostile(seen.Entity)) // { // IMyCubeBlock block; // float powerLevel; // if (RadarEquipment_old.GetRadarEquipment(seen, out block, out powerLevel) && powerLevel > highestPowerLevel) // { // highestPowerLevel = powerLevel; // processing = seen; // targetBlock = block; // } // } //}); } else { Vector3D myPos = ProjectilePosition(); TargetType bestType = TargetType.LowestPriority; double maxRange = range * range; double closestDist = maxRange; storage.ForEachLastSeen(seen => { TargetType typeOfSeen = TargetingOptions.GetTargetType(seen.Entity); if (typeOfSeen <= bestType && Options.CanTargetType(typeOfSeen) && seen.isRecent() && CanConsiderHostile(seen.Entity)) { IMyCubeBlock block; if (!ChooseBlock(seen, out block) || !CheckWeaponsTargeting(typeOfSeen, seen.Entity)) { return; } if (typeOfSeen == bestType && targetBlock != null && block == null) { return; } double dist = Vector3D.DistanceSquared(myPos, seen.LastKnownPosition); if ((typeOfSeen < bestType && dist < maxRange) || dist < closestDist) { closestDist = dist; bestType = typeOfSeen; processing = seen; targetBlock = block; } } }); Log.DebugLog(() => "chose last seen with entity: " + processing.Entity.nameWithId() + ", block: " + targetBlock.getBestName() + ", type: " + bestType + ", distance squared: " + closestDist + ", position: " + processing.Entity.GetPosition(), condition: processing != null); Log.DebugLog("no last seen target found", condition: processing == null); } if (processing == null) { if (this is Guided.GuidedMissile) { Log.TraceLog("GuidedMissile failed to get LastSeen target, keeping previous"); return; } //Log.DebugLog("failed to get a target from last seen", "GetLastSeenTarget()"); myTarget = NoTarget.Instance; CurrentTarget = myTarget; } else { myTarget = new LastSeenTarget(processing, targetBlock); CurrentTarget = myTarget; } }