Exemple #1
0
            private IEnumerator <bool> TargetingRoutine()
            {
                if (control.GetNaturalGravity() == Vector3D.Zero && control.GetShipSpeed() < 2)         // Easy
                {
                    quartic = new QuarticTargeting(control.GetVelocityVector(), control.GetPosition(), maxProjectileVel);

                    Vector3D?result = quartic.CalculateTrajectory(target);
                    if (result.HasValue)
                    {
                        onRoutineFinish?.Invoke(result.Value);
                    }
                    else
                    {
                        onRoutineFail?.Invoke();
                    }

                    yield return(false);
                }
                else                                                                                  // This may take a while...
                {
                    double timescale      = 0.1;
                    var    projectileInfo = new AdvancedSimTargeting.ProjectileInfo(200, maxProjectileVel, timescale, control.GetPosition(), control.GetVelocityVector());
                    simTargeting = new AdvancedSimTargeting(projectileInfo, target, control, ingameTime, 25, true, maxProjectileVel, timescale);
                    simTargeting.onSimComplete += OnSimValid;
                    simTargeting.onSimFail     += OnSimFail;

                    yield return(true);

                    while (keepRunning)
                    {
                        simTargeting.Tick();
                        yield return(true);
                    }
                }
            }
                public ProjectileInfo(long lifeTimeTicks, double projectileMaxSpeed, double timescale, Vector3D currentLocation, Vector3D currentVelocity)
                {
                    this.lifeTimeTicks      = lifeTimeTicks;
                    this.timescale          = timescale;
                    this.projectileMaxSpeed = projectileMaxSpeed;
                    this.currentLocation    = currentLocation;
                    this.currentVelocity    = currentVelocity;

                    quartic = new QuarticTargeting(currentVelocity, currentLocation);
                }
        public IEnumerator <bool> Init()
        {
            control = GridTerminalSystem.GetBlockWithName(controllerName) as IMyShipController;
            if (control == null)
            {
                Echo($"no shipcontroller found with name {controllerName}!");
                yield return(false);
            }

            List <IMyTextPanel> lcds = new List <IMyTextPanel>();

            GridTerminalSystem.GetBlocksOfType(lcds, x => x.CustomName.Contains(lcdStatusTag));
            statusWriter = new StatusWriter(lcds);


            targetTracker = new EntityTracking_Module(GTSUtils, control, null);
            foreach (var tracker in targetTracker.ObjectTrackers)
            {
                var turretTracker = tracker as TurretTracking;
                if (turretTracker != null)
                {
                    turretTracker.earlyReturn = true;
                }
            }
            targetTracker.onEntityDetected += OnEntityDetected;

            gridCannonTargeting = new PhysicsTargeting(control, ingameTime, maxProjectileVel);
            gridCannonTargeting.onRoutineFinish += OnTargetSolvedRotor;
            gridCannonTargeting.onRoutineFail   += OnTargetingFailRotor;
            gridCannonTargeting.onTargetTimeout += OnTargetTimeoutRotor;

            missileCannonTargeting = new PhysicsTargeting(control, ingameTime, maxMissileVel);
            missileCannonTargeting.onRoutineFinish += OnTargetSolvedMissile;
            missileCannonTargeting.onRoutineFail   += OnTargetingFailMissile;
            missileCannonTargeting.onTargetTimeout += OnTargetTimeoutMissile;
            missileCannonTargeting.IgnoreGravity    = true;
            missileCannonTargeting.ForwardAccel     = maxMissileAccel;

            basicTargeting = new QuarticTargeting(Vector3D.Zero, Vector3D.Zero, maxGatlingBulletVel);

            switch (groupType)
            {
            case "BlockGroup":
                List <IMyBlockGroup> groups = new List <IMyBlockGroup>();
                GridTerminalSystem.GetBlockGroups(groups, x => x.Name.Contains(rotorTurretGroupTag));
                foreach (var group in groups)
                {
                    AddRotorTurret(group);
                    yield return(true);
                }
                groups.Clear();
                GridTerminalSystem.GetBlockGroups(groups, x => x.Name.Contains(gatlingTurretGroupTag));
                foreach (var group in groups)
                {
                    AddGatlingTurret(group);
                    yield return(true);
                }
                groups.Clear();
                GridTerminalSystem.GetBlockGroups(groups, x => x.Name.Contains(missileTurretGroupTag));
                foreach (var group in groups)
                {
                    AddMissileTurret(group);
                    yield return(true);
                }
                break;

            case "NameTag":
                List <IMyMotorStator> rotors = new List <IMyMotorStator>();
                GridTerminalSystem.GetBlocksOfType(rotors, x => x.CustomName.Contains(rotorTurretGroupTag));
                foreach (var stator in rotors)
                {
                    AddRotorTurret(stator);
                    yield return(true);
                }
                rotors.Clear();
                GridTerminalSystem.GetBlocksOfType(rotors, x => x.CustomName.Contains(gatlingTurretGroupTag));
                foreach (var stator in rotors)
                {
                    AddGatlingTurret(stator);
                    yield return(true);
                }
                rotors.Clear();
                GridTerminalSystem.GetBlocksOfType(rotors, x => x.CustomName.Contains(missileTurretGroupTag));
                foreach (var stator in rotors)
                {
                    AddMissileTurret(stator);
                    yield return(true);
                }
                break;

            case "Any":
                List <IMyBlockGroup> groupsA = new List <IMyBlockGroup>();
                GridTerminalSystem.GetBlockGroups(groupsA, x => x.Name.Contains(rotorTurretGroupTag));
                foreach (var group in groupsA)
                {
                    AddRotorTurret(group);
                    yield return(true);
                }
                groupsA.Clear();
                GridTerminalSystem.GetBlockGroups(groupsA, x => x.Name.Contains(gatlingTurretGroupTag));
                foreach (var group in groupsA)
                {
                    AddGatlingTurret(group);
                    yield return(true);
                }
                groupsA.Clear();
                GridTerminalSystem.GetBlockGroups(groupsA, x => x.Name.Contains(missileTurretGroupTag));
                foreach (var group in groupsA)
                {
                    AddMissileTurret(group);
                    yield return(true);
                }

                List <IMyMotorStator> rotorsA = new List <IMyMotorStator>();
                GridTerminalSystem.GetBlocksOfType(rotorsA, x => x.CustomName.Contains(rotorTurretGroupTag));
                foreach (var stator in rotorsA)
                {
                    AddRotorTurret(stator);
                    yield return(true);
                }
                rotorsA.Clear();
                GridTerminalSystem.GetBlocksOfType(rotorsA, x => x.CustomName.Contains(gatlingTurretGroupTag));
                foreach (var stator in rotorsA)
                {
                    AddGatlingTurret(stator);
                    yield return(true);
                }
                rotorsA.Clear();
                GridTerminalSystem.GetBlocksOfType(rotorsA, x => x.CustomName.Contains(missileTurretGroupTag));
                foreach (var stator in rotorsA)
                {
                    AddMissileTurret(stator);
                    yield return(true);
                }
                break;
            }

            statusWriter.UpdateCannonCount(rotorTurretGroups.Count, 0, 0);
            initialized = true;
        }