public static bool CheckHummingbirdComponents(IMyShipMergeBlock baseplate, ref IMyShipConnector connector, ref IMyMotorStator turretRotor, ref List <IMyTerminalBlock> PartsScratchpad, ref string status) { var releaseOther = GridTerminalHelper.OtherMergeBlock(baseplate); if (releaseOther == null || !releaseOther.IsFunctional || !releaseOther.Enabled) { return(false); } PartsScratchpad.Clear(); var gotParts = GridTerminalHelper.Base64BytePosToBlockList(releaseOther.CustomData, releaseOther, ref PartsScratchpad); if (!gotParts) { return(false); } foreach (var block in PartsScratchpad) { if (!block.IsFunctional) { return(false); } if (block is IMyMotorStator) { turretRotor = (IMyMotorStator)block; } if (block is IMyShipConnector) { connector = (IMyShipConnector)block; } } return(true); }
public Hummingbird Release() { releaseStage = -10; var bird = Hummingbird; Hummingbird = null; turretRotor = null; hummingbirdConnector = null; GridTerminalHelper.OtherMergeBlock(ChasisMerge).Enabled = false; TurretMerge.Enabled = true; return(bird); }
public Program() { Runtime.UpdateFrequency = UpdateFrequency.Update100; GridTerminalSystem.GetBlocksOfType <IMyTerminalBlock>(null, CollectParts); StatusBuilder.Clear(); var AOK = true; if (SmallHinge == null) { AOK = false; StatusBuilder.AppendLine("SMALL HINGE NOT FOUND!"); } if (LargeHinge == null) { AOK = false; StatusBuilder.AppendLine("LARGE HINGE NOT FOUND!"); } if (Sweeper == null) { AOK = false; StatusBuilder.AppendLine("SWEEPER NOT FOUND!"); } if (BaseProjector == null) { AOK = false; StatusBuilder.AppendLine("BASE PROJECTOR NOT FOUND!"); } if (TopProjector == null) { AOK = false; StatusBuilder.AppendLine("TOP PROJECTOR NOT FOUND!"); } if (TopMerge == null) { AOK = false; StatusBuilder.AppendLine("TOP MERGE NOT FOUND!"); } if (BaseMerge == null) { AOK = false; StatusBuilder.AppendLine("BASE MERGE NOT FOUND!"); } if (Welders.Count < 5) { AOK = false; StatusBuilder.AppendLine("NOT ENOUGH WELDERS!"); } if (Display != null) { Display.ContentType = ContentType.TEXT_AND_IMAGE; Display.WriteText(StatusBuilder.ToString()); } if (!AOK) { Echo(StatusBuilder.ToString()); Runtime.UpdateFrequency = UpdateFrequency.None; } else { var baseOtherMerge = GridTerminalHelper.OtherMergeBlock(BaseMerge); var topOtherMerge = GridTerminalHelper.OtherMergeBlock(TopMerge); if (topOtherMerge != null && baseOtherMerge == null) { State = 4; } } ReleaseListener = IGC.RegisterBroadcastListener("[PDCFORGE]"); ReleaseListener.SetMessageCallback("release"); }
public void Main(string argument, UpdateType updateSource) { if (argument == "releaseremote") { IGC.SendBroadcastMessage("[PDCFORGE]", ""); } else if (argument == "save") { if (Elevation != null && BaseMerge != null) { var list = new List <IMyTerminalBlock>(); list.Add(Elevation); BaseMerge.CustomData = GridTerminalHelper.BlockListBytePosToBase64(list, BaseMerge); } } else if (argument == "release") { while (ReleaseListener.HasPendingMessage) { var msg = ReleaseListener.AcceptMessage(); if (msg.Data is string && Me.CustomName.Contains((string)msg.Data)) { var otherMerge = GridTerminalHelper.OtherMergeBlock(TopMerge); if (otherMerge != null) { otherMerge.Enabled = false; } } } } else { if (State == 0) { foreach (var welder in Welders) { welder.Enabled = true; } if (Display != null) { Display.WriteText("STATE 0: WELDING - WAITING FOR COMPLETION"); } if (TopProjector.RemainingBlocks == 0 && BaseProjector.RemainingBlocks == 0) { GraceTimer = 5; State = 1; } } else if (State == 1) { GraceTimer--; if (Display != null) { Display.WriteText($"STATE 1: WELDING GRACE PERIOD - {GraceTimer}"); } if (GraceTimer <= 0) { foreach (var welder in Welders) { welder.Enabled = false; } BaseProjector.Enabled = false; TopProjector.Enabled = false; State = 2; } } else if (State == 2) { ElevationScratchpad.Clear(); var block = GridTerminalHelper.Base64BytePosToBlockList(BaseMerge.CustomData, BaseMerge, ref ElevationScratchpad); if (ElevationScratchpad.Count == 1) { Elevation = ElevationScratchpad[0]; if (Display != null) { Display.WriteText($"ELEVATION ROTOR FOUND", true); } Elevation.Detach(); var degrees = -90f * Math.PI / 180f; DriveHinge(SmallHinge, (float)(degrees), 0.3f); DriveHinge(LargeHinge, (float)(degrees), 1f); Sweeper.TargetVelocityRPM = -10; if (Display != null) { Display.WriteText($"STATE 2: SWINGING HINGES SMALL - {SmallHinge.Angle * 180 / Math.PI} / -90 | LARGE - {LargeHinge.Angle * 180 / Math.PI} / -90"); } if (Math.Abs(SmallHinge.Angle - degrees) < 0.01 && Math.Abs(LargeHinge.Angle - degrees) < 0.01) { State = 3; } } else { if (Display != null) { Display.WriteText($"\nCRITICAL ERROR: ELEVATION ROTOR NOT FOUND", true); } } } else if (State == 3) { if (Display != null) { Display.WriteText($"STATE 3: ATTEMPTING ATTACH"); } ElevationScratchpad.Clear(); var block = GridTerminalHelper.Base64BytePosToBlockList(BaseMerge.CustomData, BaseMerge, ref ElevationScratchpad); if (ElevationScratchpad.Count == 1) { Elevation = ElevationScratchpad[0]; if (Display != null) { Display.WriteText($"ELEVATION ROTOR FOUND", true); } Elevation.Attach(); if (Elevation.IsAttached) { GridTerminalHelper.OtherMergeBlock(BaseMerge).Enabled = false; State = 4; } } else { if (Display != null) { Display.WriteText($"\nCRITICAL ERROR: ELEVATION ROTOR NOT FOUND", true); } } } else if (State == 4) { var degrees = 90f * Math.PI / 180f; DriveHinge(SmallHinge, (float)(degrees), 0.3f); if (Display != null) { Display.WriteText($"STATE 4: SWINGING SMALL HINGE - {SmallHinge.Angle * 180 / Math.PI} / 90"); } if (Math.Abs(SmallHinge.Angle - degrees) < 0.01) { State = 5; } } else if (State == 5) { if (Display != null) { Display.WriteText($"STATE 5: COMPLETE - AWAITING PICKUP"); } if (GridTerminalHelper.OtherMergeBlock(TopMerge) == null) { State = 6; GraceTimer = 5; } } else if (State == 6) { GraceTimer--; if (Display != null) { Display.WriteText($"STATE 6: DETACH GRACE PERIOD - {GraceTimer}"); } if (GraceTimer <= 0) { State = 7; } } else if (State == 7) { var degrees = 90f * Math.PI / 180f; var degrees2 = 0; DriveHinge(LargeHinge, (float)(degrees), 1f); DriveHinge(SmallHinge, (float)(degrees2), 1f); Sweeper.TargetVelocityRPM = 10; BaseProjector.Enabled = true; TopProjector.Enabled = true; if (Display != null) { Display.WriteText($"STATE 7: RESETTING SMALL - {SmallHinge.Angle * 180 / Math.PI} / 0 | LARGE - {LargeHinge.Angle * 180 / Math.PI} / 90"); } if (Math.Abs(SmallHinge.Angle - degrees2) < 0.01 && Math.Abs(LargeHinge.Angle - degrees) < 0.01) { State = 0; } } } }
public void Update() { if (!setup) { setup = true; Piston.Velocity = 0.2f; if (!Hummingbird.CheckHummingbirdComponents(ChasisMerge, ref hummingbirdConnector, ref turretRotor, ref PartScratchpad, ref status)) { return; } if (Hummingbird.CheckHummingbirdComponents(TurretMerge, ref hummingbirdConnector, ref turretRotor, ref PartScratchpad, ref status)) { turretRotor.Detach(); releaseStage = 1; Piston.Velocity = -0.2f; return; } if (turretRotor != null) { Hummingbird = Hummingbird.GetHummingbird(turretRotor, Host.Context.Terminal.GetBlockGroupWithName(Hummingbird.GroupName)); if (Hummingbird.Gats.Count == 0) { Hummingbird = null; TurretMerge.Enabled = true; return; } releaseStage = 20; turretRotor.Displacement = 0.11f; return; } } if (releaseStage > 1 && releaseStage < 20) { releaseStage++; } if (releaseStage == 5) { } else if (releaseStage == 7) { } else if (releaseStage == 8) { GridTerminalHelper.OtherMergeBlock(TurretMerge).Enabled = false; TurretMerge.Enabled = false; } else if (releaseStage == 9) { turretRotor.Attach(); } else if (releaseStage == 10) { Piston.Velocity = 0.2f; } else if (releaseStage > 11 && Piston.CurrentPosition == Piston.MaxLimit) { turretRotor.Displacement = 0.11f; Hummingbird = Hummingbird.GetHummingbird(turretRotor, Host.Context.Terminal.GetBlockGroupWithName(Hummingbird.GroupName)); } }