The Order’s Stronghold: The Fortress of Dark Falls

⚔️ 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."

Script: Resource Overflow

  • Aufrufe Aufrufe: 130
  • Letzte Aktualisierung Letzte Aktualisierung:
  • Titel: Ressourcenmanagement-Skript für Space Engineers

    Beschreibung: Dieses Skript bietet eine automatische Lösung für das Ressourcenmanagement in Montageanlagen (Assemblern). Es verhindert, dass Assembler mit zu vielen Ressourcen überladen werden, indem es überschüssige Materialien in einen Zielcontainer verschiebt. Zusätzlich überwacht es den Prozess und gibt Statusmeldungen auf einem konfigurierbaren LCD-Bildschirm oder im Programmable Block aus.

    Hauptfunktionen:

    Ressourcenbegrenzung:

    Legt eine maximale Menge (maxAmount) für jede Ressource in den Assemblern fest.
    Überschüssige Ressourcen werden automatisch in einen Zielcontainer verschoben.

    Automatische Ausführung:

    Läuft in einer Schleife mit einstellbarem Intervall (intervalSeconds).
    Keine zusätzlichen Timer-Blöcke erforderlich.

    Status-Logs:

    Zeigt detaillierte Status- und Debug-Meldungen auf einem benannten LCD (logLcdName) und im Programmable Block an.

    Benutzerfreundliche Anpassung:

    Einstellungen wie maximale Ressourcenmenge, Zielcontainer-Name, LCD-Name und Intervall sind leicht oben im Skript konfigurierbar.

    Fehlererkennung:

    Gibt Warnungen aus, wenn Assembler oder der Zielcontainer nicht gefunden werden.
    Erkennt Platzprobleme im Zielcontainer.


    Verwendung:

    Setup:

    Erstelle einen Programmable Block und füge das Skript ein.
    Benenne den Zielcontainer entsprechend der Einstellung containerName.

    Optional: Platziere ein LCD-Bildschirm und benenne es wie in logLcdName.

    Konfiguration:

    Passe die Einstellungen oben im Skript an:

    maxAmount: Maximale Menge pro Ressourcentyp im Assembler.

    containerName: Name des Zielcontainers.

    logLcdName: Name des LCD-Bildschirms für Log-Ausgabe (optional).

    intervalSeconds: Zeitintervall zwischen den Ausführungen.

    Start:

    Führe das Skript einmal manuell aus. Es läuft dann automatisch in einer Schleife weiter.


    Code:
    /*
    ------------------------------------------------------------
        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
        }
    }
Zurück
Oben