Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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;
            }
        }
Beispiel #4
0
        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()");
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
		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()");
		}