Beispiel #1
0
        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);
        }
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
        /// <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;
            }
        }