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; }