space_engineers/DockingController/Program.cs

92 lines
3.5 KiB
C#

using Sandbox.ModAPI.Ingame;
using System.Collections.Generic;
using VRage.Game.ModAPI.Ingame.Utilities;
namespace IngameScript
{
public partial class Program : MyGridProgram, IConsoleProgram
{
public IConsole Console { get; private set; }
public MyIni Ini { get; } = new MyIni();
private IEnumerator<bool> _job = null;
private MyCommandLine _cli = new MyCommandLine();
private List<IMyShipConnector> dockingPorts = new List<IMyShipConnector>();
private List<IMyThrust> thrusters = new List<IMyThrust>();
private List<IMyGasTank> gasTanks = new List<IMyGasTank>();
private ActionGroup actionGroup;
public Program()
{
Console = new MainConsole(this, "Docking Controller");
actionGroup = new ActionGroup(Console, "docking");
// We store a list of the dockingPorts because we will only dock if one is ready to lock.
GridTerminalSystem.GetBlocksOfType(dockingPorts, blockFilter);
foreach (IMyShipConnector dockingPort in dockingPorts)
{
actionGroup.AddActionBlock("dock", 0, new BlockActionConnector(dockingPort, ConnectorAction.Connect));
actionGroup.AddActionBlock("undock", 1, new BlockActionConnector(dockingPort, ConnectorAction.Disconnect));
}
List<IMyThrust> thrusters = new List<IMyThrust>();
GridTerminalSystem.GetBlocksOfType(thrusters, blockFilter);
foreach (IMyThrust thruster in thrusters)
{
actionGroup.AddActionBlock("dock", 1, new BlockActionThruster(thruster, ThrusterAction.Disable));
actionGroup.AddActionBlock("undock", 0, new BlockActionThruster(thruster, ThrusterAction.Enable));
}
List<IMyGasTank> gasTanks = new List<IMyGasTank>();
GridTerminalSystem.GetBlocksOfType(gasTanks, blockFilter);
foreach (IMyGasTank gasTank in gasTanks)
{
actionGroup.AddActionBlock("dock", 1, new BlockActionGasTank(gasTank, GasTankAction.Stockpile));
actionGroup.AddActionBlock("undock", 0, new BlockActionGasTank(gasTank, GasTankAction.Dispense));
}
}
public void Main(string argument, UpdateType updateSource)
{
if (argument != "")
{
_cli.TryParse(argument);
if (_cli.ArgumentCount == 0)
{
Console.Print("Error: Must pass an argument, 'dock' or 'undock'.");
}
else if (_job != null)
{
Console.Print("Already performing a docking action.");
}
else
{
_job = actionGroup.RunAction(_cli.Argument(0).ToLower());
Runtime.UpdateFrequency = UpdateFrequency.Update10;
}
}
if (_job != null && !_job.MoveNext())
{
_job.Dispose();
_job = null;
Console.Print("Docking action complete.");
Runtime.UpdateFrequency = UpdateFrequency.None;
}
}
private bool blockFilter(IMyTerminalBlock block)
{
if (MyIni.HasSection(block.CustomData, "docking"))
{
Ini.TryParse(block.CustomData);
return Ini.Get("docking", "ignore").ToBoolean(false);
}
return true;
}
}
}