- Add an extension method to get all inventories.

- Update README and TODO
This commit is contained in:
Greg Burri 2025-09-14 17:26:17 +02:00
parent 16040e5f5a
commit 169719ba4b
5 changed files with 135 additions and 28 deletions

View file

@ -26,8 +26,8 @@ namespace IngameScript
{
class Output
{
IList<IMyTextSurface> outputs;
int maxNbLines;
readonly IList<IMyTextSurface> outputs;
readonly int maxNbLines;
public Output(IList<IMyTextSurface> surfaces, int maxNbLines = 10)
{
@ -58,29 +58,41 @@ namespace IngameScript
: this(new List<IMyTextSurface> { surface }, maxNbLines)
{ }
public void Print(string text, int outputNumber = 0)
public void Print(string text, int outputNumber = -1)
{
if (this.outputs.Count() <= outputNumber)
if (outputNumber >= 0 && this.outputs.Count() <= outputNumber)
{
throw new Exception($"Output number {outputNumber} doesn't exist (number of output: {this.outputs.Count()}");
}
else
{
var output = this.outputs[outputNumber];
var currentText = output.GetText();
var lines = currentText.Split('\n');
if (lines.Count() >= this.maxNbLines)
if (outputNumber == -1)
{
output.WriteText(lines.Skip(lines.Count() - this.maxNbLines + 1).Append(text).Aggregate((a, b) => a + Environment.NewLine + b));
}
else if (lines.Count() == 0)
{
output.WriteText(text);
foreach (var output in this.outputs)
this.Print(text, output);
}
else
{
output.WriteText(Environment.NewLine + text, true);
}
this.Print(text, this.outputs[outputNumber]);
}
}
}
void Print(string text, IMyTextSurface surface)
{
var currentText = surface.GetText();
var lines = currentText.Split('\n');
if (lines.Count() >= this.maxNbLines)
{
surface.WriteText(lines.Skip(lines.Count() - this.maxNbLines + 1).Append(text).Aggregate((a, b) => a + Environment.NewLine + b));
}
else if (lines.Count() == 0)
{
surface.WriteText(text);
}
else
{
surface.WriteText(Environment.NewLine + text, true);
}
}
@ -90,15 +102,24 @@ namespace IngameScript
}
public void Display(string text, int outputNumber = 0)
public void Display(string text, int outputNumber = -1)
{
if (this.outputs.Count() <= outputNumber)
if (outputNumber >= 0 && this.outputs.Count() <= outputNumber)
{
throw new Exception($"Output number {outputNumber} doesn't exist (number of output: {this.outputs.Count()}");
}
else
{
this.outputs[outputNumber].WriteText(text);
if (outputNumber == -1)
{
foreach (var output in this.outputs)
output.WriteText(text);
}
else
{
this.outputs[outputNumber].WriteText(text);
}
}
}
}

View file

@ -1,8 +1,10 @@
using Sandbox.ModAPI.Ingame;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using VRage.Game.ModAPI.Ingame;
@ -33,12 +35,12 @@ namespace IngameScript
/// <param name="name"></param>
/// <param name="grid"></param>
/// <returns></returns>
public static IEnumerable<T> GetBlocks<T>(this IMyGridTerminalSystem gridTerminal, string name = null, IMyCubeGrid grid = null)
public static IEnumerable<T> GetBlocks<T>(this IMyGridTerminalSystem gridTerminal, string name = null, IMyCubeGrid grid = null, Func<T, bool> filter = null)
where T : class, IMyTerminalBlock
{
var l = new List<T>();
gridTerminal.GetBlocksOfType(l, (T block) =>
(name == null || block.CustomName == name) && (grid == null || block.CubeGrid == grid)
(name == null || block.CustomName == name) && (grid == null || block.CubeGrid == grid) && (filter == null || filter(block))
);
return l;
}
@ -90,5 +92,46 @@ namespace IngameScript
return new List<T>();
}
public static IEnumerable<IMyInventory> GetAllInventories(this IMyGridTerminalSystem gridTerminal, IMyCubeGrid grid = null)
{
var inventories = new List<IMyInventory>();
// Containers.
foreach (var container in gridTerminal.GetBlocks<IMyCargoContainer>(grid: grid))
inventories.Add(container.GetInventory());
// Assemblers.
foreach (var assembler in gridTerminal.GetBlocks<IMyAssembler>(grid: grid))
{
inventories.Add(assembler.InputInventory);
inventories.Add(assembler.OutputInventory);
}
// Refineries
foreach (var refinery in gridTerminal.GetBlocks<IMyRefinery>(grid: grid))
{
inventories.Add(refinery.InputInventory);
inventories.Add(refinery.OutputInventory);
}
// Connectors.
foreach (var connector in gridTerminal.GetBlocks<IMyShipConnector>(grid: grid))
inventories.Add(connector.GetInventory());
// Welders.
foreach (var welder in gridTerminal.GetBlocks<IMyShipWelder>(grid: grid))
inventories.Add(welder.GetInventory());
// Turrets.
foreach (var turret in gridTerminal.GetBlocks<IMyLargeTurretBase>(grid: grid))
inventories.Add(turret.GetInventory());
// Artillery and missile launcher.
foreach (var missileLauncher in gridTerminal.GetBlocks<IMySmallMissileLauncher>(grid: grid))
inventories.Add(missileLauncher.GetInventory());
return inventories;
}
}
}