using Sandbox.Game.EntityComponents; using Sandbox.ModAPI.Ingame; using Sandbox.ModAPI.Interfaces; using SpaceEngineers.Game.ModAPI.Ingame; using System; using System.Collections; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Text; using VRage; using VRage.Collections; using VRage.Game; using VRage.Game.Components; using VRage.Game.GUI.TextPanel; using VRage.Game.ModAPI.Ingame; using VRage.Game.ModAPI.Ingame.Utilities; using VRage.Game.ObjectBuilders.Definitions; using VRageMath; namespace IngameScript { public partial class Program : MyGridProgram { MyCommandLine cli; List> jobs; Dictionary doors; int tickCount; public Program() { tickCount = 0; cli = new MyCommandLine(); jobs = new List>(); doors = new Dictionary(); List allHinges = new List(); GridTerminalSystem.GetBlocksOfType(allHinges); foreach (IMyMotorStator hinge in allHinges) { if (hinge.CustomName.StartsWith("Door")) { string doorName = hinge.CustomName.Split(' ')[0]; if (!doors.ContainsKey(doorName)) { doors[doorName] = new Door(this); } doors[doorName].AddHinge(hinge); } } Echo($"Found {doors.Keys.Count} doors."); } public void Main(string argument, UpdateType updateSource) { Echo($"index: {tickCount++}"); if (updateSource == UpdateType.Trigger || updateSource == UpdateType.Terminal) { // Create a new job cli.TryParse(argument); List doorsToControl = new List(); if (cli.ArgumentCount == 0) { Echo("No arguments passed. Controlling all doors."); foreach (Door door in doors.Values) { if (!door.Locked()) { continue; } doorsToControl.Add(door); } } for (int i = 0; i < cli.ArgumentCount; i++) { string key = "Door" + cli.Argument(i); if (!doors.ContainsKey(key)) { Echo($"Door with identifier {key} not found. Skipping."); continue; } if (!doors[key].Locked()) { Echo($"Door {key} already moving. Skipping."); continue; } doorsToControl.Add(doors[key]); } if (doorsToControl.Count == 0) { Echo("No doors found. Not creating new job."); } else { Echo("Creating new job."); if (cli.Switch("close")) jobs.Add(CloseDoors(doorsToControl)); else jobs.Add(OpenDoors(doorsToControl)); Runtime.UpdateFrequency = UpdateFrequency.Update1; } } // Process running jobs for (int i = 0; i < jobs.Count; i++) { if (!jobs[i].MoveNext()) { jobs[i].Dispose(); jobs.Remove(jobs[i]); i--; Echo("Operation Complete."); } } if (jobs.Count == 0) { Runtime.UpdateFrequency = UpdateFrequency.None; } } private IEnumerator OpenDoors(List doorsToControl) { Echo("Opening doors."); foreach (Door door in doorsToControl) { door.OpenDoor(); } return ActuateDoors(doorsToControl); } private IEnumerator CloseDoors(List doorsToControl) { Echo("Closing doors."); foreach (Door door in doorsToControl) { door.CloseDoor(); } return ActuateDoors(doorsToControl); } private IEnumerator ActuateDoors(List doorsToControl) { while (true) { Echo("Actuating doors."); bool done = true; // assume we've finished, then falsify it below foreach (Door door in doorsToControl) { if (!door.Actuate()) { done = false; } } if (done) yield break; yield return true; } } } }