public void Approach(ZACommons commons, EventDriver eventDriver) { if (Mode != Modes.Approaching) { return; } var shipControl = (ShipControlCommons)commons; var controller = GetShipController(shipControl); if (controller == null) { return; } var gravity = controller.GetNaturalGravity(); if (gravity.LengthSquared() > 0.0) { double yawPitchError; seeker.Seek(shipControl, gravity, out yawPitchError); // Shouldn't fail since we do gravity check above if (!controller.TryGetPlanetElevation(MyPlanetElevation.Surface, out Elevation)) { Elevation = 0.0; } Distance = Elevation - TargetElevation; if (Elevation <= TargetElevation) { // All done. Re-enable thrusters and restore control. Reset(shipControl); TimerBlockUtils.StartTimerBlockWithName(commons.Blocks, VTVLHELPER_DROP_DONE); } else { var targetSpeed = Math.Min(Distance * VTVLHELPER_APPROACH_GAIN, VTVLHELPER_BRAKING_SPEED); targetSpeed = Math.Max(targetSpeed, MinimumSpeed); cruiser.Cruise(shipControl, targetSpeed, condition: ThrusterCondition, enableForward: false); // Keep on target Alignment(shipControl, controller); eventDriver.Schedule(FramesPerRun, Approach); } } else { // If we left gravity, just abort. Reset(shipControl); } }
private void TriggerSafeMode(ZACommons commons, EventDriver eventDriver, string timerBlockName = SAFE_MODE_NAME) { Abandoned = true; // No need to trigger any other condition until reset for (var i = 0; i < SafeModeHandlers.Length; i++) { SafeModeHandlers[i].SafeMode(commons, eventDriver); } TimerBlockUtils.StartTimerBlockWithName(commons.Blocks, timerBlockName); }
public void Launch(ZACommons commons, EventDriver eventDriver) { if (Mode != Modes.Launching) { return; } var shipControl = (ShipControlCommons)commons; var controller = GetShipController(shipControl); if (controller == null) { return; } var gravity = controller.GetNaturalGravity(); if (gravity.LengthSquared() > 0.0) { double yawPitchError; seeker.Seek(shipControl, -gravity, out yawPitchError); cruiser.Cruise(shipControl, VTVLHELPER_LAUNCH_SPEED, condition: ThrusterCondition, enableBackward: false); eventDriver.Schedule(FramesPerRun, Launch); } else { // Out of gravity Reset(shipControl); TimerBlockUtils.StartTimerBlockWithName(commons.Blocks, VTVLHELPER_LAUNCH_DONE); } }
public void Run(ZACommons commons, EventDriver eventDriver) { var tanks = ZACommons.GetBlocksOfType <IMyGasTank>(commons.AllBlocks, tank => tank.IsFunctional && tank.IsWorking && tank.CustomName.IndexOf("[Excluded]", ZACommons.IGNORE_CASE) < 0); var currentState = GetOxygenState(tanks); // Only act on level transitions if (PreviousState != currentState) { PreviousState = currentState; // We need a tri-state variable, so... nullable bool?generateOxygen = null; bool?farmOxygen = null; switch (currentState) { case OxygenLevel.High: // Turn off all oxygen production generateOxygen = false; farmOxygen = false; break; case OxygenLevel.Normal: // Do nothing (but keep farms up) farmOxygen = true; break; case OxygenLevel.Buffer: // Start producing oxygen generateOxygen = true; farmOxygen = true; break; case OxygenLevel.Low: // Definitely start producing oxygen generateOxygen = true; farmOxygen = true; // For now, it's intentional that we start timer blocks // on all grids... we'll see how it goes TimerBlockUtils.StartTimerBlockWithName(commons.AllBlocks, LOW_OXYGEN_NAME); break; } if (generateOxygen != null) { // Limit to this grid -- don't mess with any other ship's systems var generators = ZACommons.GetBlocksOfType <IMyGasGenerator>(commons.Blocks, block => block.IsFunctional); ZACommons.EnableBlocks(generators, (bool)generateOxygen); } if (farmOxygen != null) { var farms = ZACommons.GetBlocksOfType <IMyOxygenFarm>(commons.Blocks, block => block.IsFunctional); // Farms don't implement IMyFunctionalBlock?? ZACommons.EnableBlocks(farms, (bool)farmOxygen); // We'll count atmosphere intake vents too, since they're "free" var vents = ZACommons.GetBlocksOfType <IMyAirVent>(commons.Blocks, vent => vent.IsFunctional && vent.Depressurize && vent.CustomName.IndexOf("[Intake]", ZACommons.IGNORE_CASE) >= 0); ZACommons.EnableBlocks(vents, (bool)farmOxygen); } } eventDriver.Schedule(RunDelay, Run); }