137 lines
No EOL
5.1 KiB
C#
137 lines
No EOL
5.1 KiB
C#
|
|
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;
|
|
|
|
namespace IngameScript
|
|
{
|
|
static class Utils
|
|
{
|
|
/// <summary>
|
|
/// Get the first terminal block matching the given name or null if nothing is found.
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="gridTerminal"></param>
|
|
/// <param name="name"></param>
|
|
/// <param name="grid"></param>
|
|
/// <returns></returns>
|
|
public static T GetBlock<T>(this IMyGridTerminalSystem gridTerminal, string name = null, IMyCubeGrid grid = null)
|
|
where T: class, IMyTerminalBlock
|
|
{
|
|
return Utils.GetBlocks<T>(gridTerminal, name, grid).FirstOrDefault();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get all terminal blocks matching the given name.
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="gridTerminal"></param>
|
|
/// <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, 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) && (filter == null || filter(block))
|
|
);
|
|
return l;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get all groups matching the given name.
|
|
/// </summary>
|
|
/// <param name="gridTerminal"></param>
|
|
/// <param name="groupName"></param>
|
|
/// <param name="grid"></param>
|
|
/// <returns></returns>
|
|
public static IEnumerable<IMyBlockGroup> GetBlockGroups(this IMyGridTerminalSystem gridTerminal, string groupName = null, IMyCubeGrid grid = null)
|
|
{
|
|
var groups = new List<IMyBlockGroup>();
|
|
gridTerminal.GetBlockGroups(
|
|
groups,
|
|
group =>
|
|
{
|
|
if (groupName != null && group.Name != groupName)
|
|
return false;
|
|
if (grid == null)
|
|
return true;
|
|
var l = new List<IMyTerminalBlock>();
|
|
group.GetBlocks(l, block => block.CubeGrid == grid);
|
|
return l.Count > 0;
|
|
}
|
|
);
|
|
return groups;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get all terminal blocks owned by the first given group name.
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="gridTerminal"></param>
|
|
/// <param name="groupName"></param>
|
|
/// <param name="grid"></param>
|
|
/// <returns></returns>
|
|
public static IEnumerable<T> GetBlocksFromGroup<T>(this IMyGridTerminalSystem gridTerminal, string groupName = null, IMyCubeGrid grid = null)
|
|
where T : class, IMyTerminalBlock
|
|
{
|
|
foreach (var group in gridTerminal.GetBlockGroups(groupName, grid))
|
|
{
|
|
var l = new List<T>();
|
|
group.GetBlocksOfType(l);
|
|
if (l.Count > 0)
|
|
return l;
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
} |