using Sandbox.ModAPI.Ingame; using System.Collections.Generic; using VRage.Game.ModAPI.Ingame.Utilities; namespace IngameScript { public partial class Program : MyGridProgram { private Dictionary _airlocks; private List> _jobs; private int _tickCount = 0; private MyCommandLine _cli; private Console _console; private MyIni _ini; public Program() { _ini = new MyIni(); _console = new Console(this, _ini); _cli = new MyCommandLine(); _jobs = new List>(); _airlocks = new Dictionary(); List airlockBlocks = new List(); GridTerminalSystem.GetBlocksOfType(airlockBlocks, block => _ini.ContainsSection("airlock")); foreach (IMyTerminalBlock block in airlockBlocks) { _ini.TryParse(block.CustomData, "airlock"); string airlockName = _ini.Get("airlock", "id").ToString(); if (!_airlocks.ContainsKey(airlockName)) { _airlocks[airlockName] = new Airlock(_ini, _console, airlockName); } _airlocks[airlockName].AddBlock(block); // TODO: it would be most convenient to just delete non-functional Airlocks... but maybe they're worth // keeping around for warnings. } _console.Print($"Found {_airlocks.Count} airlocks."); _console.PrintLower($"Airlock Controller\nTotal Ticks: 0"); } public void Main(string argument, UpdateType updateSource) { _console.PrintLower($"Airlock Controller\nTotal Ticks: {++_tickCount}"); if (updateSource == UpdateType.Trigger || updateSource == UpdateType.Terminal) { _cli.TryParse(argument); if (_cli.ArgumentCount == 0) { _console.Print("You must provide an airlock ID."); } else { string airlockName = _cli.Argument(0); if (!_airlocks.ContainsKey(airlockName)) _console.Print($"Airlock ID '{airlockName}' not found."); else if (!_airlocks[airlockName].Functional) _console.Print($"Airlock '{airlockName}' is not functional."); else { _jobs.Add(_airlocks[airlockName].CycleAirlock()); Runtime.UpdateFrequency |= UpdateFrequency.Update1; } } } for (int i = 0; i < _jobs.Count; i++) { IEnumerator job = _jobs[i]; if (job.MoveNext()) continue; job.Dispose(); _jobs.Remove(job); i--; _console.Print("Job Removed From Queue."); } if (_jobs.Count == 0) Runtime.UpdateFrequency = UpdateFrequency.None; } } }