示例#1
0
            public void Poll()
            {
                foreach (var sensor in sensors)
                {
                    if (sensor.Enabled)
                    {
                        if ((refExpSettings & EntityTracking_Module.refExpSettings.Lidar) != 0 || (Me?.IsSameConstructAs(sensor) ?? true))
                        {
                            templist.Clear();
                            sensor.DetectedEntities(templist);

                            foreach (var entity in templist)
                            {
                                HaE_Entity detectedEntity = new HaE_Entity
                                {
                                    entityInfo        = entity,
                                    LastDetectionTime = DateTime.Now,
                                    trackingType      = TRACKINGTYPE
                                };

                                OnEntityDetected?.Invoke(detectedEntity);
                            }
                        }
                    }
                }
            }
示例#2
0
            public HaE_Entity RaycastPosition(Vector3D position)
            {
                IMyCameraBlock camera = GetUsableCamera(position);

                if (camera == null)
                {
                    return(null);
                }


                MyDetectedEntityInfo detected = camera.Raycast(position);

                if (!detected.IsEmpty())
                {
                    HaE_Entity detectedEntity = new HaE_Entity
                    {
                        entityInfo        = detected,
                        LastDetectionTime = DateTime.Now,
                        trackingType      = TRACKINGTYPE
                    };

                    return(detectedEntity);
                }

                return(null);
            }
示例#3
0
            /// <summary>
            /// PRONAV
            /// </summary>
            /// <param name="target"></param>
            /// <returns>Heading we need to aim at</returns>
            public Vector3D Navigate(HaE_Entity target)
            {
                Vector3D targetpos = target.entityInfo.Position;

                if (target.entityInfo.HitPosition.HasValue)
                {
                    targetpos = target.entityInfo.HitPosition.Value;
                }

                Vector3D myVel = controller.control.GetShipVelocities().LinearVelocity;

                Vector3D rangeVec   = targetpos - controller.control.GetPosition();
                Vector3D closingVel = target.entityInfo.Velocity - myVel;

                Vector3D accel = CalculateAccel(rangeVec, closingVel);

                accel += -controller.control.GetNaturalGravity();                              //Gravity term

                double maxForwardAccel = ThrustUtils.GetForwardThrust(controller.thrusters, controller.control);

                maxForwardAccel /= controller.control.CalculateShipMass().PhysicalMass;

                double forwardAccel = maxForwardAccel;
                double accelMag     = accel.Normalize();

                forwardAccel -= accelMag;
                forwardAccel  = MathHelperD.Clamp(forwardAccel, 0, maxForwardAccel);

                accel *= accelMag;
                accel += Vector3D.Normalize(rangeVec) * forwardAccel;
                return(accel);
            }
            private bool CheckIfEntityRelevant(HaE_Entity entity, Vector3D currentHeading)
            {
                if (entity.entityInfo.EntityId == rc.CubeGrid.EntityId)
                {
                    return(false);
                }

                if (entity.BoundingSphere.Radius <= 0)
                {
                    return(false);
                }

                Vector3D movementDir = rc.GetShipVelocities().LinearVelocity;

                movementDir.Normalize();

                RayD movementRay = new RayD(rc.CubeGrid.WorldVolume.Center, movementDir);
                RayD headingRay  = new RayD(rc.CubeGrid.WorldVolume.Center, currentHeading);

                BoundingSphereD sphere = entity.BoundingSphere;

                sphere.Radius += rc.CubeGrid.WorldVolume.Radius;

                double?intersectVel     = sphere.Intersects(movementRay);
                double?intersectHeading = sphere.Intersects(headingRay);

                return(intersectVel.HasValue || intersectHeading.HasValue);
            }
            public void Poll()
            {
                foreach (var turret in turrets)
                {
                    if (turret.HasTarget)
                    {
                        if ((refExpSettings & EntityTracking_Module.refExpSettings.Turret) != 0 || (Me?.IsSameConstructAs(turret) ?? true))
                        {
                            HaE_Entity detectedEntity = new HaE_Entity
                            {
                                entityInfo        = turret.GetTargetedEntity(),
                                LastDetectionTime = DateTime.Now,
                                trackingType      = TRACKINGTYPE
                            };

                            OnEntityDetected?.Invoke(detectedEntity);

                            if (earlyReturn)
                            {
                                return;
                            }
                        }
                    }
                }
            }
示例#6
0
            public bool UpdateEntity(HaE_Entity entity)
            {
                if (!detectedEntitiesDict.ContainsKey(entity.entityInfo.EntityId))
                {
                    return(false);
                }

                detectedEntitiesDict[entity.entityInfo.EntityId] = entity;

                detectedEntitiesSet.Remove(entity);
                detectedEntitiesSet.Add(entity);

                switch (entity.trackingType)
                {
                case HaE_Entity.TrackingType.Lidar:
                    _lidarEntities.Remove(entity);
                    _lidarEntities.Add(entity);
                    break;

                case HaE_Entity.TrackingType.Sensor:
                    _sensorEntities.Remove(entity);
                    _sensorEntities.Add(entity);
                    break;

                case HaE_Entity.TrackingType.Turret:
                    _turretEntities.Remove(entity);
                    _turretEntities.Add(entity);
                    break;
                }

                return(true);
            }
示例#7
0
 public void OnEntityDetected(HaE_Entity entity)
 {
     if (CheckIfEntityRelevant(entity, lastHeadingDir))
     {
         relevantEntities[entity.entityInfo.EntityId] = entity;
     }
 }
            public static Vector3D GetPredictedEntityLocation(HaE_Entity entity)
            {
                Vector3D oldPosition = entity.entityInfo.Position;
                Vector3D velocity    = entity.entityInfo.Velocity;
                double   timeSinceLastDetectionSeconds = entity.GetTimeSinceAdded().TotalSeconds;


                return(oldPosition + velocity * timeSinceLastDetectionSeconds);
            }
示例#9
0
        public void OnEntityDetected(HaE_Entity entity)
        {
            statusWriter.LogEvent($"LIDAR: Entity detected! | {entity.entityInfo.Name}");

            if (waitForNextLock != null)
            {
                waitForNextLock.Invoke(entity);
                waitForNextLock = null;
            }
        }
示例#10
0
            public bool GetEntityById(long entityId, ref HaE_Entity entity)
            {
                if (!detectedEntitiesDict.ContainsKey(entityId))
                {
                    return(false);
                }

                entity = detectedEntitiesDict[entityId];
                return(true);
            }
示例#11
0
            public bool Remove(HaE_Entity entity)
            {
                if (detectedEntitiesDict.Remove(entity.entityInfo.EntityId))
                {
                    _lidarEntities.Remove(entity);
                    _sensorEntities.Remove(entity);
                    _turretEntities.Remove(entity);
                    detectedEntitiesSet.Remove(entity);
                    return(true);
                }

                return(false);
            }
 public void OnEntityDetected(HaE_Entity entity)
 {
     if (CheckIfEntityRelevant(entity, lastHeadingDir))
     {
         if (relevantEntities.Contains(entity))
         {
             relevantEntities.Remove(entity);
             relevantEntities.Add(entity);
         }
         else
         {
             relevantEntities.Add(entity);
         }
     }
 }
示例#13
0
            private void RaycastEntity(HaE_Entity entity)
            {
                Vector3D   extrapolatedPosition = TrackingUtils.GetPredictedEntityLocation(entity);
                HaE_Entity detectedEntity       = RaycastPosition(extrapolatedPosition);

                if (detectedEntity == null)
                {
                    if (!AttemptReScan(entity))
                    {
                        return;
                    }
                }

                OnEntityDetected?.Invoke(detectedEntity);
            }
        public void OnTargetFound(HaE_Entity target)
        {
            Vector3D targetPos = target.entityInfo.Position;

            if (mode == CurrentMode.Idle || mode == CurrentMode.Launching)
            {
                return;
            }
            else if (mode == CurrentMode.TurretGuided)
            {
                if (target.trackingType != HaE_Entity.TrackingType.Turret)
                {
                    return;
                }
            }
            else if (mode == CurrentMode.LidarGuided)
            {
                if (target.trackingType != HaE_Entity.TrackingType.Lidar)
                {
                    return;
                }

                if (target.entityInfo.HitPosition.HasValue)
                {
                    targetPos = target.entityInfo.HitPosition.Value;
                }
            }

            if ((target.entityInfo.Relationship != MyRelationsBetweenPlayerAndBlock.Enemies) &&
                (target.entityInfo.Relationship != MyRelationsBetweenPlayerAndBlock.Neutral) &&
                (target.entityInfo.Relationship != MyRelationsBetweenPlayerAndBlock.NoOwnership))
            {
                return;
            }

            double distSq = Vector3D.DistanceSquared(Me.GetPosition(), targetPos);

            payload.UpdateDist(distSq);

            Vector3D reqDir = proNav.Navigate(target);
            double   reqMag = reqDir.Normalize();

            controlModule.AimMissile(reqDir);

            controlModule.ApplyThrust(reqDir);
        }
示例#15
0
            public void Poll()
            {
                foreach (var turret in turrets)
                {
                    if (turret.HasTarget)
                    {
                        HaE_Entity detectedEntity = new HaE_Entity
                        {
                            entityInfo        = turret.GetTargetedEntity(),
                            LastDetectionTime = DateTime.Now,
                            trackingType      = TRACKINGTYPE
                        };

                        OnEntityDetected?.Invoke(detectedEntity);
                    }
                }
            }
            private void OnEntityDetected(HaE_Entity entity)
            {
                if (entity == null)
                {
                    return;
                }

                if (known_Objects.Contains(entity))
                {
                    known_Objects.UpdateEntity(entity);
                }
                else
                {
                    known_Objects.AddEntity(entity);
                }

                onEntityDetected?.Invoke(entity);
            }
            public bool Scan(double distance)
            {
                bool detected = false;

                foreach (var direction in localScanMap)
                {
                    Vector3D worldDirection = VectorUtils.TransformDirLocalToWorld(rc.WorldMatrix, direction);
                    Vector3D worldPos       = rc.GetPosition() + worldDirection * distance;

                    HaE_Entity entity = trackingModule.PaintTarget(worldPos);
                    if (entity != null)
                    {
                        detected = true;
                    }
                }

                return(detected);
            }
示例#18
0
            private bool AttemptReScan(HaE_Entity entity)
            {
                Vector3D Direction = entity.entityInfo.Position - reference.GetPosition();
                double   distance  = Direction.Normalize();

                for (int i = 0; i < MaxReScanAmount; i++)
                {
                    Vector3D   scanDir  = TrackingUtils.GenerateShotgunVector(random, Direction, ReScanConeAngle);
                    HaE_Entity detected = RaycastDirection(Direction, distance * ReScanMultiplier);

                    if (detected != null)
                    {
                        OnEntityDetected?.Invoke(detected);
                        return(true);
                    }
                }

                return(false);
            }
            public HaE_Entity PaintTarget(Vector3D position)
            {
                foreach (var camera in cameras)
                {
                    if (camera.CanScan(position))
                    {
                        MyDetectedEntityInfo detected = camera.Raycast(position);

                        HaE_Entity detectedEntity = new HaE_Entity
                        {
                            entityInfo        = detected,
                            LastDetectionTime = DateTime.Now,
                            trackingType      = TRACKINGTYPE
                        };

                        return(detectedEntity);
                    }
                }

                return(null);
            }
            public void Poll()
            {
                foreach (var sensor in sensors)
                {
                    if (sensor.Enabled)
                    {
                        templist.Clear();
                        sensor.DetectedEntities(templist);

                        foreach (var entity in templist)
                        {
                            HaE_Entity detectedEntity = new HaE_Entity
                            {
                                entityInfo        = entity,
                                LastDetectionTime = DateTime.Now,
                                trackingType      = TRACKINGTYPE
                            };

                            OnEntityDetected?.Invoke(detectedEntity);
                        }
                    }
                }
            }
示例#21
0
            public HaE_Entity PaintTarget(Vector3D position)
            {
                foreach (var camera in cameras)
                {
                    if ((refExpSettings & EntityTracking_Module.refExpSettings.Lidar) != 0 || (Me?.IsSameConstructAs(camera) ?? true))
                    {
                        if (camera.CanScan(position))
                        {
                            MyDetectedEntityInfo detected = camera.Raycast(position);

                            HaE_Entity detectedEntity = new HaE_Entity
                            {
                                entityInfo        = detected,
                                LastDetectionTime = DateTime.Now,
                                trackingType      = TRACKINGTYPE
                            };

                            return(detectedEntity);
                        }
                    }
                }
                return(null);
            }
示例#22
0
            public HaE_Entity PaintTarget(double distance)
            {
                if (targetingCamera == null)
                {
                    return(null);
                }

                MyDetectedEntityInfo detected = targetingCamera.Raycast(distance);

                if (!detected.IsEmpty())
                {
                    HaE_Entity detectedEntity = new HaE_Entity
                    {
                        entityInfo        = detected,
                        LastDetectionTime = DateTime.Now,
                        trackingType      = TRACKINGTYPE
                    };

                    return(detectedEntity);
                }

                return(null);
            }
示例#23
0
        public void OnEntityDetected(HaE_Entity entity)
        {
            if (Vector3D.DistanceSquared(entity.entityInfo.Position, control.GetPosition()) > 1000 * 1000)
            {
                return;
            }

            if (IgnoreEventAfterOnce)
            {
                return;
            }

            if (control.GetShipSpeed() < maxActiveRotorGunVel)
            {
                gridCannonTargeting.NewTarget(entity.entityInfo);
            }
            else
            {
                foreach (var cannon in rotorTurretGroups)
                {
                    cannon.TargetDirection(ref Vector3D.Zero);
                }
            }

            statusWriter.UpdateStatus(StatusWriter.TargetingStatus.Targeting);

            missileCannonTargeting.NewTarget(entity.entityInfo);
            basicTargeting.UpdateValues(control.GetVelocityVector(), control.GetPosition(), maxGatlingBulletVel);
            var result = basicTargeting.CalculateTrajectory(entity.entityInfo);

            if (result.HasValue)
            {
                TargetSolvedGatling(result.Value);
            }

            IgnoreEventAfterOnce = true;
        }
示例#24
0
 public bool Contains(HaE_Entity entity)
 {
     return(detectedEntitiesSet.Contains(entity));
 }
            private void WaitForNextLock(HaE_Entity entity)
            {
                var missile = P.missiles.GetLaunchedMissile(entity.entityInfo.Position);

                missile?.RetargetRayCast(entity.entityInfo.Position);
            }