STNE Scripts
Verfasst von Timo am 15. Dezember 2007 - 22:04.So, hier mal eine kleine Auswahl von Scripts, die ich geschrieben habe.
Warpkern und Reservebatterie aufladen von allen Schiffen im Orbit.
Function println(text As String) {
WriteLine(text);
}
// BITTE ANPASSEN!!
Var SpielerID As Integer = DEINE_ID;
Var KolonieID As Integer = ID_DER_KOLONIE,_ÜBER_DER_DIE_SCHIFFE_STEHEN;
Var kolonie As New CMyKolonie(KolonieID);
Var schiffmanager As New CShipManager();
Var kolomanager As New CColonieManager();
kolomanager.BenutzeKolonie(KolonieID);
// Nur Schiffe im Orbit des Planeten durchgehen - andere koennten sowieso nicht beamen
Var stationsid As Integer = 0;
Var schiffe As IEnumerator;
Var schiff As CMyShip;
Var yourship As CShip;
Var ladungen As Integer;
Var lagerladungen As Integer;
Var schiffdef As CMyShipDefinition;
Var i As Integer;
Var jetztladung As Integer;
Var habschon As Boolean;
Var warAngedocktAn As Integer = 0;
// Basis heraussuchen, damit das docken und das Orbseil benutzt werden kann.
schiffe = kolonie.SRS.GetEnumerator();
While((schiffe.MoveNext()) And (stationsid = 0)) {
yourship = schiffe.Current;
If(yourship.Definition.IstRaumstation = True) {
stationsid = yourship.ShipID;
}
}
// Eben bescheidsagen, wo man am arbeiten ist
println("Starte meine Arbeit im Orbit von " & kolonie.Name);
// Alle Schiffe durchgehen und schauen, ob Handlungsbedarf besteht
schiffe.Reset(); // Spart die erneute Zuweisung
While(schiffe.MoveNext()) {
yourship = schiffe.Current;
If(yourship.UserID = SpielerID) {
schiff = New CMyShip(yourship.ShipID);
schiffdef = schiff.Definition; // Damit man herausfinden kann, ob der Schiffstyp nen WK hat
habschon = False;
// Erstmal eigene Waren erbrauchen - auf gut Glück aufladen
If(schiffdef.Warpkern AND schiff.Warpkern < 951 AND genugWarenvorhanden(schiff)) {
println(" -- " & schiff.Name & " --");
habschon = True;
println("Lade Warpkern...");
println("... von schiffseigenen Ressourcen:");
schiffmanager.BenutzeSchiff(schiff.ShipID);
schiffmanager.WarpkernNachfüllen(40);
}
// Jetzt schauen, ob noch Handlungsbedarf besteht
If(schiffdef.Warpkern AND (schiff.Warpkern < 951) AND (schiff.Lager.FreieKapazität > 4)) {
// Berechnen, wieviel in den Kern rein muss
ladungen = Math.Floor((1000 - schiff.Warpkern) / 50);
lagerladungen = Math.Floor(schiff.Lager.FreieKapazität / 5);
// Schiff hier abdocken und merken, an was es angedockt war
warAngedocktAn = schiff.AngedocktAnID;
schiffmanager.BenutzeSchiff(schiff.ShipID);
If((schiff.Definition.IstTräger = False) OR (warAngedocktAn = stationsid)) {
schiffmanager.Abdocken(); // Scheiss drauf, ob es angedockt war. Das hätte eh nur Zeit gefressen.
schiffmanager.AndockenAn(stationsid); // Pauschal andocken. Wenns nicht klappt, nicht mein Problem.
}
If(habschon = False) {
println(" -- " & schiff.Name & " --");
println("Lade Warpkern...");
habschon = True;
}
println("... vom Planeten:");
println("Freie Kapazität: " & schiff.Lager.FreieKapazität & " - Warpkern: " & schiff.Warpkern);
println("Ladungen: " & ladungen & " - Ladungen pro Schritt: " & lagerladungen);
While(ladungen > 0) {
jetztladung = Math.Min(ladungen, lagerladungen);
// TODO hier die Berechnung, ob er einen weiteren Beamvorgang schaffen wird einbauen
kolomanager.TransferiereZuSchiff(schiff.ShipID, jetztladung * 2, EBeamRessource.Antimaterie);
kolomanager.TransferiereZuSchiff(schiff.ShipID, jetztladung * 2, EBeamRessource.Deuterium);
kolomanager.TransferiereZuSchiff(schiff.ShipID, jetztladung, EBeamRessource.Dilithium);
schiffmanager.WarpkernNachfüllen(40);
ladungen = ladungen - jetztladung;
}
If(schiff.Definition.IstTräger = False) {
schiffmanager.Abdocken();
If(warAngedocktAn > - 1) {
schiffmanager.AndockenAn(warAngedocktAn);
}
}
}
If(schiff.ReserveBatterie < schiffdef.Energie) {
If(habschon = False) {
println(" -- " & schiff.Name & " --");
}
println("Lade Reservebatterie um " & (schiffdef.Energie - schiff.ReserveBatterie));
kolomanager.Werft_ReserveBatterieAufladen(schiff.ShipID, 60);
}
}
}
Function genugWarenvorhanden(schiff As CMyShip) As Boolean {
If((schiff.Lager.Menge(EWarenTyp.Antimaterie) > 1) AND (schiff.Lager.Menge(EWarenTyp.Deuterium) > 1) AND (schiff.Lager.Menge(EWarenTyp.Dilithium) > 0)) {
Return True;
} Else {
Return False;
}
}
Energieausgleich als Webscript mit Auswahlfenster
#UseInterface Web;
Function println(text As String) {
Response.Add(text);
Response.Add(New CHtmlBreak());
}
// Events abarbeiten
If (Request.Form.ContainsKey("flotte")) {
ausgleich(Request.Form.Item("flotte"));
}
// Formular ausgeben
Var form As New CHtmlForm(New CScriptUrl());
Response.Add(form);
Var table As New CTable(1);
Var row As CTableRow;
form.Add(table);
row = table.AddRow();
Var kasten As New CHtmlListBox("flotte");
row.Cells.Item(0).Add(kasten);
// Flottenliste auslesen
Var flotten As New CFlottenEnumerator();
Var flotte As CMyFlotte;
While(flotten.Next()) {
flotte = flotten.CurrentFlotte;
kasten.Add(flotte.Name, flotte.FlottenID);
}
row = table.AddRow();
row.Cells.Item(0).Add(New CHtmlSubmitButton("Ausgleichen!", "Bla"));
Function ausgleich(flottenid As Integer) {
Var Flotte As New CMyFlotte(flottenid);
Var j As Integer;
Var transfer As Integer;
Var sum As Integer;
Var durchschnitt As Integer;
Var Schiff As CMyShip;
Var ZielSchiff As CMyShip;
//Flotte.Aktion.SRS_Aktivieren( 1 );
For (Each Schiff In Flotte.Ships){
sum = (sum + Schiff.Energie);
}
durchschnitt = (sum / Flotte.Ships.Count);
println("Durchschnitt: " & CStr(durchschnitt));
For (Each Schiff In Flotte.Ships){
If(Schiff.Energie > durchschnitt){
j = 0;
While((Schiff.Energie > durchschnitt) AND (j < Flotte.Ships.Count)){
ZielSchiff = Flotte.Ships.Item(j);
If((ZielSchiff.Energie < durchschnitt) AND (Schiff.ShipID <> ZielSchiff.ShipID)){
transfer = (durchschnitt - ZielSchiff.Energie);
If(transfer > (durchschnitt - ZielSchiff.Energie)){
transfer = (durchschnitt - ZielSchiff.Energie);
}
If(transfer > 0) {
println(Schiff.Name & " --( " & transfer & " )-->> " & ZielSchiff.Name);
Schiff.Aktion.TransferiereZuSchiff(ZielSchiff.ShipID, transfer, EBeamRessource.Energie);
}
}
j = j + 1;
}
}
}
}
