public void Setup(List <IMyMotorStator> rotors, IngameTime ingameTime, DeadzoneProvider deadzoneProvider, string azimuthTag, string elevationTag) { this.deadzoneProvider = deadzoneProvider; this.ingameTime = ingameTime; List <IMyMotorStator> elevation = rotors.Where(x => x.CustomName.Contains(elevationTag)).ToList(); IMyMotorStator azimuth = rotors.First(x => x.CustomName.Contains(azimuthTag)); defaultDir = azimuth.WorldMatrix.Forward; List <IMyMotorStator> cannonBases = Select(elevation); List <RotorControl.RotorReferencePair> elevationPairs = new List <RotorControl.RotorReferencePair>(); for (int i = 0; i < elevation.Count; i++) { elevationPairs.Add(new RotorControl.RotorReferencePair { rotor = elevation[i], reference = cannonBases[i] }); } RotorControl.RotorReferencePair azimuthPair = new RotorControl.RotorReferencePair { rotor = azimuth, reference = cannonBases[0] }; rotorControl = new RotorControl(azimuthPair, elevationPairs); rotorControl.onTarget = OnTarget; #region configuration turretConfig = new INISerializer("TurretConfig"); turretConfig.AddValue("azimuthMultiplier", x => double.Parse(x), -1.0); turretConfig.AddValue("elevationMultiplier", x => double.Parse(x), -1.0); turretConfig.AddValue("salvoSize", x => int.Parse(x), 3); turretConfig.AddValue("salvoTimeout", x => double.Parse(x), 2.5); if (rotorControl.azimuth.rotor.CustomData == "") { string temp = rotorControl.azimuth.rotor.CustomData; turretConfig.FirstSerialization(ref temp); rotorControl.azimuth.rotor.CustomData = temp; } else { turretConfig.DeSerialize(rotorControl.azimuth.rotor.CustomData); } #endregion foreach (var cannonbase in cannonBases) { var launcher = new RotorLauncher(cannonbase, ingameTime, salvoTimeout); launchers.Add(launcher); } }
public void Setup(List <IMyMotorStator> rotors, IngameTime ingameTime, DeadzoneProvider deadzoneProvider, string azimuthTag, string elevationTag, GridTerminalSystemUtils GTS) { this.deadzoneProvider = deadzoneProvider; this.ingameTime = ingameTime; List <IMyMotorStator> elevation = rotors.Where(x => x.CustomName.Contains(elevationTag)).ToList(); IMyMotorStator azimuth = rotors.First(x => x.CustomName.Contains(azimuthTag)); defaultDir = azimuth.WorldMatrix.Forward; #region configuration turretConfig = new INISerializer("TurretConfig"); turretConfig.AddValue("azimuthMultiplier", x => double.Parse(x), -1.0); turretConfig.AddValue("elevationMultiplier", x => double.Parse(x), -1.0); turretConfig.AddValue("referenceName", x => x, "TurretReference"); if (azimuth.CustomData == "") { string temp = azimuth.CustomData; turretConfig.FirstSerialization(ref temp); azimuth.CustomData = temp; } else { turretConfig.DeSerialize(azimuth.CustomData); } #endregion IMyTerminalBlock cannonref = GTS.GridTerminalSystem.GetBlockWithName(referenceName); if (cannonref == null) { throw new Exception($"referenceName ({referenceName}) resolves to NULL!"); } List <RotorControl.RotorReferencePair> elevationPairs = new List <RotorControl.RotorReferencePair>(); for (int i = 0; i < elevation.Count; i++) { elevationPairs.Add(new RotorControl.RotorReferencePair { rotor = elevation[i], reference = cannonref }); } RotorControl.RotorReferencePair azimuthPair = new RotorControl.RotorReferencePair { rotor = azimuth, reference = cannonref }; rotorControl = new RotorControl(azimuthPair, elevationPairs); rotorControl.onTarget += OnTarget; rotorControl.useForward = true; }
public void Setup(List <IMyMotorStator> rotors, IngameTime ingameTime, DeadzoneProvider deadzoneProvider, string azimuthTag, string elevationTag) { this.deadzoneProvider = deadzoneProvider; this.ingameTime = ingameTime; List <IMyMotorStator> elevation = rotors.Where(x => x.CustomName.Contains(elevationTag)).ToList(); IMyMotorStator azimuth = rotors.First(x => x.CustomName.Contains(azimuthTag)); defaultDir = azimuth.WorldMatrix.Forward; List <IMyUserControllableGun> gatlingGunsList = new List <IMyUserControllableGun>(); List <RotorControl.RotorReferencePair> elevationPairs = Select(elevation, gatlingGunsList); RotorControl.RotorReferencePair azimuthPair = new RotorControl.RotorReferencePair { rotor = azimuth, reference = gatlingGunsList[0] }; gatlingGuns = new IMyUserControllableGun[gatlingGunsList.Count]; for (int i = 0; i < gatlingGunsList.Count; i++) { gatlingGuns[i] = gatlingGunsList[i]; } gatlingGunsList = null; rotorControl = new RotorControl(azimuthPair, elevationPairs); rotorControl.onTarget = OnTarget; rotorControl.useForward = true; #region configuration turretConfig = new INISerializer("TurretConfig"); turretConfig.AddValue("azimuthMultiplier", x => double.Parse(x), -1.0); turretConfig.AddValue("elevationMultiplier", x => double.Parse(x), -1.0); if (rotorControl.azimuth.rotor.CustomData == "") { string temp = rotorControl.azimuth.rotor.CustomData; turretConfig.FirstSerialization(ref temp); rotorControl.azimuth.rotor.CustomData = temp; } else { turretConfig.DeSerialize(rotorControl.azimuth.rotor.CustomData); } #endregion }
private void OnTarget(bool val, RotorControl.RotorReferencePair pair) { if (val) { if (currentTargetDir != Vector3D.Zero) { bool blockInTheWay = deadzoneProvider.IsBlockInTheWay(rotorControl.azimuth.reference.GetPosition() + currentTargetDir * 15, rotorControl.azimuth.reference.GetPosition() + currentTargetDir * 800); FireCannons(!blockInTheWay); rotorControl.Lock(false); return; } if (rotorControl.currentAccuracy > accuracyVal && restAfterReset) { rotorControl.Lock(true); restMode = true; } } else if (currentTargetDir != Vector3D.Zero) { rotorControl.Lock(false); } }