public void Main(string argument, UpdateType updateSource) { if (!ModuleInited()) { return; } if (init_error) { Echo(init_message); ProgBlockLCD.WriteText(init_message); if (LCD != null) { LCD.WriteText(init_message); } return; } ToLog("", false, false); Vector3D GravityVector = Cockpit.GetNaturalGravity(); Vector3D GravityNorm = Vector3D.Normalize(GravityVector); Vector3D VelocityVector = Cockpit.GetShipVelocities().LinearVelocity; Vector3D VelocityVectorNorm = Vector3D.Normalize(VelocityVector); Vector3D ForwardVectorNorm = Vector3D.Normalize(Vector3D.Reject(Cockpit.WorldMatrix.Forward, GravityNorm)); Vector3D LeftVectorNorm = Vector3D.Normalize(Vector3D.Reject(Cockpit.WorldMatrix.Left, GravityNorm)); Vector3D ForwardInput = ForwardVectorNorm * Cockpit.MoveIndicator.Z; Vector3D LeftInput = LeftVectorNorm * Cockpit.MoveIndicator.X; Vector3D ForwardVelocity = Vector3D.ProjectOnVector(ref VelocityVector, ref ForwardVectorNorm); Vector3D LeftVelocity = Vector3D.ProjectOnVector(ref VelocityVector, ref LeftVectorNorm); float UpInput = Cockpit.MoveIndicator.Y / 10; Vector3D AlignVector = Vector3D.Zero; /*if (!string.IsNullOrEmpty(argument)) * { * string cmd, cmd_param; * string argument_norm = argument.Trim().ToLower(); * int spc_idx = argument_norm.IndexOf(" "); * if (spc_idx == -1) * { * cmd = argument_norm; * cmd_param = string.Empty; * } * else * { * cmd = argument_norm.Substring(0, spc_idx); * cmd_param = argument_norm.Substring(spc_idx + 1).TrimStart(); * }*/ switch (argument) { case "Dampeners": { PilotMode = PilotModeEnum.Dampeners; break; } case "Cruise": { PilotMode = PilotModeEnum.Cruise; if (ForwardVectorNorm == Vector3D.Normalize(ForwardVelocity)) { cruisespeed = -(float)ForwardVelocity.Length(); } else { cruisespeed = (float)ForwardVelocity.Length(); } break; } case "FreeMove": { PilotMode = PilotModeEnum.FreeMove; break; } case "Drill": { PilotMode = PilotModeEnum.Cruise; cruisespeed = 3f; altitude = 4f; foreach (IMyThrust hover in HoverList) { hover.SetValue <float>("altitudemin_slider_L", altitude); } break; } case "Down": { PilotMode = PilotModeEnum.Cruise; cruisespeed = 5f; altitude = 5f; foreach (IMyThrust hover in HoverList) { hover.SetValue <float>("altitudemin_slider_L", altitude); } break; } default: break; } //} if (!Vector3D.IsZero(LeftInput)) { AlignVector += LeftInput * KI; } else if (PilotMode != PilotModeEnum.FreeMove) { AlignVector += LeftVelocity * KV; } if (!Vector3D.IsZero(ForwardInput)) { if (PilotMode == PilotModeEnum.Cruise) { cruisespeed += -Cockpit.MoveIndicator.Z / 10; AlignVector += (ForwardVelocity - ForwardVectorNorm * cruisespeed) * KV; } else { AlignVector += ForwardInput * KI; } } else if (PilotMode == PilotModeEnum.Cruise) { AlignVector += (ForwardVelocity - ForwardVectorNorm * cruisespeed) * KV; } else if (PilotMode != PilotModeEnum.FreeMove) { AlignVector += ForwardVelocity * KV; } AlignVector += GravityNorm; float PitchInput = -(float)AlignVector.Dot(Cockpit.WorldMatrix.Forward); float RollInput = (float)AlignVector.Dot(Cockpit.WorldMatrix.Left); float YawInput = Cockpit.RollIndicator; foreach (IMyThrust hover in HoverList) { altitude = hover.GetValue <float>("altitudemin_slider_L"); altitude += UpInput; hover.SetValue <float>("altitudemin_slider_L", altitude); } foreach (IMyGyro gyro in GyroList) { gyro.GyroOverride = true; gyro.Yaw = YawInput; gyro.Roll = RollInput; gyro.Pitch = PitchInput; } DisplayUpdateCounter += 1; if (DisplayUpdateCounter >= DisplayUpdateInterval) { ProgBlockLCD.WriteText("Cycle time, µs: " + (runTime * DisplayUpdateFreq).ToString("#0.0") + "\n"); Echo("Cycle time, µs: " + (runTime * DisplayUpdateFreq).ToString("#0.0") + "\n" + init_message); DisplayUpdateCounter = 0; runTime = 0d; Cockpit.TryGetPlanetElevation(MyPlanetElevation.Sealevel, out SealevelAlt); Cockpit.TryGetPlanetElevation(MyPlanetElevation.Surface, out SurfaceAlt); ProgBlockLCD.WriteText("Режим: " + PilotModeToString() + "\n", true); ProgBlockLCD.WriteText(string.Format("cruisespeed: {0:#0.0}\n", cruisespeed), true); ProgBlockLCD.WriteText(string.Format("FV: {0:#0.0} / LV: {1:#0.0} / V: {2:#0.0}\n", ForwardVelocity.Length(), LeftVelocity.Length(), VelocityVector.Length()), true); ProgBlockLCD.WriteText(string.Format("Alt: {0:#0.0} / SLA: {1:#0.0} / SFA: {2:#0.0}\n", altitude, SealevelAlt, SurfaceAlt), true); if (LCD != null) { string t = ProgBlockLCD.GetText(); LCD.WriteText(t); } } runTime += Runtime.LastRunTimeMs; }
public void Main(string argument, UpdateType updateSource) { if (!ModuleInited()) { return; } if (init_error) { Echo(init_message); ProgBlockLCD.WriteText(init_message); if (LCD != null) { LCD.WriteText(init_message); } return; } ToLog("", false, false); Vector3D GravityVector = Cockpit.GetNaturalGravity(); Vector3D GravityNorm = Vector3D.Normalize(GravityVector); Vector3D VelocityVector = Cockpit.GetShipVelocities().LinearVelocity; Vector3D VelocityVectorNorm = Vector3D.Normalize(VelocityVector); Vector3D ForwardVectorNorm = Vector3D.Normalize(Vector3D.Reject(Cockpit.WorldMatrix.Forward, GravityNorm)); Vector3D LeftVectorNorm = Vector3D.Normalize(ForwardVectorNorm.Cross(GravityNorm)); Vector3D ForwardInput = ForwardVectorNorm * Cockpit.MoveIndicator.Z; Vector3D LeftInput = LeftVectorNorm * Cockpit.MoveIndicator.X; Vector3D ForwardVelocity = Vector3D.ProjectOnVector(ref VelocityVector, ref ForwardVectorNorm); Vector3D LeftVelocity = Vector3D.ProjectOnVector(ref VelocityVector, ref LeftVectorNorm); float UpInput = Cockpit.RollIndicator / 10; Vector3D AlignVector = Vector3D.Zero; switch (argument) { case "Dampeners": { PilotMode = PilotModeEnum.Dampeners; break; } case "Cruise": { PilotMode = PilotModeEnum.Cruise; if ((ForwardVectorNorm + ForwardVelocity).Length() > ForwardVelocity.Length()) { cruisespeed = (float)ForwardVelocity.Length(); } else { cruisespeed = -(float)ForwardVelocity.Length(); } break; } case "FreeMove": { PilotMode = PilotModeEnum.FreeMove; break; } default: break; } if (!Vector3D.IsZero(LeftInput)) { AlignVector += LeftInput * KI; } else if (PilotMode != PilotModeEnum.FreeMove) { AlignVector += LeftVelocity * KV; } if (!Vector3D.IsZero(ForwardInput)) { if (PilotMode == PilotModeEnum.Cruise) { cruisespeed += -Cockpit.MoveIndicator.Z / 10; AlignVector += (ForwardVelocity - ForwardVectorNorm * cruisespeed) * KV; } else { AlignVector += ForwardInput * KI; } } else if (PilotMode == PilotModeEnum.Cruise) { AlignVector += (ForwardVelocity - ForwardVectorNorm * cruisespeed) * KV; } else if (PilotMode != PilotModeEnum.FreeMove) { AlignVector += ForwardVelocity * KV; } AlignVector += GravityNorm; float PitchInput = -(float)AlignVector.Dot(Cockpit.WorldMatrix.Forward); float RollInput = (float)AlignVector.Dot(Cockpit.WorldMatrix.Left); float YawInput = Cockpit.RotationIndicator.Y; foreach (IMyThrust hover in HoverList) { altitude = hover.GetValue <float>("altitudemin_slider_L"); altitude += UpInput; hover.SetValue <float>("altitudemin_slider_L", altitude); } foreach (IMyGyro gyro in GyroList) { gyro.GyroOverride = true; gyro.Yaw = YawInput; gyro.Roll = RollInput; gyro.Pitch = PitchInput; } DisplayUpdateCounter += 1; if (DisplayUpdateCounter >= DisplayUpdateInterval) { ProgBlockLCD.WriteText("\n" + "\n" + "\n" + "Cycle time, µs: " + (runTime * DisplayUpdateFreq).ToString("#0.0") + "\n"); Echo("Cycle time, µs: " + (runTime * DisplayUpdateFreq).ToString("#0.0") + "\n" + init_message); DisplayUpdateCounter = 0; runTime = 0d; ProgBlockLCD.WriteText(PilotModeToString(), true); string speed = string.Format("Скорость: {0:#0.0} / ", VelocityVector.Length()); if ((ForwardVectorNorm + ForwardVelocity).Length() > ForwardVelocity.Length()) { speed += string.Format("Вперед: {0:#0.0} / ", ForwardVelocity.Length()); } else { speed += string.Format("Назад: {0:#0.0} / ", ForwardVelocity.Length()); } if ((LeftVectorNorm + LeftVelocity).Length() > LeftVelocity.Length()) { speed += string.Format("Влево: {0:#0.0}\n", LeftVelocity.Length()); } else { speed += string.Format("Вправо: {0:#0.0}\n", LeftVelocity.Length()); } ProgBlockLCD.WriteText(speed, true); double sla; double sfa; Cockpit.TryGetPlanetElevation(MyPlanetElevation.Sealevel, out sla); Cockpit.TryGetPlanetElevation(MyPlanetElevation.Surface, out sfa); ProgBlockLCD.WriteText(string.Format("Высота: пар. {0:#0.0} / ур. м. {1:#0.0} / пов. {2:#0.0}\n", altitude, sla, sfa), true); float thrust = 0; foreach (IMyThrust hover in HoverList) { thrust += hover.MaxThrust; } float curmass = Cockpit.CalculateShipMass().PhysicalMass; float maxmass = thrust / (float)Cockpit.GetNaturalGravity().Length() * 3f; ProgBlockLCD.WriteText(string.Format("Груз: {0:# ### ###} кг из {1:# ### ###} кг / {2: ##.# %}\n", curmass, maxmass, curmass / maxmass), true); float curvol = 0; float maxvol = 0; IMyInventory inv; foreach (IMyCargoContainer cargo in CargoList) { inv = cargo.GetInventory(); curvol += (float)inv.CurrentVolume; maxvol += (float)inv.MaxVolume; } ProgBlockLCD.WriteText(string.Format("Трюм: {0:# ### ###} л из {1:# ### ###} л / {2: ##.# %}\n", curvol * 1000, maxvol * 1000, curvol / maxvol), true); if (LCD != null) { string t = ProgBlockLCD.GetText(); LCD.WriteText(t); } } runTime += Runtime.LastRunTimeMs; }