// What is the name of the container(s) used to store ingots string nameOfIngotStorage = "Cargo [Ingot]"; // What is the optimal amount per ingot type Dictionary targetIngots = new Dictionary() { { "Nickel", 10000 }, { "Cobalt", 10000 }, { "Stone", 20000 }, { "Magnesium", 5 }, { "Silver", 5000 }, { "Gold", 5000 }, { "Silicon", 5000 }, { "Uranium", 100 }, { "Platinum", 5000 }, { "Iron", 30000 } }; void Main() { CheckIngotStatus(); } // Function to check ingot status // and update a beacon accordingly void CheckIngotStatus() { // First line of beacon var ingotDebugString = "Ingot Status\n\r"; // Name of ingot types to workaround being unable to enumerate dictionary keys string[] ingotNames = { "Stone", "Iron", "Uranium", "Nickel", "Gold", "Silver", "Platinum", "Cobalt", "Silicon", "Magnesium" }; // Some magic numbers we use to try and align the output // because the game uses a variable width font so 'ili' is much narrower // than 'num' Dictionary stringDisplayLengths = new Dictionary() { { "Nickel", 6 }, { "Cobalt", 5 }, { "Stone", 5 }, { "Magnesium", 10 }, { "Silver", 5 }, { "Gold", 4 }, { "Silicon", 6 }, { "Uranium", 7}, { "Platinum", 7 }, { "Iron", 3 } }; // Ingot names and the total amount we have will be stored in here Dictionary currentIngots = new Dictionary() {}; // Current inventory items will be temp stored here (One type of ingot might have multiple entries) List allIngots = new List(); // Get all of the containers var ingotStorageContainers = new List(); GridTerminalSystem.SearchBlocksOfName(nameOfIngotStorage, ingotStorageContainers); // Loop through the containers for( int i = 0; i < ingotStorageContainers.Count; i++ ) { var container = ingotStorageContainers[i]; var inventoryOwner = (IMyInventoryOwner)container; var sourceInventory = inventoryOwner.GetInventory(0); var items = sourceInventory.GetItems(); // .. add each inventory item from THIS container to the full list // We're going to do it this way to avoid Space Engineers // complaining that the script is getting too complex (nested loops) allIngots.AddRange(items); } // Loop through the full list of inventory items (for all containers) for( int i = 0; i < allIngots.Count; i++ ) { // If we've seen this ingot type already... if( currentIngots.ContainsKey(allIngots[i].Content.SubtypeName) ) { // ... increase the amount we're storing currentIngots[allIngots[i].Content.SubtypeName] = currentIngots[allIngots[i].Content.SubtypeName] + (int)allIngots[i].Amount; // ... otherwise this is the first of this ingot type we've seen, so store the amount } else { currentIngots.Add(allIngots[i].Content.SubtypeName, (int)allIngots[i].Amount); } } // Now we have a Dictionary of Ingot Types and the amount we're storing, lets // put together the output which will have a new line per type in the form: // Nickel - Full (10000kg) for (int i = 0; i < ingotNames.Length; ++i) { var name = ingotNames[i]; var amount = currentIngots.ContainsKey(name) ? currentIngots[name] : 0; var target = targetIngots[name]; int percentage = (int)((float)amount/(float)target * 100); // Determine a 'level' from the % we have. Less than 10% is critical, less than 100% is low var level = ""; if( percentage < 10 ) { level = "Critical"; } else if ( percentage < 100 ) { level = "Low"; } else if ( percentage < 500 ) { level = "Full"; } else { level = "Overfull"; } // Put the output together, padding the string ingotDebugString += name.PadRight(name.Length+20-(stringDisplayLengths[name]*2),' ') + "-" + level + " (" + amount + "kg)\n\r"; } // Now lets find the first Beacon on this grid and rename it List blocks; blocks = new List(); GridTerminalSystem.GetBlocksOfType(blocks); if (blocks.Count == 0) return; IMyBeacon beacon = blocks[0] as IMyBeacon; beacon.SetCustomName(ingotDebugString); }