⚔️ Willkommen, edler Gast! ⚔️ Dies ist eine Nachricht für Gäste. Registriere dich jetzt kostenlos, um ein vollwertiges Mitglied unserer Dark Falls - Order of Knights Community zu werden! 🔹 Erstelle eigene Themen & Beiträge 🔹 Tausche dich mit anderen Rittern aus 🔹 Nutze dein persönliches Postfach für private Nachrichten Schließe dich unserer Bruderschaft an und werde Teil der Legende! 🏰🛡️ ⚔️ Oath of the Order "From shadow, we rise. Through darkness, we fight. Against oblivion, we endure. Bound by blood, sworn by steel, We are the Knights of Dark Falls."
/*
------------------------------------------------------------
    Ressourcensteuerung fuer Montageanlagen
    Version: 1.3
    Ersteller: [Ashes Vargrand]
    Beschreibung: Begrenzung der Ressourcenzufuhr in
    Montageanlagen und automatisches Verschieben
    ueberschuessiger Ressourcen in einen Zielcontainer.
    Einstellungen:
    - Maximal erlaubte Menge (pro Material): maxAmount
    - Name des Zielcontainers: containerName
    - Name des Log-LCD (optional): logLcdName
    - Intervall der Ausfuehrung in Sekunden: intervalSeconds
------------------------------------------------------------
*/
// ############### EINSTELLUNGEN ###############
const double maxAmount = 500; // Maximal erlaubte Menge pro Ressourcentyp in der Montageanlage
const string containerName = "Lagercontainer"; // Name des Containers fuer ueberschuessige Ressourcen
const string logLcdName = "LogPanel"; // Name des LCD-Bildschirms fuer Log-Ausgabe (leer lassen, um LCD zu deaktivieren)
const bool debugMode = true; // Wenn true, wird mehr Debug-Information ausgegeben
const double intervalSeconds = 10; // Intervall der Skriptausfuehrung in Sekunden
// #############################################
// Globale Variablen
IMyTextPanel logPanel;
double timeElapsed = 0;
public void Main(string argument, UpdateType updateSource)
{
    // Timer setzen, um das Skript kontinuierlich laufen zu lassen
    Runtime.UpdateFrequency = UpdateFrequency.Update10; // 10 Ticks = 0.167 Sekunden
    // Zeit seit der letzten Ausfuehrung addieren
    timeElapsed += Runtime.TimeSinceLastRun.TotalSeconds;
    // Falls das Intervall noch nicht erreicht ist, abbrechen
    if (timeElapsed < intervalSeconds)
    {
        return;
    }
    // Zeit zuruecksetzen, wenn das Intervall erreicht wurde
    timeElapsed = 0;
    // LCD initialisieren, falls konfiguriert
    if (!string.IsNullOrWhiteSpace(logLcdName))
    {
        logPanel = GridTerminalSystem.GetBlockWithName(logLcdName) as IMyTextPanel;
        if (logPanel == null)
        {
            Echo($"Fehler: Log-LCD '{logLcdName}' nicht gefunden!");
        }
        else
        {
            logPanel.WriteText("Skript gestartet\n", false); // Alte Logs ueberschreiben
        }
    }
    // Debugging starten
    WriteLog("Skript gestartet. Debug-Modus aktiv.");
    // Liste aller Assembler und des Zielcontainers holen
    var assemblers = new List<IMyAssembler>();
    GridTerminalSystem.GetBlocksOfType(assemblers);
    IMyCargoContainer targetContainer = GridTerminalSystem.GetBlockWithName(containerName) as IMyCargoContainer;
    // Fehlerbehandlung: Keine Assembler gefunden
    if (assemblers.Count == 0)
    {
        WriteLog("Fehler: Keine Assembler gefunden!");
        return;
    }
    // Fehlerbehandlung: Zielcontainer nicht gefunden
    if (targetContainer == null)
    {
        WriteLog($"Fehler: Zielcontainer '{containerName}' nicht gefunden!");
        return;
    }
    WriteLog($"Gefundene Assembler: {assemblers.Count}");
    WriteLog($"Zielcontainer '{containerName}' gefunden.");
    // Zugriff auf das Inventar des Zielcontainers
    var targetInventory = targetContainer.GetInventory();
    // Schleife ueber alle gefundenen Assembler
    foreach (var assembler in assemblers)
    {
        if (!assembler.HasInventory)
        {
            WriteLog($"{assembler.CustomName} hat kein Inventar!");
            continue;
        }
        // Zugriff auf das Inventar der Montageanlage
        var assemblerInventory = assembler.GetInventory();
        // Liste der Items im Inventar abrufen
        var items = new List<MyInventoryItem>();
        assemblerInventory.GetItems(items);
        // Ressourcen im Inventar pruefen und ueberschuessige Ressourcen verschieben
        foreach (var item in items)
        {
            string itemName = item.Type.SubtypeId;
            double itemAmount = (double)item.Amount;
            // Debug-Ausgabe fuer jede Ressource
            WriteLog($"Pruefe Ressource: {itemName}, Menge: {itemAmount}");
            // Wenn die Menge eines Items die Maximalmenge ueberschreitet
            if (itemAmount > maxAmount)
            {
                double excessAmount = itemAmount - maxAmount;
                // Versuch, das ueberschuessige Item in den Zielcontainer zu verschieben
                if (targetInventory.CanItemsBeAdded((VRage.MyFixedPoint)excessAmount, item.Type))
                {
                    assemblerInventory.TransferItemTo(targetInventory, item, (VRage.MyFixedPoint)excessAmount);
                    WriteLog($"Ueberschuessige {itemName} verschoben: {excessAmount}");
                }
                else
                {
                    WriteLog($"Fehler: Nicht genug Platz im Zielcontainer fuer {itemName}");
                }
            }
        }
    }
    WriteLog("Skript beendet.");
}
// Funktion zur Log-Ausgabe
void WriteLog(string message)
{
    Echo(message); // Ausgabe im Programmable Block
    if (logPanel != null)
    {
        logPanel.WriteText($"{message}\n", true); // An das LCD-Bildschirm anhängen
    }
}