Scripting:Flotten

Aus STNE-Wiki

Wechseln zu: Navigation, Suche

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

Persönliche Werkzeuge