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
}
}