string keyword = "SYSTEMS"; Dictionary ParseCustomData(IMyTerminalBlock block) { var settings = new Dictionary(StringComparer.OrdinalIgnoreCase); var lines = block.CustomData.Split('\n'); foreach (string rawLine in lines) { string line = rawLine.Trim(); if (string.IsNullOrWhiteSpace(line) || line.StartsWith("//") || line.StartsWith("[")) continue; int eq = line.IndexOf('='); if (eq < 0) continue; string key = line.Substring(0, eq).Trim(); string value = line.Substring(eq + 1).Trim(); if (!settings.ContainsKey(key)) settings.Add(key, value); } return settings; } public void ProgressBar(IMyTextSurface display, string name, float percent, int scale, bool keep) { int filled = (int)(percent / 100f * scale); display.WriteText(name + " [", keep); for (int i = 0; i < scale; i++) display.WriteText(i < filled ? "=" : " ", true); display.WriteText("] " + percent.ToString("0.0") + "%\n", true); } IMyProgrammableBlock me = null; IMyBlockGroup blocks = null; List batteries = new List(); List gas_tanks = new List(); List cargo_containers = new List(); List LCDs = new List(); public void Init() { blocks = GridTerminalSystem.GetBlockGroupWithName(keyword); if (blocks != null) { blocks.GetBlocksOfType(batteries); blocks.GetBlocksOfType(gas_tanks); blocks.GetBlocksOfType(cargo_containers); blocks.GetBlocksOfType(LCDs); } } public Program() { Runtime.UpdateFrequency = UpdateFrequency.Update100; me = Me; Init(); } //-------------------- MAIN ------------------------------------------------------------------------------------------------------------------------------------------ public void Main(string argument, UpdateType updateSource) { if (argument == "refresh") Init(); float power = 0; float max_power = 0; float oxygen = 0; int oxygen_count = 0; float hydrogen = 0; int hydrogen_count = 0; float cargo = 0; float max_cargo = 0; IMyInventory inv; foreach (var block in batteries) { max_power += block.MaxStoredPower; power += block.CurrentStoredPower; } foreach (var block in gas_tanks) { Echo(block.BlockDefinition.SubtypeName.ToLower()); if (block.BlockDefinition.SubtypeName.ToLower().Contains("oxygen")) { oxygen_count++; oxygen += (float)block.FilledRatio; } if (block.BlockDefinition.SubtypeName.ToLower().Contains("hydrogen")) { hydrogen_count++; hydrogen += (float)block.FilledRatio; } } foreach (var block in cargo_containers) { inv = block.GetInventory(); max_cargo += (float)inv.MaxVolume; cargo += (float)inv.CurrentVolume; } float power_percent = max_power > 0 ? (power / max_power) * 100f : 0f; float oxygen_percent = oxygen_count > 0 ? (oxygen / oxygen_count) * 100f : 0f; float hydrogen_percent = hydrogen_count > 0 ? (hydrogen / hydrogen_count) * 100f : 0f; float cargo_percent = max_cargo > 0 ? (cargo / max_cargo) * 100f : 0f; foreach (var panel in LCDs) { panel.ContentType = ContentType.TEXT_AND_IMAGE; panel.Font = "Monospace"; panel.WriteText("", false); // clear ProgressBar(panel, "Battery", power_percent, 20, true); ProgressBar(panel, "Oxygen", oxygen_percent, 20, true); ProgressBar(panel, "Hydrogen", hydrogen_percent, 20, true); ProgressBar(panel, "Cargo", cargo_percent, 20, true); } }