Пример #1
0
        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()");
                }
            }
        }
Пример #2
0
        /// <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;
            }
        }