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