public IEnumerator <bool> Init() { cannonSettings = new INISerializer("CannonSettings"); cannonSettings.AddValue("referenceName", x => x, "RCReference"); cannonSettings.AddValue("speedCap", x => double.Parse(x), 104.38); cannonSettings.AddValue("launchVelocity", x => double.Parse(x), 100.0); cannonSettings.AddValue("sourceRotorTName", x => x, "[OrbitalCannonBase]_[Azimuth]"); cannonSettings.AddValue("elevationTag", x => x, "[Elevation]"); cannonSettings.AddValue("timerName", x => x, "CannonTimer"); if (Me.CustomData == "") { string temp = Me.CustomData; cannonSettings.FirstSerialization(ref temp); Me.CustomData = temp; } else { cannonSettings.DeSerialize(Me.CustomData); } yield return(true); ingameTime = new IngameTime(); GTSUtils = new GridTerminalSystemUtils(Me, GridTerminalSystem); yield return(true); IMyShipController reference = GridTerminalSystem.GetBlockWithName((string)cannonSettings.GetValue("referenceName")) as IMyShipController; IMyMotorStator sourceRotor = GridTerminalSystem.GetBlockWithName((string)cannonSettings.GetValue("sourceRotorTName")) as IMyMotorStator; IMyTimerBlock timer = GridTerminalSystem.GetBlockWithName((string)cannonSettings.GetValue("timerName")) as IMyTimerBlock; Echo($"Getting blocks status:...\nreference: {reference != null}\nsourceRotor: {sourceRotor != null}"); if (reference == null || sourceRotor == null) { throw new Exception("cant get blocks!"); } yield return(true); targeter = new Targeter ( (double)cannonSettings.GetValue("speedCap"), (double)cannonSettings.GetValue("launchVelocity"), reference ); targeter.directionFoundCallback += TargetCalculatedCallback; yield return(true); cannon = Cannon.CreateCannon(sourceRotor, GTSUtils, ingameTime, reference, (string)cannonSettings.GetValue("sourceRotorTName"), (string)cannonSettings.GetValue("elevationTag")); cannon.Timer = timer; yield return(true); Echo("Initialized!"); initialized = true; }