From: Greg Burri Date: Fri, 22 Aug 2025 21:24:31 +0000 (+0200) Subject: Add some utility functions to find blocks and groups. X-Git-Url: https://git.euphorik.ch/index.cgi?a=commitdiff_plain;h=ea2b20b42cd2908cc8c975212da75a88e927c27d;p=SEScripts.git Add some utility functions to find blocks and groups. --- diff --git a/SECommon/Utils.cs b/SECommon/Utils.cs index 393c175..c083571 100644 --- a/SECommon/Utils.cs +++ b/SECommon/Utils.cs @@ -3,6 +3,7 @@ using Sandbox.ModAPI.Ingame; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography; using VRage.Game.ModAPI.Ingame; @@ -10,15 +11,84 @@ namespace IngameScript { static class Utils { - public static T GetBlock(this IMyGridTerminalSystem gridTerminal, string name, IMyCubeGrid grid) + /// + /// Get the first terminal block matching the given name or null if nothing is found. + /// + /// + /// + /// + /// + /// + public static T GetBlock(this IMyGridTerminalSystem gridTerminal, string name = null, IMyCubeGrid grid = null) where T: class, IMyTerminalBlock + { + return Utils.GetBlocks(gridTerminal, name, grid).FirstOrDefault(); + } + + /// + /// Get all terminal blocks matching the given name. + /// + /// + /// + /// + /// + /// + public static IEnumerable GetBlocks(this IMyGridTerminalSystem gridTerminal, string name = null, IMyCubeGrid grid = null) + where T : class, IMyTerminalBlock { var l = new List(); - gridTerminal.GetBlocksOfType(l, (T block) => block.CustomName == name && block.CubeGrid == grid); - if (l.Count > 0) - return l.First(); - else - return null; + gridTerminal.GetBlocksOfType(l, (T block) => + (name == null || block.CustomName == name) && (grid == null || block.CubeGrid == grid) + ); + return l; + } + + /// + /// Get all groups matching the given name. + /// + /// + /// + /// + /// + public static IEnumerable GetBlockGroups(this IMyGridTerminalSystem gridTerminal, string groupName = null, IMyCubeGrid grid = null) + { + var groups = new List(); + gridTerminal.GetBlockGroups( + groups, + group => + { + if (groupName != null && group.Name != groupName) + return false; + if (grid == null) + return true; + var l = new List(); + group.GetBlocks(l, block => block.CubeGrid == grid); + return l.Count > 0; + } + ); + return groups; + } + + /// + /// Get all terminal blocks owned by the first given group name. + /// + /// + /// + /// + /// + /// + public static IEnumerable GetBlocksFromGroup(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(); + group.GetBlocksOfType(l); + if (l.Count > 0) + return l; + } + + return new List(); } } } \ No newline at end of file