Scripting:Flotten
Aus STNE-Wiki
Da im IRC vermehrt gefragt wurde wie ganze Flotten bearbeitet (WK füllen, bemannen, etc...) werden können, habe ich mir mal die Mühe gemacht und ein kleines Tutorial geschrieben. Ich setze die Kenntnis des Scripting:Anfängerkurses voraus.
Der Code ist in kleine Schnipsel zerteilt, damit ich in besser erklären kann. Am Ende ist er nocheinmal in kompletter Fassung, sodass Fehler beim zusammenkopieren vermieden werden.
Zu beginn benötigen wir eine Schleife, mit welcher wir die einzelnen Schiffe der Flotte anwählen können.
An dieser Stelle biete sich eine FOR (EACH var IN Array) an.
- var ist das aktuelle Schiff
- Array die Liste der Schiffe
VAR fleetID AS Integer = id der Flotte; VAR fleet AS CMyFlotte(fleetID); VAR actualShip AS CMyShip; VAR actualShipID AS integer; FOR (EACH actualShip IN fleet.Ships){ actualShipID = actualShip.ID; }
Das einzige was angegeben werden muss, ist die ID der Flotte.
Damit haben wir unseren Rahmen, mit dem wir die gesamte Flotte durchgehen können. Über die ermittelte ID ist es nun möglich Aktionen z.B. beamen durchzuführen.
Als Beispiel wollen wir die Warpkerne der Schiffe füllen. Ich gehe davon aus, dass eine Station zur Verfügung steht, auf der die Waren lagern.
Hierzu legen wir zuerst fest, von welcher Basis die Rohstoffe geholt werden:
VAR BaseID AS Integer = id der Basis;
Anschließend prüfen wir, ob der WK überhaupt leer ist. Hierzu nutzen wir eine einfache Mathematische Lösung. 2 Antimaterie + 2 Deuterium + 1 Dilithium ergeben 50 WK-Füllung Wenn wir also die vorhanden Füllung von 1000 abziehen (wir wollen schließlich wissen, wieviel reinmuss), durch 50 teilen und abrunden, so erhalten wir die Zahl der benötigten Einzelfüllungen.
menge = CInt((1000-actualShip.Warpkern)/50);
das CInt(); sorgt dafür, das wir nur ganze Zahlen bekommen. Nun wissen wir wieviele WK-Füllungen wir also benötigen, damit das Schiff möglichst voll betankt ist. Nun prüfen wir zunächst, ob die Anzahl der Füllungen gleich 0 ist, um Fehler zu vermeiden.
IF (menge > 0) { }
Wenn diese Hürde genommen ist, können wir mit dem eigentlichen Vorgang des Betankens fortfahren.
Damit wir beamen und An-/Abdocken können, müssen wir dem ShipManager sagen mit welchem Schiff er arbeiten soll.
Dies geschieht über
ShipManager.BenutzeSchiff(actualShipID);
nun können wir an die bereits definierte Basis andocken.
ShipManager.AndockenAn(BaseID);
die Waren in den entsprechenden Mengen rübertransportieren
ShipManager.TransferiereVonSchiff(BaseID, menge * 2, EBeamRessource.Deuterium); ShipManager.TransferiereVonSchiff(BaseID, menge * 2, EBeamRessource.Antimaterie); ShipManager.TransferiereVonSchiff(BaseID, menge, EBeamRessource.Dilithium);
und den Warpkern nachfüllen
ShipManager.WarpkernNachfüllen(menge);
Wieder abdocken
ShipManager.Abdocken();
Und schon ist das Schiff fertig betankt.
Nun können wir noch eine Schöne Ausgabe machen, für den Fall, dass das Schiff bereits einen vollen WK hat. Hierfür müssen wir nur einen else-Zweig in die Abfrage einbauen
else { wirtline('Schiff ' & actualShip.Name & '(' & CStr(actualShipID) & ') hat bereits einen vollen Warpkern. Füllung beträgt: ' & CStr(actualShip.Warpkern)); }
Wie angekündigt hier einmal der komplette Quellcode, inkl, einiger kurzen Kommentaren.
//Variablen festlegen VAR fleetID AS Integer = <id der Flotte>; //Flotte die abgearbeitet werden soll VAR BaseID AS Integer = <id der Basis>; //Basis, auf der die Ressourcen Lagern VAR fleet AS CMyFlotte(fleetID); VAR actualShip AS CMyShip; VAR actualShipID AS integer; VAR menge AS Integer; FOR (EACH actualShip IN fleet.Ships){ //Schleife zum durchlaufen aller Schiffe der Flotte actualShipID = actualShip.ID; //ID des Schiffes Auslesen menge = CInt((1000-actualShip.Warpkern)/50); //Warpkernfüllung ermitteln IF (menge > 0) { //Prüfen, ob der Warpkern noch zu füllen ist ShipManager.AndockenAn(BaseID); ShipManager.TransferiereVonSchiff(BaseID, menge * 2, EBeamRessource.Deuterium); ShipManager.TransferiereVonSchiff(BaseID, menge * 2, EBeamRessource.Antimaterie); ShipManager.TransferiereVonSchiff(BaseID, menge, EBeamRessource.Dilithium); ShipManager.WarpkernNachfüllen(menge); ShipManager.Abdocken(); } else { //Fehlermeldung, falls das Schiff vollen WK hat wirtline('Schiff ' & actualShip.Name & '(' & CStr(actualShipID) & ') hat bereits einen vollen Warpkern. Füllung beträgt: ' & CStr(actualShip.Warpkern)); } }
Ich hoffe, dass ganze hat ein wenig geholfen, zu zeigen, wie ganze Flotten zu bearbeiten sind. Was man verbessern könnte wäre zum Beispiel:
- Prüfen, ob die Station genug Waren hat, ansonsten das Script abrechen
- Eine schönere Ausgabe
MFG Stryke