Scripting:Flotten

Aus STNE-Wiki

(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
 
(Der Versionsvergleich bezieht 2 dazwischenliegende Versionen mit ein.)
Zeile 13: Zeile 13:
<pre><nowiki>
<pre><nowiki>
VAR fleetID AS Integer = <id der Flotte>;
VAR fleetID AS Integer = <id der Flotte>;
-
VAR fleet AS CMyFlotte(fleetID);
+
VAR fleet AS NEW CMyFlotte(fleetID);
VAR actualShip AS CMyShip;
VAR actualShip AS CMyShip;
VAR actualShipID AS integer;
VAR actualShipID AS integer;
FOR (EACH actualShip IN fleet.Ships){
FOR (EACH actualShip IN fleet.Ships){
-
   actualShipID = actualShip.ID;
+
   actualShipID = actualShip.ShipID;
}
}
</nowiki></pre>
</nowiki></pre>
Zeile 75: Zeile 75:
VAR fleetID AS Integer = <id der Flotte>; //Flotte die abgearbeitet werden soll
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 BaseID AS Integer = <id der Basis>;  //Basis, auf der die Ressourcen Lagern
-
VAR fleet AS CMyFlotte(fleetID);
+
VAR fleet AS NEW CMyFlotte(fleetID);
VAR actualShip AS CMyShip;
VAR actualShip AS CMyShip;
VAR actualShipID AS integer;
VAR actualShipID AS integer;
VAR menge AS Integer;
VAR menge AS Integer;
FOR (EACH actualShip IN fleet.Ships){ //Schleife zum durchlaufen aller Schiffe der Flotte
FOR (EACH actualShip IN fleet.Ships){ //Schleife zum durchlaufen aller Schiffe der Flotte
-
   actualShipID = actualShip.ID;  //ID des Schiffes Auslesen
+
   actualShipID = actualShip.ShipID;  //ID des Schiffes Auslesen
   menge = CInt((1000-actualShip.Warpkern)/50); //Warpkernfüllung ermitteln
   menge = CInt((1000-actualShip.Warpkern)/50); //Warpkernfüllung ermitteln
   IF (menge > 0) {  //Prüfen, ob der Warpkern noch zu füllen ist
   IF (menge > 0) {  //Prüfen, ob der Warpkern noch zu füllen ist
 +
    ShipManager.BenutzeSchiff(actualShipID);
     ShipManager.AndockenAn(BaseID);
     ShipManager.AndockenAn(BaseID);
     ShipManager.TransferiereVonSchiff(BaseID, menge * 2, EBeamRessource.Deuterium);
     ShipManager.TransferiereVonSchiff(BaseID, menge * 2, EBeamRessource.Deuterium);

Aktuelle Version vom 30. Juli 2006, 19:12 Uhr

fertige Scripte | Anleitungen und FAQ | Überblick über die Scripting-Sektion | Hilfen zum Arbeiten im 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 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 NEW CMyFlotte(fleetID);
VAR actualShip AS CMyShip;
VAR actualShipID AS integer;
FOR (EACH actualShip IN fleet.Ships){
  actualShipID = actualShip.ShipID;
}

Das einzige was angegeben werden muss, ist die ID der Flotte. (Die <> sind wegzulassen)


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 {
  writeline('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 NEW 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.ShipID;  //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.BenutzeSchiff(actualShipID);
    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
    writeline('Schiff ' & actualShip.Name & '(' & CStr(actualShipID) & ') hat bereits einen vollen Warpkern. Füllung beträgt: ' 
    & CStr(actualShip.Warpkern));
  }
}

Damit ihr das Script nutzen könnt müsst ihr nur <ID der Flotte> und <ID der Basis> durch die jeweiligen Zahlen ersetzen. (Wie gehabt, die <> dienen nur dem hervorheben, und müssen im Quellcode nicht vorhanden sein.)


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


Wer fragen hat, der komme doch bitte in den IRC-Channel #scripting und stelle sie dort, ich bin meist anwesend.

MFG Stryke

Persönliche Werkzeuge