private bool CanTarget(LastSeen seen) { try { // if it is too far from start, cannot target if (MaximumRange > 1f && Vector3.DistanceSquared(m_startPosition, seen.GetPosition()) > MaximumRange * MaximumRange) { Log.DebugLog("out of range: " + seen.Entity.getBestName()); if (m_reason < ReasonCannotTarget.Too_Far) { m_reason = ReasonCannotTarget.Too_Far; m_bestGrid = seen; } return(false); } // if it is too fast, cannot target float speedTarget = m_navSet.Settings_Task_NavEngage.SpeedTarget - 1f; if (seen.GetLinearVelocity().LengthSquared() >= speedTarget * speedTarget) { Log.DebugLog("too fast to target: " + seen.Entity.getBestName() + ", speed: " + seen.GetLinearVelocity().Length() + ", my speed: " + m_navSet.Settings_Task_NavEngage.SpeedTarget); if (m_reason < ReasonCannotTarget.Too_Fast) { m_reason = ReasonCannotTarget.Too_Fast; m_bestGrid = seen; } return(false); } if (GridCondition != null && !GridCondition(seen.Entity as IMyCubeGrid)) { Log.DebugLog("Failed grid condition: " + seen.Entity.getBestName()); if (m_reason < ReasonCannotTarget.Grid_Condition) { m_reason = ReasonCannotTarget.Grid_Condition; m_bestGrid = seen; } return(false); } m_bestGrid = seen; return(true); } catch (NullReferenceException nre) { Log.AlwaysLog("Exception: " + nre, Logger.severity.ERROR); if (!seen.Entity.Closed) { throw; } Log.DebugLog("Caught exception caused by grid closing, ignoring."); return(false); } }
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); }
private bool CanTarget(LastSeen seen) { try { // if it is too far from start, cannot target if (MaximumRange > 1f && Vector3.DistanceSquared(m_startPosition, seen.GetPosition()) > MaximumRange * MaximumRange) { m_logger.debugLog("out of range of start position: " + seen.Entity.getBestName(), "CanTarget()"); if (m_reason < ReasonCannotTarget.Too_Far) { m_reason = ReasonCannotTarget.Too_Far; m_reasonGrid = seen.Entity.EntityId; } return false; } // if it is too fast, cannot target float speedTarget = m_navSet.Settings_Current.SpeedTarget - 1f; if (seen.GetLinearVelocity().LengthSquared() >= speedTarget * speedTarget) { m_logger.debugLog("too fast to target: " + seen.Entity.getBestName(), "CanTarget()"); if (m_reason < ReasonCannotTarget.Too_Fast) { m_reason = ReasonCannotTarget.Too_Fast; m_reasonGrid = seen.Entity.EntityId; } return false; } if (GridCondition != null && !GridCondition(seen.Entity as IMyCubeGrid)) { m_logger.debugLog("Failed grid condition: " + seen.Entity.getBestName(), "CanTarget()"); if (m_reason < ReasonCannotTarget.Grid_Condition) { m_reason = ReasonCannotTarget.Grid_Condition; m_reasonGrid = seen.Entity.EntityId; } return false; } return true; } catch (NullReferenceException nre) { m_logger.alwaysLog("Exception: " + nre, "CanTarget()", Logger.severity.ERROR); if (!seen.Entity.Closed) throw nre; m_logger.debugLog("Caught exception caused by grid closing, ignoring.", "CanTarget()"); return false; } }
protected void GridSearch_Enemy() { Vector3D position = m_controlBlock.CubeBlock.GetPosition(); m_enemies.Clear(); m_controller.ForEachLastSeen(seen => { if (!seen.IsValid || !seen.isRecent()) return false; IMyCubeGrid asGrid = seen.Entity as IMyCubeGrid; if (asGrid == null || !m_controlBlock.CubeBlock.canConsiderHostile(asGrid)) return false; m_enemies.Add(seen); m_logger.debugLog("enemy: " + seen.Entity.getBestName(), "Search()"); return false; }); m_logger.debugLog("number of enemies: " + m_enemies.Count, "Search()"); IOrderedEnumerable<LastSeen> enemiesByDistance = m_enemies.OrderBy(seen => Vector3D.DistanceSquared(position, seen.GetPosition())); m_reason = ReasonCannotTarget.None; foreach (LastSeen enemy in enemiesByDistance) { if (CanTarget(enemy)) { Grid = enemy; m_logger.debugLog("found target: " + enemy.Entity.getBestName(), "Search()"); return; } } Grid = null; m_logger.debugLog("nothing found", "Search()"); }
private void GridSearch_Enemy() { RelayStorage store = m_netStore; if (store == null) { m_logger.debugLog("no storage", Logger.severity.WARNING); return; } if (m_targetEntityId != 0L) { LastSeen target; if (store.TryGetLastSeen(m_targetEntityId, out target) && CanTarget(target)) { Grid = target; m_logger.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); m_logger.debugLog("enemy: " + asGrid.DisplayName); return false; }); m_logger.debugLog("number of enemies: " + enemies.Count); IOrderedEnumerable<LastSeen> enemiesByDistance = enemies.OrderBy(seen => Vector3D.DistanceSquared(position, seen.GetPosition())); m_reason = ReasonCannotTarget.None; foreach (LastSeen enemy in enemiesByDistance) { if (CanTarget(enemy)) { Grid = enemy; m_logger.debugLog("found target: " + enemy.Entity.getBestName()); enemies.Clear(); ResourcePool<List<LastSeen>>.Return(enemies); return; } } Grid = null; m_logger.debugLog("nothing found"); enemies.Clear(); ResourcePool<List<LastSeen>>.Return(enemies); }
protected void GridSearch_Enemy() { Vector3D position = m_controlBlock.CubeBlock.GetPosition(); m_enemies.Clear(); m_controller.ForEachLastSeen(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)) { //m_logger.debugLog("not hostile: " + asGrid.DisplayName, "GridSearch_Enemy()"); //m_logger.debugLog("grid relations: " + m_controlBlock.CubeBlock.getRelationsTo(asGrid), "GridSearch_Enemy()"); //List<IMyPlayer> players = MyAPIGateway.Players.GetPlayers_Safe(); //foreach (var owner in asGrid.BigOwners) //{ // m_logger.debugLog("big owner: " + owner + ", relations: " + m_controlBlock.CubeBlock.getRelationsTo(owner), "GridSearch_Enemy()"); // foreach (var play in players) // if (play.PlayerID == owner) // m_logger.debugLog("big owner name: " + play.DisplayName, "GridSearch_Enemy()"); //} //foreach (var owner in asGrid.SmallOwners) //{ // m_logger.debugLog("small owner: " + owner + ", relations: " + m_controlBlock.CubeBlock.getRelationsTo(owner), "GridSearch_Enemy()"); // foreach (var play in players) // if (play.PlayerID == owner) // m_logger.debugLog("small owner name: " + play.DisplayName , "GridSearch_Enemy()"); //} return false; } m_enemies.Add(seen); m_logger.debugLog("enemy: " + asGrid.DisplayName, "GridSearch_Enemy()"); return false; }); m_logger.debugLog("number of enemies: " + m_enemies.Count, "GridSearch_Enemy()"); IOrderedEnumerable<LastSeen> enemiesByDistance = m_enemies.OrderBy(seen => Vector3D.DistanceSquared(position, seen.GetPosition())); m_reason = ReasonCannotTarget.None; foreach (LastSeen enemy in enemiesByDistance) { if (CanTarget(enemy)) { Grid = enemy; m_logger.debugLog("found target: " + enemy.Entity.getBestName(), "GridSearch_Enemy()"); return; } } Grid = null; m_logger.debugLog("nothing found", "GridSearch_Enemy()"); }